On Tue, Oct 10, 2017 at 07:51:11AM +0000, Qu Wenruo wrote: > Introduce --fix-dev-size option to fix device related problems.
Please don't add it to 'check', this is not the right place for the targeted fixes. -> 'btrfs rescue' > This repairing is also included in --repair, but considering the safety > and potential affected users, it's better to provide a option to fix and > only fix device size related problem to avoid full --repair. > > Reported-by: Asif Youssuff <yoa...@gmail.com> > Reported-by: Rich Rauenzahn <rraue...@gmail.com> > Signed-off-by: Qu Wenruo <quwenruo.bt...@gmx.com> > --- > Documentation/btrfs-check.asciidoc | 23 +++++++++++++++++++++++ > cmds-check.c | 28 +++++++++++++++++++++++++++- > 2 files changed, 50 insertions(+), 1 deletion(-) > > diff --git a/Documentation/btrfs-check.asciidoc > b/Documentation/btrfs-check.asciidoc > index fbf48847ac25..e45c7a457bac 100644 > --- a/Documentation/btrfs-check.asciidoc > +++ b/Documentation/btrfs-check.asciidoc > @@ -93,6 +93,29 @@ the entire free space cache. This option with 'v2' > provides an alternative > method of clearing the free space cache that doesn't require mounting the > filesystem. > > +--fix-dev-size:: > +From v4.14-rc kernels, a more restrict device size checker is introduced, > while > +old kernel doesn't strictly align its device size, so it may cause noisy > kernel > +warning for newer kernel, like: > ++ > +.... > +WARNING: CPU: 3 PID: 439 at fs/btrfs/ctree.h:1559 > btrfs_update_device+0x1c5/0x1d0 [btrfs] > +.... > ++ > +And for some case where super block total device size may mismatch with all > +devices, and the filesystem will be unable to be mounted, with kernel message > +like: > ++ > +.... > +BTRFS error (device sdb): super_total_bytes 92017859088384 mismatch with > fs_devices total_rw_bytes 92017859094528 > +.... > ++ > +This option will fix both problems by aligning all size of devices, and > +re-calculating superblock total bytes. > ++ > +Although such repairing is included in *--repair* option, considering the > +safety of *--repair*, this option is provided to suppress all other dangerous > +repairing and only fix device sizes related problems. > > DANGEROUS OPTIONS > ----------------- > diff --git a/cmds-check.c b/cmds-check.c > index 007781fa5d1b..fdb6d832eee1 100644 > --- a/cmds-check.c > +++ b/cmds-check.c > @@ -11746,6 +11746,8 @@ out: > return err; > } > > +static int reset_devs_size(struct btrfs_fs_info *fs_info); > + > static int do_check_chunks_and_extents(struct btrfs_fs_info *fs_info) > { > int ret; > @@ -11756,6 +11758,12 @@ static int do_check_chunks_and_extents(struct > btrfs_fs_info *fs_info) > ret = check_chunks_and_extents_v2(fs_info); > else > ret = check_chunks_and_extents(fs_info); > + /* Also repair device sizes if needed */ > + if (repair && !ret) { > + ret = reset_devs_size(fs_info); > + if (ret > 0) > + ret = 0; > + } > > return ret; > } > @@ -13088,6 +13096,8 @@ const char * const cmd_check_usage[] = { > "-b|--backup use the first valid backup root copy", > "--force skip mount checks, repair is not possible", > "--repair try to repair the filesystem", > + "--fix-dev-size repair device size related problem", > + " will not trigger other repair", > "--readonly run in read-only mode (default)", > "--init-csum-tree create a new CRC tree", > "--init-extent-tree create a new extent tree", > @@ -13128,6 +13138,7 @@ int cmd_check(int argc, char **argv) > int qgroups_repaired = 0; > unsigned ctree_flags = OPEN_CTREE_EXCLUSIVE; > int force = 0; > + bool fix_dev_size = false; > > while(1) { > int c; > @@ -13135,7 +13146,7 @@ int cmd_check(int argc, char **argv) > GETOPT_VAL_INIT_EXTENT, GETOPT_VAL_CHECK_CSUM, > GETOPT_VAL_READONLY, GETOPT_VAL_CHUNK_TREE, > GETOPT_VAL_MODE, GETOPT_VAL_CLEAR_SPACE_CACHE, > - GETOPT_VAL_FORCE }; > + GETOPT_VAL_FORCE, GETOPT_VAL_FIX_DEV_SIZE }; > static const struct option long_options[] = { > { "super", required_argument, NULL, 's' }, > { "repair", no_argument, NULL, GETOPT_VAL_REPAIR }, > @@ -13158,6 +13169,8 @@ int cmd_check(int argc, char **argv) > { "clear-space-cache", required_argument, NULL, > GETOPT_VAL_CLEAR_SPACE_CACHE}, > { "force", no_argument, NULL, GETOPT_VAL_FORCE }, > + { "fix-dev-size", no_argument, NULL, > + GETOPT_VAL_FIX_DEV_SIZE }, > { NULL, 0, NULL, 0} > }; > > @@ -13245,6 +13258,11 @@ int cmd_check(int argc, char **argv) > case GETOPT_VAL_FORCE: > force = 1; > break; > + case GETOPT_VAL_FIX_DEV_SIZE: > + fix_dev_size = true; > + repair = 1; > + ctree_flags |= OPEN_CTREE_WRITES; > + break; > } > } > > @@ -13371,6 +13389,14 @@ int cmd_check(int argc, char **argv) > report_qgroups(1); > goto close_out; > } > + > + if (fix_dev_size) { > + ret = reset_devs_size(info); > + if (ret > 0) > + ret = 0; > + err |= !!ret; > + goto close_out; > + } > if (subvolid) { > printf("Print extent state for subvolume %llu on %s\nUUID: > %s\n", > subvolid, argv[optind], uuidbuf); > -- > 2.14.2 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in > the body of a message to majord...@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html