Re: [PATCH V5 0/4] btrf_show_devname related fixes
From: Anand Jain <hidden>
Date: 2021-08-30 22:41:46
Ping. This patchset is fixing a bug reported by btrfs/238. Here I am proposing to remove traversing the device list in btrfs_show_devname(), instead use device->name as stored in fs_devices::latest_dev. Kindly review/comment. Thx, Anand On 24/08/2021 13:05, Anand Jain wrote:
v5: Patches reorged. Patch (btrfs: consolidate device_list_mutex in prepare_sprout to its parent) moved into a new set as it has a dependency on an older patch in the ML. Change log updated. v4: Fix unrelated changes v3: Add missing rcu_lock in show_devname v2: Use latest_dev so that device path is also shown Su Yue reported [1] warn() as a result of a race between the following two threads, Thread-A: function stack leading to btrfs_prepare_sprout() and Thread-B: function stack leading to btrfs_show_devname() [1] https://patchwork.kernel.org/project/linux-btrfs/patch/20210818041944.5793-1-l@damenly.su/ While btrfs_prepare_sprout() moves the fs_devices::devices into fs_devices::seed_list, the btrfs_show_devname searched for the devices and found none, leading to the warning as in [1] (above). The btrfs_prepare_sprout() uses device_list_mutex however btrfs_show_devname() don't and, the device_list_mutex in btrfs_show_devname() was removed by the patch 88c14590cdd6 (btrfs: use RCU in btrfs_show_devname for device list traversal) for the perforamcne reasons. This series does not intend to reintroduce the device_list_mutex in btrfs_prepare_sprout() but instead saves the pointer to btrfs_devices in the fs_devices::latest_dev so that btrfs_show_devname() can use it. patch 1 converts fs_devices::latest_bdev type from struct block_device to struct btrfs_device and renames it to latest_dev patch 2 btrfs_show_devname() uses the fs_devices::latest_dev::name to show the device path in the /proc/self/mounts patch 3 fixes a stale latest_dev pointer after the sprout operation patch 4 fixes an old comment about the function btrfs_show_devname() Anand Jain (4): btrfs: convert latest_bdev type to struct btrfs_device and rename btrfs: use latest_dev in btrfs_show_devname btrfs: update latest_dev when we sprout btrfs: fix comment about the btrfs_show_devname fs/btrfs/disk-io.c | 6 +++--- fs/btrfs/extent_io.c | 2 +- fs/btrfs/inode.c | 2 +- fs/btrfs/super.c | 26 ++++---------------------- fs/btrfs/volumes.c | 17 ++++++++--------- fs/btrfs/volumes.h | 2 +- 6 files changed, 18 insertions(+), 37 deletions(-)