On 12/3/21 12:23 am, Josef Bacik wrote:
While helping Neal fix his broken file system I added a debug patch to
catch if we were calling btrfs_search_slot with a NULL root, and this
stack trace popped

we tried to search with a NULL root
CPU: 0 PID: 1760 Comm: mount Not tainted 5.11.0-155.nealbtrfstest.1.fc34.x86_64 
#1
Hardware name: VMware, Inc. VMware Virtual Platform/440BX Desktop Reference 
Platform, BIOS 6.00 07/22/2020
Call Trace:
  dump_stack+0x6b/0x83
  btrfs_search_slot.cold+0x11/0x1b
  ? btrfs_init_dev_replace+0x36/0x450
  btrfs_init_dev_replace+0x71/0x450
  open_ctree+0x1054/0x1610
  btrfs_mount_root.cold+0x13/0xfa
  legacy_get_tree+0x27/0x40
  vfs_get_tree+0x25/0xb0
  vfs_kern_mount.part.0+0x71/0xb0
  btrfs_mount+0x131/0x3d0
  ? legacy_get_tree+0x27/0x40
  ? btrfs_show_options+0x640/0x640
  legacy_get_tree+0x27/0x40
  vfs_get_tree+0x25/0xb0
  path_mount+0x441/0xa80
  __x64_sys_mount+0xf4/0x130
  do_syscall_64+0x33/0x40
  entry_SYSCALL_64_after_hwframe+0x44/0xa9
RIP: 0033:0x7f644730352e

Fix this by not starting the device replace stuff if we do not have a
NULL dev root.

Reported-by: Neal Gompa <ngomp...@gmail.com>
Signed-off-by: Josef Bacik <jo...@toxicpanda.com>
---
  fs/btrfs/dev-replace.c | 3 +++
  1 file changed, 3 insertions(+)

diff --git a/fs/btrfs/dev-replace.c b/fs/btrfs/dev-replace.c
index 3a9c1e046ebe..d05f73530af7 100644
--- a/fs/btrfs/dev-replace.c
+++ b/fs/btrfs/dev-replace.c
@@ -81,6 +81,9 @@ int btrfs_init_dev_replace(struct btrfs_fs_info *fs_info)
        struct btrfs_dev_replace_item *ptr;
        u64 src_devid;
+ if (!dev_root)
+               return 0;
+

 If we have a replace device target. fs_info->dev_replace->is_valid is
 0, and btrfs_dev_replace_is_ongoing() is false. And num_device count
 at various places does not include replace target device. And also
 this happens only in RO mount.

 Reviewed-by: Anand Jain <anand.j...@oracle.com>


        path = btrfs_alloc_path();
        if (!path) {
                ret = -ENOMEM;


Reply via email to