On 09/21/2015 10:10 AM, Qu Wenruo wrote:
Now use the btrfs_check_degraded() to do mount time degraded check.

With this patch, now we can mount with the following case:
  # mkfs.btrfs -f -m raid1 -d single /dev/sdb /dev/sdc
  # wipefs -a /dev/sdc
  # mount /dev/sdb /mnt/btrfs -o degraded
  As the single data chunk is only in sdb, so it's OK to mount as
  degraded, as missing one device is OK for RAID1.

But still fail with the following case as expected:
  # mkfs.btrfs -f -m raid1 -d single /dev/sdb /dev/sdc
  # wipefs -a /dev/sdb
  # mount /dev/sdc /mnt/btrfs -o degraded
  As the data chunk is only in sdb, so it's not OK to mount it as
  degraded.

Reported-by: Zhao Lei <zhao...@cn.fujitsu.com>
Reported-by: Anand Jain <anand.j...@oracle.com>
Signed-off-by: Qu Wenruo <quwen...@cn.fujitsu.com>
---
  fs/btrfs/disk-io.c | 18 ++++++++++--------
  1 file changed, 10 insertions(+), 8 deletions(-)

diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
index 0b658d0..d64299f 100644
--- a/fs/btrfs/disk-io.c
+++ b/fs/btrfs/disk-io.c
@@ -2858,6 +2858,16 @@ int open_ctree(struct super_block *sb,
                goto fail_tree_roots;
        }

+       ret = btrfs_check_degradable(fs_info, fs_info->sb->s_flags);
+       if (ret < 0) {
+               btrfs_error(fs_info, ret, "degraded writable mount failed");

+               goto fail_tree_roots;

same here too. if at all we are failing the mount. there is no point in doing the error handling (btrfs_error()) instead just error reporting is better (btrfs_err()).

Thanks, Anand



+       } else if (ret > 0 && !btrfs_test_opt(chunk_root, DEGRADED)) {
+               btrfs_warn(fs_info,
+                       "Some device missing, but still degraded mountable, please 
mount with -o degraded option");
+               ret = -EACCES;
+               goto fail_tree_roots;
+       }
        /*
         * keep the device that is marked to be the target device for the
         * dev_replace procedure
@@ -2947,14 +2957,6 @@ retry_root_backup:
        }
        fs_info->num_tolerated_disk_barrier_failures =
                btrfs_calc_num_tolerated_disk_barrier_failures(fs_info);
-       if (fs_info->fs_devices->missing_devices >
-            fs_info->num_tolerated_disk_barrier_failures &&
-           !(sb->s_flags & MS_RDONLY)) {
-               pr_warn("BTRFS: missing devices(%llu) exceeds the limit(%d), 
writeable mount is not allowed\n",
-                       fs_info->fs_devices->missing_devices,
-                       fs_info->num_tolerated_disk_barrier_failures);
-               goto fail_sysfs;
-       }

        fs_info->cleaner_kthread = kthread_run(cleaner_kthread, tree_root,
                                               "btrfs-cleaner");

--
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

Reply via email to