Message ID | 20180525044325.3365-3-wqu@suse.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On 05/25/2018 12:43 PM, Qu Wenruo wrote: > Refactor btrfs_check_super_valid() by the ways: > > 1) Rename it to btrfs_validate_mount_super() > Now it's more obvious when the function should be called. > > 2) Extract core check routine into __validate_super() > So later write time check can reuse it, and if needed, we could also > use __validate_super() to check each super block. > > 3) Add more comment about btrfs_validate_mount_super() > Mostly of what it doesn't check and when it should be called. > > Signed-off-by: Qu Wenruo <wqu@suse.com> Reviewed-by: Su Yue <suy.fnst@cn.fujitsu.com> > --- > fs/btrfs/disk-io.c | 29 +++++++++++++++++++++++++---- > 1 file changed, 25 insertions(+), 4 deletions(-) > > diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c > index 13c5f90995aa..b981ecc4b6f9 100644 > --- a/fs/btrfs/disk-io.c > +++ b/fs/btrfs/disk-io.c > @@ -2440,9 +2440,19 @@ static int btrfs_read_roots(struct btrfs_fs_info *fs_info) > return ret; > } > > -static int btrfs_check_super_valid(struct btrfs_fs_info *fs_info) > +/* > + * Real super block validation check > + * NOTE: super csum type and incompat features will not be checked here. > + * > + * @sb: super block to check > + * @mirror_num: the super block number to check its bytenr: > + * 0 means the primary (1st) sb, > + * 1 and 2 means 2nd and 3rd backup copy > + * -1 means to skip bytenr check > + */ > +static int __validate_super(struct btrfs_fs_info *fs_info, > + struct btrfs_super_block *sb, int mirror_num) > { > - struct btrfs_super_block *sb = fs_info->super_copy; > u64 nodesize = btrfs_super_nodesize(sb); > u64 sectorsize = btrfs_super_sectorsize(sb); > int ret = 0; > @@ -2545,7 +2555,8 @@ static int btrfs_check_super_valid(struct btrfs_fs_info *fs_info) > ret = -EINVAL; > } > > - if (btrfs_super_bytenr(sb) != BTRFS_SUPER_INFO_OFFSET) { > + if (mirror_num >= 0 && > + btrfs_super_bytenr(sb) != btrfs_sb_offset(mirror_num)) { > btrfs_err(fs_info, "super offset mismatch %llu != %u", > btrfs_super_bytenr(sb), BTRFS_SUPER_INFO_OFFSET); > ret = -EINVAL; > @@ -2589,6 +2600,16 @@ static int btrfs_check_super_valid(struct btrfs_fs_info *fs_info) > return ret; > } > > +/* > + * Check the validation of super block at mount time. > + * Some checks already done by early mount, like csum type and incompat flags > + * will be skipped. > + */ > +static int btrfs_validate_mount_super(struct btrfs_fs_info *fs_info) > +{ > + return __validate_super(fs_info, fs_info->super_copy, 0); > +} > + > int open_ctree(struct super_block *sb, > struct btrfs_fs_devices *fs_devices, > char *options) > @@ -2814,7 +2835,7 @@ int open_ctree(struct super_block *sb, > > memcpy(fs_info->fsid, fs_info->super_copy->fsid, BTRFS_FSID_SIZE); > > - ret = btrfs_check_super_valid(fs_info); > + ret = btrfs_validate_mount_super(fs_info); > if (ret) { > btrfs_err(fs_info, "superblock contains fatal errors"); > err = -EINVAL; >
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 13c5f90995aa..b981ecc4b6f9 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -2440,9 +2440,19 @@ static int btrfs_read_roots(struct btrfs_fs_info *fs_info) return ret; } -static int btrfs_check_super_valid(struct btrfs_fs_info *fs_info) +/* + * Real super block validation check + * NOTE: super csum type and incompat features will not be checked here. + * + * @sb: super block to check + * @mirror_num: the super block number to check its bytenr: + * 0 means the primary (1st) sb, + * 1 and 2 means 2nd and 3rd backup copy + * -1 means to skip bytenr check + */ +static int __validate_super(struct btrfs_fs_info *fs_info, + struct btrfs_super_block *sb, int mirror_num) { - struct btrfs_super_block *sb = fs_info->super_copy; u64 nodesize = btrfs_super_nodesize(sb); u64 sectorsize = btrfs_super_sectorsize(sb); int ret = 0; @@ -2545,7 +2555,8 @@ static int btrfs_check_super_valid(struct btrfs_fs_info *fs_info) ret = -EINVAL; } - if (btrfs_super_bytenr(sb) != BTRFS_SUPER_INFO_OFFSET) { + if (mirror_num >= 0 && + btrfs_super_bytenr(sb) != btrfs_sb_offset(mirror_num)) { btrfs_err(fs_info, "super offset mismatch %llu != %u", btrfs_super_bytenr(sb), BTRFS_SUPER_INFO_OFFSET); ret = -EINVAL; @@ -2589,6 +2600,16 @@ static int btrfs_check_super_valid(struct btrfs_fs_info *fs_info) return ret; } +/* + * Check the validation of super block at mount time. + * Some checks already done by early mount, like csum type and incompat flags + * will be skipped. + */ +static int btrfs_validate_mount_super(struct btrfs_fs_info *fs_info) +{ + return __validate_super(fs_info, fs_info->super_copy, 0); +} + int open_ctree(struct super_block *sb, struct btrfs_fs_devices *fs_devices, char *options) @@ -2814,7 +2835,7 @@ int open_ctree(struct super_block *sb, memcpy(fs_info->fsid, fs_info->super_copy->fsid, BTRFS_FSID_SIZE); - ret = btrfs_check_super_valid(fs_info); + ret = btrfs_validate_mount_super(fs_info); if (ret) { btrfs_err(fs_info, "superblock contains fatal errors"); err = -EINVAL;
Refactor btrfs_check_super_valid() by the ways: 1) Rename it to btrfs_validate_mount_super() Now it's more obvious when the function should be called. 2) Extract core check routine into __validate_super() So later write time check can reuse it, and if needed, we could also use __validate_super() to check each super block. 3) Add more comment about btrfs_validate_mount_super() Mostly of what it doesn't check and when it should be called. Signed-off-by: Qu Wenruo <wqu@suse.com> --- fs/btrfs/disk-io.c | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-)