mirror of
				https://github.com/torvalds/linux.git
				synced 2025-10-31 16:48:26 +02:00 
			
		
		
		
	btrfs: introduce new "rescue=ignoresuperflags" mount option
This new mount option allows the kernel to skip the super flags check, it's mostly to allow the kernel to do a rescue mount of an interrupted checksum conversion. Reviewed-by: Josef Bacik <josef@toxicpanda.com> Signed-off-by: Qu Wenruo <wqu@suse.com> Reviewed-by: David Sterba <dsterba@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
		
							parent
							
								
									169aaaf2e0
								
							
						
					
					
						commit
						32e6216512
					
				
					 4 changed files with 26 additions and 5 deletions
				
			
		|  | @ -2345,15 +2345,23 @@ int btrfs_validate_super(const struct btrfs_fs_info *fs_info, | ||||||
| 	u64 nodesize = btrfs_super_nodesize(sb); | 	u64 nodesize = btrfs_super_nodesize(sb); | ||||||
| 	u64 sectorsize = btrfs_super_sectorsize(sb); | 	u64 sectorsize = btrfs_super_sectorsize(sb); | ||||||
| 	int ret = 0; | 	int ret = 0; | ||||||
|  | 	const bool ignore_flags = btrfs_test_opt(fs_info, IGNORESUPERFLAGS); | ||||||
| 
 | 
 | ||||||
| 	if (btrfs_super_magic(sb) != BTRFS_MAGIC) { | 	if (btrfs_super_magic(sb) != BTRFS_MAGIC) { | ||||||
| 		btrfs_err(fs_info, "no valid FS found"); | 		btrfs_err(fs_info, "no valid FS found"); | ||||||
| 		ret = -EINVAL; | 		ret = -EINVAL; | ||||||
| 	} | 	} | ||||||
| 	if (btrfs_super_flags(sb) & ~BTRFS_SUPER_FLAG_SUPP) { | 	if ((btrfs_super_flags(sb) & ~BTRFS_SUPER_FLAG_SUPP)) { | ||||||
| 		btrfs_err(fs_info, "unrecognized or unsupported super flag: 0x%llx", | 		if (!ignore_flags) { | ||||||
| 				btrfs_super_flags(sb) & ~BTRFS_SUPER_FLAG_SUPP); | 			btrfs_err(fs_info, | ||||||
| 		ret = -EINVAL; | 			"unrecognized or unsupported super flag 0x%llx", | ||||||
|  | 				  btrfs_super_flags(sb) & ~BTRFS_SUPER_FLAG_SUPP); | ||||||
|  | 			ret = -EINVAL; | ||||||
|  | 		} else { | ||||||
|  | 			btrfs_info(fs_info, | ||||||
|  | 			"unrecognized or unsupported super flags: 0x%llx, ignored", | ||||||
|  | 				   btrfs_super_flags(sb) & ~BTRFS_SUPER_FLAG_SUPP); | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
| 	if (btrfs_super_root_level(sb) >= BTRFS_MAX_LEVEL) { | 	if (btrfs_super_root_level(sb) >= BTRFS_MAX_LEVEL) { | ||||||
| 		btrfs_err(fs_info, "tree_root level too big: %d >= %d", | 		btrfs_err(fs_info, "tree_root level too big: %d >= %d", | ||||||
|  |  | ||||||
|  | @ -227,6 +227,7 @@ enum { | ||||||
| 	BTRFS_MOUNT_NODISCARD			= (1UL << 29), | 	BTRFS_MOUNT_NODISCARD			= (1UL << 29), | ||||||
| 	BTRFS_MOUNT_NOSPACECACHE		= (1UL << 30), | 	BTRFS_MOUNT_NOSPACECACHE		= (1UL << 30), | ||||||
| 	BTRFS_MOUNT_IGNOREMETACSUMS		= (1UL << 31), | 	BTRFS_MOUNT_IGNOREMETACSUMS		= (1UL << 31), | ||||||
|  | 	BTRFS_MOUNT_IGNORESUPERFLAGS		= (1ULL << 32), | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  |  | ||||||
|  | @ -177,6 +177,7 @@ enum { | ||||||
| 	Opt_rescue_ignorebadroots, | 	Opt_rescue_ignorebadroots, | ||||||
| 	Opt_rescue_ignoredatacsums, | 	Opt_rescue_ignoredatacsums, | ||||||
| 	Opt_rescue_ignoremetacsums, | 	Opt_rescue_ignoremetacsums, | ||||||
|  | 	Opt_rescue_ignoresuperflags, | ||||||
| 	Opt_rescue_parameter_all, | 	Opt_rescue_parameter_all, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | @ -187,8 +188,10 @@ static const struct constant_table btrfs_parameter_rescue[] = { | ||||||
| 	{ "ibadroots", Opt_rescue_ignorebadroots }, | 	{ "ibadroots", Opt_rescue_ignorebadroots }, | ||||||
| 	{ "ignoredatacsums", Opt_rescue_ignoredatacsums }, | 	{ "ignoredatacsums", Opt_rescue_ignoredatacsums }, | ||||||
| 	{ "ignoremetacsums", Opt_rescue_ignoremetacsums}, | 	{ "ignoremetacsums", Opt_rescue_ignoremetacsums}, | ||||||
|  | 	{ "ignoresuperflags", Opt_rescue_ignoresuperflags}, | ||||||
| 	{ "idatacsums", Opt_rescue_ignoredatacsums }, | 	{ "idatacsums", Opt_rescue_ignoredatacsums }, | ||||||
| 	{ "imetacsums", Opt_rescue_ignoremetacsums}, | 	{ "imetacsums", Opt_rescue_ignoremetacsums}, | ||||||
|  | 	{ "isuperflags", Opt_rescue_ignoresuperflags}, | ||||||
| 	{ "all", Opt_rescue_parameter_all }, | 	{ "all", Opt_rescue_parameter_all }, | ||||||
| 	{} | 	{} | ||||||
| }; | }; | ||||||
|  | @ -577,9 +580,13 @@ static int btrfs_parse_param(struct fs_context *fc, struct fs_parameter *param) | ||||||
| 		case Opt_rescue_ignoremetacsums: | 		case Opt_rescue_ignoremetacsums: | ||||||
| 			btrfs_set_opt(ctx->mount_opt, IGNOREMETACSUMS); | 			btrfs_set_opt(ctx->mount_opt, IGNOREMETACSUMS); | ||||||
| 			break; | 			break; | ||||||
|  | 		case Opt_rescue_ignoresuperflags: | ||||||
|  | 			btrfs_set_opt(ctx->mount_opt, IGNORESUPERFLAGS); | ||||||
|  | 			break; | ||||||
| 		case Opt_rescue_parameter_all: | 		case Opt_rescue_parameter_all: | ||||||
| 			btrfs_set_opt(ctx->mount_opt, IGNOREDATACSUMS); | 			btrfs_set_opt(ctx->mount_opt, IGNOREDATACSUMS); | ||||||
| 			btrfs_set_opt(ctx->mount_opt, IGNOREMETACSUMS); | 			btrfs_set_opt(ctx->mount_opt, IGNOREMETACSUMS); | ||||||
|  | 			btrfs_set_opt(ctx->mount_opt, IGNORESUPERFLAGS); | ||||||
| 			btrfs_set_opt(ctx->mount_opt, IGNOREBADROOTS); | 			btrfs_set_opt(ctx->mount_opt, IGNOREBADROOTS); | ||||||
| 			btrfs_set_opt(ctx->mount_opt, NOLOGREPLAY); | 			btrfs_set_opt(ctx->mount_opt, NOLOGREPLAY); | ||||||
| 			break; | 			break; | ||||||
|  | @ -655,7 +662,8 @@ bool btrfs_check_options(const struct btrfs_fs_info *info, unsigned long *mount_ | ||||||
| 	    (check_ro_option(info, *mount_opt, BTRFS_MOUNT_NOLOGREPLAY, "nologreplay") || | 	    (check_ro_option(info, *mount_opt, BTRFS_MOUNT_NOLOGREPLAY, "nologreplay") || | ||||||
| 	     check_ro_option(info, *mount_opt, BTRFS_MOUNT_IGNOREBADROOTS, "ignorebadroots") || | 	     check_ro_option(info, *mount_opt, BTRFS_MOUNT_IGNOREBADROOTS, "ignorebadroots") || | ||||||
| 	     check_ro_option(info, *mount_opt, BTRFS_MOUNT_IGNOREDATACSUMS, "ignoredatacsums") || | 	     check_ro_option(info, *mount_opt, BTRFS_MOUNT_IGNOREDATACSUMS, "ignoredatacsums") || | ||||||
| 	     check_ro_option(info, *mount_opt, BTRFS_MOUNT_IGNOREMETACSUMS, "ignoremetacsums"))) | 	     check_ro_option(info, *mount_opt, BTRFS_MOUNT_IGNOREMETACSUMS, "ignoremetacsums") || | ||||||
|  | 	     check_ro_option(info, *mount_opt, BTRFS_MOUNT_IGNORESUPERFLAGS, "ignoresuperflags"))) | ||||||
| 		ret = false; | 		ret = false; | ||||||
| 
 | 
 | ||||||
| 	if (btrfs_fs_compat_ro(info, FREE_SPACE_TREE) && | 	if (btrfs_fs_compat_ro(info, FREE_SPACE_TREE) && | ||||||
|  | @ -1073,6 +1081,8 @@ static int btrfs_show_options(struct seq_file *seq, struct dentry *dentry) | ||||||
| 		print_rescue_option(seq, "ignoredatacsums", &printed); | 		print_rescue_option(seq, "ignoredatacsums", &printed); | ||||||
| 	if (btrfs_test_opt(info, IGNOREMETACSUMS)) | 	if (btrfs_test_opt(info, IGNOREMETACSUMS)) | ||||||
| 		print_rescue_option(seq, "ignoremetacsums", &printed); | 		print_rescue_option(seq, "ignoremetacsums", &printed); | ||||||
|  | 	if (btrfs_test_opt(info, IGNORESUPERFLAGS)) | ||||||
|  | 		print_rescue_option(seq, "ignoresuperflags", &printed); | ||||||
| 	if (btrfs_test_opt(info, FLUSHONCOMMIT)) | 	if (btrfs_test_opt(info, FLUSHONCOMMIT)) | ||||||
| 		seq_puts(seq, ",flushoncommit"); | 		seq_puts(seq, ",flushoncommit"); | ||||||
| 	if (btrfs_test_opt(info, DISCARD_SYNC)) | 	if (btrfs_test_opt(info, DISCARD_SYNC)) | ||||||
|  | @ -1431,6 +1441,7 @@ static void btrfs_emit_options(struct btrfs_fs_info *info, | ||||||
| 	btrfs_info_if_set(info, old, IGNOREBADROOTS, "ignoring bad roots"); | 	btrfs_info_if_set(info, old, IGNOREBADROOTS, "ignoring bad roots"); | ||||||
| 	btrfs_info_if_set(info, old, IGNOREDATACSUMS, "ignoring data csums"); | 	btrfs_info_if_set(info, old, IGNOREDATACSUMS, "ignoring data csums"); | ||||||
| 	btrfs_info_if_set(info, old, IGNOREMETACSUMS, "ignoring meta csums"); | 	btrfs_info_if_set(info, old, IGNOREMETACSUMS, "ignoring meta csums"); | ||||||
|  | 	btrfs_info_if_set(info, old, IGNORESUPERFLAGS, "ignoring unknown super block flags"); | ||||||
| 
 | 
 | ||||||
| 	btrfs_info_if_unset(info, old, NODATACOW, "setting datacow"); | 	btrfs_info_if_unset(info, old, NODATACOW, "setting datacow"); | ||||||
| 	btrfs_info_if_unset(info, old, SSD, "not using ssd optimizations"); | 	btrfs_info_if_unset(info, old, SSD, "not using ssd optimizations"); | ||||||
|  |  | ||||||
|  | @ -386,6 +386,7 @@ static const char *rescue_opts[] = { | ||||||
| 	"ignorebadroots", | 	"ignorebadroots", | ||||||
| 	"ignoredatacsums", | 	"ignoredatacsums", | ||||||
| 	"ignoremetacsums", | 	"ignoremetacsums", | ||||||
|  | 	"ignoresuperflags", | ||||||
| 	"all", | 	"all", | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Qu Wenruo
						Qu Wenruo