Commit e3a4167c authored by David Sterba's avatar David Sterba
Browse files

btrfs: add error messages to all unrecognized mount options

Almost none of the errors stemming from a valid mount option but wrong
value prints a descriptive message which would help to identify why
mount failed. Like in the linked report:

  $ uname -r
  v4.19
  $ mount -o compress=zstd /dev/sdb /mnt
  mount: /mnt: wrong fs type, bad option, bad superblock on
  /dev/sdb, missing codepage or helper program, or other error.
  $ dmesg
  ...
  BTRFS error (device sdb): open_ctree failed

Errors caused by memory allocation failures are left out as it's not a
user error so reporting that would be confusing.

Link: https://lore.kernel.org/linux-btrfs/9c3fec36-fc61-3a33-4977-a7e207c3fa4e@gmx.de/


CC: stable@vger.kernel.org # 4.9+
Reviewed-by: default avatarQu Wenruo <wqu@suse.com>
Reviewed-by: default avatarNikolay Borisov <nborisov@suse.com>
Reviewed-by: default avatarAnand Jain <anand.jain@oracle.com>
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent 0591f040
Loading
Loading
Loading
Loading
+32 −7
Original line number Diff line number Diff line
@@ -763,6 +763,8 @@ int btrfs_parse_options(struct btrfs_fs_info *info, char *options,
				compress_force = false;
				no_compress++;
			} else {
				btrfs_err(info, "unrecognized compression value %s",
					  args[0].from);
				ret = -EINVAL;
				goto out;
			}
@@ -821,8 +823,11 @@ int btrfs_parse_options(struct btrfs_fs_info *info, char *options,
		case Opt_thread_pool:
			ret = match_int(&args[0], &intarg);
			if (ret) {
				btrfs_err(info, "unrecognized thread_pool value %s",
					  args[0].from);
				goto out;
			} else if (intarg == 0) {
				btrfs_err(info, "invalid value 0 for thread_pool");
				ret = -EINVAL;
				goto out;
			}
@@ -883,8 +888,11 @@ int btrfs_parse_options(struct btrfs_fs_info *info, char *options,
			break;
		case Opt_ratio:
			ret = match_int(&args[0], &intarg);
			if (ret)
			if (ret) {
				btrfs_err(info, "unrecognized metadata_ratio value %s",
					  args[0].from);
				goto out;
			}
			info->metadata_ratio = intarg;
			btrfs_info(info, "metadata ratio %u",
				   info->metadata_ratio);
@@ -901,6 +909,8 @@ int btrfs_parse_options(struct btrfs_fs_info *info, char *options,
				btrfs_set_and_info(info, DISCARD_ASYNC,
						   "turning on async discard");
			} else {
				btrfs_err(info, "unrecognized discard mode value %s",
					  args[0].from);
				ret = -EINVAL;
				goto out;
			}
@@ -933,6 +943,8 @@ int btrfs_parse_options(struct btrfs_fs_info *info, char *options,
				btrfs_set_and_info(info, FREE_SPACE_TREE,
						   "enabling free space tree");
			} else {
				btrfs_err(info, "unrecognized space_cache value %s",
					  args[0].from);
				ret = -EINVAL;
				goto out;
			}
@@ -1014,8 +1026,12 @@ int btrfs_parse_options(struct btrfs_fs_info *info, char *options,
			break;
		case Opt_check_integrity_print_mask:
			ret = match_int(&args[0], &intarg);
			if (ret)
			if (ret) {
				btrfs_err(info,
				"unrecognized check_integrity_print_mask value %s",
					args[0].from);
				goto out;
			}
			info->check_integrity_print_mask = intarg;
			btrfs_info(info, "check_integrity_print_mask 0x%x",
				   info->check_integrity_print_mask);
@@ -1030,13 +1046,15 @@ int btrfs_parse_options(struct btrfs_fs_info *info, char *options,
			goto out;
#endif
		case Opt_fatal_errors:
			if (strcmp(args[0].from, "panic") == 0)
			if (strcmp(args[0].from, "panic") == 0) {
				btrfs_set_opt(info->mount_opt,
					      PANIC_ON_FATAL_ERROR);
			else if (strcmp(args[0].from, "bug") == 0)
			} else if (strcmp(args[0].from, "bug") == 0) {
				btrfs_clear_opt(info->mount_opt,
					      PANIC_ON_FATAL_ERROR);
			else {
			} else {
				btrfs_err(info, "unrecognized fatal_errors value %s",
					  args[0].from);
				ret = -EINVAL;
				goto out;
			}
@@ -1044,8 +1062,12 @@ int btrfs_parse_options(struct btrfs_fs_info *info, char *options,
		case Opt_commit_interval:
			intarg = 0;
			ret = match_int(&args[0], &intarg);
			if (ret)
			if (ret) {
				btrfs_err(info, "unrecognized commit_interval value %s",
					  args[0].from);
				ret = -EINVAL;
				goto out;
			}
			if (intarg == 0) {
				btrfs_info(info,
					   "using default commit interval %us",
@@ -1059,8 +1081,11 @@ int btrfs_parse_options(struct btrfs_fs_info *info, char *options,
			break;
		case Opt_rescue:
			ret = parse_rescue_options(info, args[0].from);
			if (ret < 0)
			if (ret < 0) {
				btrfs_err(info, "unrecognized rescue value %s",
					  args[0].from);
				goto out;
			}
			break;
#ifdef CONFIG_BTRFS_DEBUG
		case Opt_fragment_all: