]> git.ipfire.org Git - people/ms/linux.git/blobdiff - fs/ext2/super.c
Merge branch 'for-6.0/dax' into libnvdimm-fixes
[people/ms/linux.git] / fs / ext2 / super.c
index f6a19f6d9f6d5b73908e89289c17b7d0850cb288..252c742379cfbcad78f898a022dc96fc890d93c6 100644 (file)
@@ -171,7 +171,7 @@ static void ext2_put_super (struct super_block * sb)
        brelse (sbi->s_sbh);
        sb->s_fs_info = NULL;
        kfree(sbi->s_blockgroup_lock);
-       fs_put_dax(sbi->s_daxdev);
+       fs_put_dax(sbi->s_daxdev, NULL);
        kfree(sbi);
 }
 
@@ -296,9 +296,6 @@ static int ext2_show_options(struct seq_file *seq, struct dentry *root)
                seq_puts(seq, ",noacl");
 #endif
 
-       if (test_opt(sb, NOBH))
-               seq_puts(seq, ",nobh");
-
        if (test_opt(sb, USRQUOTA))
                seq_puts(seq, ",usrquota");
 
@@ -551,7 +548,8 @@ static int parse_options(char *options, struct super_block *sb,
                        clear_opt (opts->s_mount_opt, OLDALLOC);
                        break;
                case Opt_nobh:
-                       set_opt (opts->s_mount_opt, NOBH);
+                       ext2_msg(sb, KERN_INFO,
+                               "nobh option not supported");
                        break;
 #ifdef CONFIG_EXT2_FS_XATTR
                case Opt_user_xattr:
@@ -835,7 +833,8 @@ static int ext2_fill_super(struct super_block *sb, void *data, int silent)
        }
        sb->s_fs_info = sbi;
        sbi->s_sb_block = sb_block;
-       sbi->s_daxdev = fs_dax_get_by_bdev(sb->s_bdev, &sbi->s_dax_part_off);
+       sbi->s_daxdev = fs_dax_get_by_bdev(sb->s_bdev, &sbi->s_dax_part_off,
+                                          NULL, NULL);
 
        spin_lock_init(&sbi->s_lock);
        ret = -EINVAL;
@@ -1059,9 +1058,10 @@ static int ext2_fill_super(struct super_block *sb, void *data, int silent)
                        sbi->s_frags_per_group);
                goto failed_mount;
        }
-       if (sbi->s_inodes_per_group > sb->s_blocksize * 8) {
+       if (sbi->s_inodes_per_group < sbi->s_inodes_per_block ||
+           sbi->s_inodes_per_group > sb->s_blocksize * 8) {
                ext2_msg(sb, KERN_ERR,
-                       "error: #inodes per group too big: %lu",
+                       "error: invalid #inodes per group: %lu",
                        sbi->s_inodes_per_group);
                goto failed_mount;
        }
@@ -1071,6 +1071,13 @@ static int ext2_fill_super(struct super_block *sb, void *data, int silent)
        sbi->s_groups_count = ((le32_to_cpu(es->s_blocks_count) -
                                le32_to_cpu(es->s_first_data_block) - 1)
                                        / EXT2_BLOCKS_PER_GROUP(sb)) + 1;
+       if ((u64)sbi->s_groups_count * sbi->s_inodes_per_group !=
+           le32_to_cpu(es->s_inodes_count)) {
+               ext2_msg(sb, KERN_ERR, "error: invalid #inodes: %u vs computed %llu",
+                        le32_to_cpu(es->s_inodes_count),
+                        (u64)sbi->s_groups_count * sbi->s_inodes_per_group);
+               goto failed_mount;
+       }
        db_count = (sbi->s_groups_count + EXT2_DESC_PER_BLOCK(sb) - 1) /
                   EXT2_DESC_PER_BLOCK(sb);
        sbi->s_group_desc = kmalloc_array(db_count,
@@ -1204,7 +1211,7 @@ failed_mount_group_desc:
 failed_mount:
        brelse(bh);
 failed_sbi:
-       fs_put_dax(sbi->s_daxdev);
+       fs_put_dax(sbi->s_daxdev, NULL);
        sb->s_fs_info = NULL;
        kfree(sbi->s_blockgroup_lock);
        kfree(sbi);
@@ -1490,8 +1497,7 @@ static ssize_t ext2_quota_read(struct super_block *sb, int type, char *data,
                len = i_size-off;
        toread = len;
        while (toread > 0) {
-               tocopy = sb->s_blocksize - offset < toread ?
-                               sb->s_blocksize - offset : toread;
+               tocopy = min_t(size_t, sb->s_blocksize - offset, toread);
 
                tmp_bh.b_state = 0;
                tmp_bh.b_size = sb->s_blocksize;
@@ -1529,8 +1535,7 @@ static ssize_t ext2_quota_write(struct super_block *sb, int type,
        struct buffer_head *bh;
 
        while (towrite > 0) {
-               tocopy = sb->s_blocksize - offset < towrite ?
-                               sb->s_blocksize - offset : towrite;
+               tocopy = min_t(size_t, sb->s_blocksize - offset, towrite);
 
                tmp_bh.b_state = 0;
                tmp_bh.b_size = sb->s_blocksize;