Skip to content

Commit 7130098

Browse files
committed
Merge tag 'ext4_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4
Pull ext4 updates from Ted Ts'o: "Add support for the CSUM_SEED feature which will allow future userspace utilities to change the file system's UUID without rewriting all of the file system metadata. A number of miscellaneous fixes, the most significant of which are in the ext4 encryption support. Anyone wishing to use the encryption feature should backport all of the ext4 crypto patches up to 4.4 to get fixes to a memory leak and file system corruption bug. There are also cleanups in ext4's feature test macros and in ext4's sysfs support code" * tag 'ext4_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4: (26 commits) fs/ext4: remove unnecessary new_valid_dev check ext4: fix abs() usage in ext4_mb_check_group_pa ext4: do not allow journal_opts for fs w/o journal ext4: explicit mount options parsing cleanup ext4, jbd2: ensure entering into panic after recording an error in superblock [PATCH] fix calculation of meta_bg descriptor backups ext4: fix potential use after free in __ext4_journal_stop jbd2: fix checkpoint list cleanup ext4: fix xfstest generic/269 double revoked buffer bug with bigalloc ext4: make the bitmap read routines return real error codes jbd2: clean up feature test macros with predicate functions ext4: clean up feature test macros with predicate functions ext4: call out CRC and corruption errors with specific error codes ext4: store checksum seed in superblock ext4: reserve code points for the project quota feature ext4: promote ext4 over ext2 in the default probe order jbd2: gate checksum calculations on crc driver presence, not sb flags ext4: use private version of page_zero_new_buffers() for data=journal mode ext4 crypto: fix bugs in ext4_encrypted_zeroout() ext4 crypto: replace some BUG_ON()'s with error checks ...
2 parents 9cf5c09 + be69e1c commit 7130098

38 files changed

+1279
-997
lines changed

fs/Makefile

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,11 @@ obj-$(CONFIG_DLM) += dlm/
6363
# Do not add any filesystems before this line
6464
obj-$(CONFIG_FSCACHE) += fscache/
6565
obj-$(CONFIG_REISERFS_FS) += reiserfs/
66-
obj-$(CONFIG_EXT2_FS) += ext2/
67-
# We place ext4 after ext2 so plain ext2 root fs's are mounted using ext2
68-
# unless explicitly requested by rootfstype
6966
obj-$(CONFIG_EXT4_FS) += ext4/
67+
# We place ext4 before ext2 so that clean ext3 root fs's do NOT mount using the
68+
# ext2 driver, which doesn't know about journalling! Explicitly request ext2
69+
# by giving the rootfstype= parameter.
70+
obj-$(CONFIG_EXT2_FS) += ext2/
7071
obj-$(CONFIG_JBD2) += jbd2/
7172
obj-$(CONFIG_CRAMFS) += cramfs/
7273
obj-$(CONFIG_SQUASHFS) += squashfs/

fs/ext4/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ ext4-y := balloc.o bitmap.o dir.o file.o fsync.o ialloc.o inode.o page-io.o \
88
ioctl.o namei.o super.o symlink.o hash.o resize.o extents.o \
99
ext4_jbd2.o migrate.o mballoc.o block_validity.o move_extent.o \
1010
mmp.o indirect.o extents_status.o xattr.o xattr_user.o \
11-
xattr_trusted.o inline.o readpage.o
11+
xattr_trusted.o inline.o readpage.o sysfs.o
1212

1313
ext4-$(CONFIG_EXT4_FS_POSIX_ACL) += acl.o
1414
ext4-$(CONFIG_EXT4_FS_SECURITY) += xattr_security.o

fs/ext4/balloc.c

