| From 5c78a5e7aa835c4f08a7c90fe02d19f95a776f29 Mon Sep 17 00:00:00 2001 |
| From: Anand Jain <anand.jain@oracle.com> |
| Date: Tue, 19 Oct 2021 18:43:38 +0800 |
| Subject: btrfs: call btrfs_check_rw_degradable only if there is a missing device |
| |
| From: Anand Jain <anand.jain@oracle.com> |
| |
| commit 5c78a5e7aa835c4f08a7c90fe02d19f95a776f29 upstream. |
| |
| In open_ctree() in btrfs_check_rw_degradable() [1], we check each block |
| group individually if at least the minimum number of devices is available |
| for that profile. If all the devices are available, then we don't have to |
| check degradable. |
| |
| [1] |
| open_ctree() |
| :: |
| 3559 if (!sb_rdonly(sb) && !btrfs_check_rw_degradable(fs_info, NULL)) { |
| |
| Also before calling btrfs_check_rw_degradable() in open_ctee() at the |
| line number shown below [2] we call btrfs_read_chunk_tree() and down to |
| add_missing_dev() to record number of missing devices. |
| |
| [2] |
| open_ctree() |
| :: |
| 3454 ret = btrfs_read_chunk_tree(fs_info); |
| |
| btrfs_read_chunk_tree() |
| read_one_chunk() / read_one_dev() |
| add_missing_dev() |
| |
| So, check if there is any missing device before btrfs_check_rw_degradable() |
| in open_ctree(). |
| |
| Also, with this the mount command could save ~16ms.[3] in the most |
| common case, that is no device is missing. |
| |
| [3] |
| 1) * 16934.96 us | btrfs_check_rw_degradable [btrfs](); |
| |
| CC: stable@vger.kernel.org # 4.19+ |
| Reviewed-by: Josef Bacik <josef@toxicpanda.com> |
| Signed-off-by: Anand Jain <anand.jain@oracle.com> |
| Reviewed-by: David Sterba <dsterba@suse.com> |
| Signed-off-by: David Sterba <dsterba@suse.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| fs/btrfs/disk-io.c | 3 ++- |
| 1 file changed, 2 insertions(+), 1 deletion(-) |
| |
| --- a/fs/btrfs/disk-io.c |
| +++ b/fs/btrfs/disk-io.c |
| @@ -3145,7 +3145,8 @@ retry_root_backup: |
| goto fail_sysfs; |
| } |
| |
| - if (!sb_rdonly(sb) && !btrfs_check_rw_degradable(fs_info, NULL)) { |
| + if (!sb_rdonly(sb) && fs_info->fs_devices->missing_devices && |
| + !btrfs_check_rw_degradable(fs_info, NULL)) { |
| btrfs_warn(fs_info, |
| "writable mount is not allowed due to too many missing devices"); |
| goto fail_sysfs; |