Lines changed: 49 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,7 @@ static int ext4_init_block_bitmap(struct super_block *sb,
191191
/* If checksum is bad mark all blocks used to prevent allocation
192192
* essentially implementing a per-group read-only flag. */
193193
if (!ext4_group_desc_csum_verify(sb, block_group, gdp)) {
194+
ext4_error(sb, "Checksum bad for group %u", block_group);
194195
grp = ext4_get_group_info(sb, block_group);
195196
if (!EXT4_MB_GRP_BBITMAP_CORRUPT(grp))
196197
percpu_counter_sub(&sbi->s_freeclusters_counter,
@@ -203,7 +204,7 @@ static int ext4_init_block_bitmap(struct super_block *sb,
203204
count);
204205
}
205206
set_bit(EXT4_GROUP_INFO_IBITMAP_CORRUPT_BIT, &grp->bb_state);
206-
return -EIO;
207+
return -EFSBADCRC;
207208
}
208209
memset(bh->b_data, 0, sb->s_blocksize);
209210

@@ -213,7 +214,7 @@ static int ext4_init_block_bitmap(struct super_block *sb,
213214

214215
start = ext4_group_first_block_no(sb, block_group);
215216

216-
if (EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_FLEX_BG))
217+
if (ext4_has_feature_flex_bg(sb))
217218
flex_bg = 1;
218219

219220
/* Set bits for block and inode bitmaps, and inode table */
@@ -322,7 +323,7 @@ static ext4_fsblk_t ext4_valid_block_bitmap(struct super_block *sb,
322323
ext4_fsblk_t blk;
323324
ext4_fsblk_t group_first_block;
324325

325-
if (EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_FLEX_BG)) {
326+
if (ext4_has_feature_flex_bg(sb)) {
326327
/* with FLEX_BG, the inode/block bitmaps and itable
327328
* blocks may not be in the group at all
328329
* so the bitmap validation will be skipped for those groups
@@ -360,42 +361,45 @@ static ext4_fsblk_t ext4_valid_block_bitmap(struct super_block *sb,
360361
return 0;
361362
}
362363

363-
static void ext4_validate_block_bitmap(struct super_block *sb,
364-
struct ext4_group_desc *desc,
365-
ext4_group_t block_group,
366-
struct buffer_head *bh)
364+
static int ext4_validate_block_bitmap(struct super_block *sb,
365+
struct ext4_group_desc *desc,
366+
ext4_group_t block_group,
367+
struct buffer_head *bh)
367368
{
368369
ext4_fsblk_t blk;
369370
struct ext4_group_info *grp = ext4_get_group_info(sb, block_group);
370371
struct ext4_sb_info *sbi = EXT4_SB(sb);
371372

372-
if (buffer_verified(bh) || EXT4_MB_GRP_BBITMAP_CORRUPT(grp))
373-
return;
373+
if (buffer_verified(bh))
374+
return 0;
375+
if (EXT4_MB_GRP_BBITMAP_CORRUPT(grp))
376+
return -EFSCORRUPTED;
374377

375378
ext4_lock_group(sb, block_group);
376-
blk = ext4_valid_block_bitmap(sb, desc, block_group, bh);
377-
if (unlikely(blk != 0)) {
379+
if (unlikely(!ext4_block_bitmap_csum_verify(sb, block_group,
380+
desc, bh))) {
378381
ext4_unlock_group(sb, block_group);
379-
ext4_error(sb, "bg %u: block %llu: invalid block bitmap",
380-
block_group, blk);
382+
ext4_error(sb, "bg %u: bad block bitmap checksum", block_group);
381383
if (!EXT4_MB_GRP_BBITMAP_CORRUPT(grp))
382384
percpu_counter_sub(&sbi->s_freeclusters_counter,
383385
grp->bb_free);
384386
set_bit(EXT4_GROUP_INFO_BBITMAP_CORRUPT_BIT, &grp->bb_state);
385-
return;
387+
return -EFSBADCRC;
386388
}
387-
if (unlikely(!ext4_block_bitmap_csum_verify(sb, block_group,
388-
desc, bh))) {
389+
blk = ext4_valid_block_bitmap(sb, desc, block_group, bh);
390+
if (unlikely(blk != 0)) {
389391
ext4_unlock_group(sb, block_group);
390-
ext4_error(sb, "bg %u: bad block bitmap checksum", block_group);
392+
ext4_error(sb, "bg %u: block %llu: invalid block bitmap",
393+
block_group, blk);
391394
if (!EXT4_MB_GRP_BBITMAP_CORRUPT(grp))
392395
percpu_counter_sub(&sbi->s_freeclusters_counter,
393396
grp->bb_free);
394397
set_bit(EXT4_GROUP_INFO_BBITMAP_CORRUPT_BIT, &grp->bb_state);
395-
return;
398+
return -EFSCORRUPTED;
396399
}
397400
set_buffer_verified(bh);
398401
ext4_unlock_group(sb, block_group);
402+
return 0;
399403
}
400404

401405
/**
@@ -414,17 +418,18 @@ ext4_read_block_bitmap_nowait(struct super_block *sb, ext4_group_t block_group)
414418
struct ext4_group_desc *desc;
415419
struct buffer_head *bh;
416420
ext4_fsblk_t bitmap_blk;
421+
int err;
417422

418423
desc = ext4_get_group_desc(sb, block_group, NULL);
419424
if (!desc)
420-
return NULL;
425+
return ERR_PTR(-EFSCORRUPTED);
421426
bitmap_blk = ext4_block_bitmap(sb, desc);
422427
bh = sb_getblk(sb, bitmap_blk);
423428
if (unlikely(!bh)) {
424429
ext4_error(sb, "Cannot get buffer for block bitmap - "
425430
"block_group = %u, block_bitmap = %llu",
426431
block_group, bitmap_blk);
427-
return NULL;
432+
return ERR_PTR(-ENOMEM);
428433
}
429434

430435
if (bitmap_uptodate(bh))
@@ -437,15 +442,14 @@ ext4_read_block_bitmap_nowait(struct super_block *sb, ext4_group_t block_group)
437442
}
438443
ext4_lock_group(sb, block_group);
439444
if (desc->bg_flags & cpu_to_le16(EXT4_BG_BLOCK_UNINIT)) {
440-
int err;
441445

442446
err = ext4_init_block_bitmap(sb, bh, block_group, desc);
443447
set_bitmap_uptodate(bh);
444448
set_buffer_uptodate(bh);
445449
ext4_unlock_group(sb, block_group);
446450
unlock_buffer(bh);
447451
if (err)
448-
ext4_error(sb, "Checksum bad for grp %u", block_group);
452+
goto out;
449453
goto verify;
450454
}
451455
ext4_unlock_group(sb, block_group);
@@ -468,11 +472,13 @@ ext4_read_block_bitmap_nowait(struct super_block *sb, ext4_group_t block_group)
468472
submit_bh(READ | REQ_META | REQ_PRIO, bh);
469473
return bh;
470474
verify:
471-
ext4_validate_block_bitmap(sb, desc, block_group, bh);
472-
if (buffer_verified(bh))
473-
return bh;
475+
err = ext4_validate_block_bitmap(sb, desc, block_group, bh);
476+
if (err)
477+
goto out;
478+
return bh;
479+
out:
474480
put_bh(bh);
475-
return NULL;
481+
return ERR_PTR(err);
476482
}
477483

478484
/* Returns 0 on success, 1 on error */
@@ -485,32 +491,32 @@ int ext4_wait_block_bitmap(struct super_block *sb, ext4_group_t block_group,
485491
return 0;
486492
desc = ext4_get_group_desc(sb, block_group, NULL);
487493
if (!desc)
488-
return 1;
494+
return -EFSCORRUPTED;
489495
wait_on_buffer(bh);
490496
if (!buffer_uptodate(bh)) {
491497
ext4_error(sb, "Cannot read block bitmap - "
492498
"block_group = %u, block_bitmap = %llu",
493499
block_group, (unsigned long long) bh->b_blocknr);
494-
return 1;
500+
return -EIO;
495501
}
496502
clear_buffer_new(bh);
497503
/* Panic or remount fs read-only if block bitmap is invalid */
498-
ext4_validate_block_bitmap(sb, desc, block_group, bh);
499-
/* ...but check for error just in case errors=continue. */
500-
return !buffer_verified(bh);
504+
return ext4_validate_block_bitmap(sb, desc, block_group, bh);
501505
}
502506

503507
struct buffer_head *
504508
ext4_read_block_bitmap(struct super_block *sb, ext4_group_t block_group)
505509
{
506510
struct buffer_head *bh;
511+
int err;
507512

508513
bh = ext4_read_block_bitmap_nowait(sb, block_group);
509-
if (!bh)
510-
return NULL;
511-
if (ext4_wait_block_bitmap(sb, block_group, bh)) {
514+
if (IS_ERR(bh))
515+
return bh;
516+
err = ext4_wait_block_bitmap(sb, block_group, bh);
517+
if (err) {
512518
put_bh(bh);
513-
return NULL;
519+
return ERR_PTR(err);
514520
}
515521
return bh;
516522
}
@@ -681,8 +687,10 @@ ext4_fsblk_t ext4_count_free_clusters(struct super_block *sb)
681687
desc_count += ext4_free_group_clusters(sb, gdp);
682688
brelse(bitmap_bh);
683689
bitmap_bh = ext4_read_block_bitmap(sb, i);
684-
if (bitmap_bh == NULL)
690+
if (IS_ERR(bitmap_bh)) {
691+
bitmap_bh = NULL;
685692
continue;
693+
}
686694

687695
x = ext4_count_free(bitmap_bh->b_data,
688696
EXT4_CLUSTERS_PER_GROUP(sb) / 8);
@@ -740,14 +748,13 @@ int ext4_bg_has_super(struct super_block *sb, ext4_group_t group)
740748

741749
if (group == 0)
742750
return 1;
743-
if (EXT4_HAS_COMPAT_FEATURE(sb, EXT4_FEATURE_COMPAT_SPARSE_SUPER2)) {
751+
if (ext4_has_feature_sparse_super2(sb)) {
744752
if (group == le32_to_cpu(es->s_backup_bgs[0]) ||
745753
group == le32_to_cpu(es->s_backup_bgs[1]))
746754
return 1;
747755
return 0;
748756
}
749-
if ((group <= 1) || !EXT4_HAS_RO_COMPAT_FEATURE(sb,
750-
EXT4_FEATURE_RO_COMPAT_SPARSE_SUPER))
757+
if ((group <= 1) || !ext4_has_feature_sparse_super(sb))
751758
return 1;
752759
if (!(group & 1))
753760
return 0;
@@ -776,7 +783,7 @@ static unsigned long ext4_bg_num_gdb_nometa(struct super_block *sb,
776783
if (!ext4_bg_has_super(sb, group))
777784
return 0;
778785

779-
if (EXT4_HAS_INCOMPAT_FEATURE(sb,EXT4_FEATURE_INCOMPAT_META_BG))
786+
if (ext4_has_feature_meta_bg(sb))
780787
return le32_to_cpu(EXT4_SB(sb)->s_es->s_first_meta_bg);
781788
else
782789
return EXT4_SB(sb)->s_gdb_count;
@@ -797,8 +804,7 @@ unsigned long ext4_bg_num_gdb(struct super_block *sb, ext4_group_t group)
797804
le32_to_cpu(EXT4_SB(sb)->s_es->s_first_meta_bg);
798805
unsigned long metagroup = group / EXT4_DESC_PER_BLOCK(sb);
799806

800-
if (!EXT4_HAS_INCOMPAT_FEATURE(sb,EXT4_FEATURE_INCOMPAT_META_BG) ||
801-
metagroup < first_meta_bg)
807+
if (!ext4_has_feature_meta_bg(sb) || metagroup < first_meta_bg)
802808
return ext4_bg_num_gdb_nometa(sb, group);
803809

804810
return ext4_bg_num_gdb_meta(sb,group);
@@ -818,7 +824,7 @@ static unsigned ext4_num_base_meta_clusters(struct super_block *sb,
818824
/* Check for superblock and gdt backups in this group */
819825
num = ext4_bg_has_super(sb, block_group);
820826

821-
if (!EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_META_BG) ||
827+
if (!ext4_has_feature_meta_bg(sb) ||
822828
block_group < le32_to_cpu(sbi->s_es->s_first_meta_bg) *
823829
sbi->s_desc_per_block) {
824830
if (num) {

fs/ext4/block_validity.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,7 @@ int ext4_check_blockref(const char *function, unsigned int line,
234234
es->s_last_error_block = cpu_to_le64(blk);
235235
ext4_error_inode(inode, function, line, blk,
236236
"invalid block");
237-
return -EIO;
237+
return -EFSCORRUPTED;
238238
}
239239
}
240240
return 0;

fs/ext4/crypto.c

Lines changed: 24 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -253,8 +253,7 @@ typedef enum {
253253
EXT4_ENCRYPT,
254254
} ext4_direction_t;
255255

256-
static int ext4_page_crypto(struct ext4_crypto_ctx *ctx,
257-
struct inode *inode,
256+
static int ext4_page_crypto(struct inode *inode,
258257
ext4_direction_t rw,
259258
pgoff_t index,
260259
struct page *src_page,
@@ -296,7 +295,6 @@ static int ext4_page_crypto(struct ext4_crypto_ctx *ctx,
296295
else
297296
res = crypto_ablkcipher_encrypt(req);
298297
if (res == -EINPROGRESS || res == -EBUSY) {
299-
BUG_ON(req->base.data != &ecr);
300298
wait_for_completion(&ecr.completion);
301299
res = ecr.res;
302300
}
@@ -353,7 +351,7 @@ struct page *ext4_encrypt(struct inode *inode,
353351
if (IS_ERR(ciphertext_page))
354352
goto errout;
355353
ctx->w.control_page = plaintext_page;
356-
err = ext4_page_crypto(ctx, inode, EXT4_ENCRYPT, plaintext_page->index,
354+
err = ext4_page_crypto(inode, EXT4_ENCRYPT, plaintext_page->index,
357355
plaintext_page, ciphertext_page);
358356
if (err) {
359357
ciphertext_page = ERR_PTR(err);
@@ -378,31 +376,14 @@ struct page *ext4_encrypt(struct inode *inode,
378376
*
379377
* Return: Zero on success, non-zero otherwise.
380378
*/
381-
int ext4_decrypt(struct ext4_crypto_ctx *ctx, struct page *page)
379+
int ext4_decrypt(struct page *page)
382380
{
383381
BUG_ON(!PageLocked(page));
384382

385-
return ext4_page_crypto(ctx, page->mapping->host,
383+
return ext4_page_crypto(page->mapping->host,
386384
EXT4_DECRYPT, page->index, page, page);
387385
}
388386

389-
/*
390-
* Convenience function which takes care of allocating and
391-
* deallocating the encryption context
392-
*/
393-
int ext4_decrypt_one(struct inode *inode, struct page *page)
394-
{
395-
int ret;
396-
397-
struct ext4_crypto_ctx *ctx = ext4_get_crypto_ctx(inode);
398-
399-
if (IS_ERR(ctx))
400-
return PTR_ERR(ctx);
401-
ret = ext4_decrypt(ctx, page);
402-
ext4_release_crypto_ctx(ctx);
403-
return ret;
404-
}
405-
406387
int ext4_encrypted_zeroout(struct inode *inode, struct ext4_extent *ex)
407388
{
408389
struct ext4_crypto_ctx *ctx;
@@ -411,7 +392,13 @@ int ext4_encrypted_zeroout(struct inode *inode, struct ext4_extent *ex)
411392
ext4_lblk_t lblk = ex->ee_block;
412393
ext4_fsblk_t pblk = ext4_ext_pblock(ex);
413394
unsigned int len = ext4_ext_get_actual_len(ex);
414-
int err = 0;
395+
int ret, err = 0;
396+
397+
#if 0
398+
ext4_msg(inode->i_sb, KERN_CRIT,
399+
"ext4_encrypted_zeroout ino %lu lblk %u len %u",
400+
(unsigned long) inode->i_ino, lblk, len);
401+
#endif
415402

416403
BUG_ON(inode->i_sb->s_blocksize != PAGE_CACHE_SIZE);
417404

@@ -426,7 +413,7 @@ int ext4_encrypted_zeroout(struct inode *inode, struct ext4_extent *ex)
426413
}
427414

428415
while (len--) {
429-
err = ext4_page_crypto(ctx, inode, EXT4_ENCRYPT, lblk,
416+
err = ext4_page_crypto(inode, EXT4_ENCRYPT, lblk,
430417
ZERO_PAGE(0), ciphertext_page);
431418
if (err)
432419
goto errout;
@@ -437,17 +424,26 @@ int ext4_encrypted_zeroout(struct inode *inode, struct ext4_extent *ex)
437424
goto errout;
438425
}
439426
bio->bi_bdev = inode->i_sb->s_bdev;
440-
bio->bi_iter.bi_sector = pblk;
441-
err = bio_add_page(bio, ciphertext_page,
427+
bio->bi_iter.bi_sector =
428+
pblk << (inode->i_sb->s_blocksize_bits - 9);
429+
ret = bio_add_page(bio, ciphertext_page,
442430
inode->i_sb->s_blocksize, 0);
443-
if (err) {
431+
if (ret != inode->i_sb->s_blocksize) {
432+
/* should never happen! */
433+
ext4_msg(inode->i_sb, KERN_ERR,
434+
"bio_add_page failed: %d", ret);
435+
WARN_ON(1);
444436
bio_put(bio);
437+
err = -EIO;
445438
goto errout;
446439
}
447440
err = submit_bio_wait(WRITE, bio);
441+
if ((err == 0) && bio->bi_error)
442+
err = -EIO;
448443
bio_put(bio);
449444
if (err)
450445
goto errout;
446+
lblk++; pblk++;
451447
}
452448
err = 0;
453449
errout:

0 commit comments

Comments
 (0)