return ret;
 }
 
+static bool btrfs_skip_registration(struct btrfs_super_block *disk_super,
+                                   const char *path, dev_t devt,
+                                   bool mount_arg_dev)
+{
+       struct btrfs_fs_devices *fs_devices;
+
+       /*
+        * Do not skip device registration for mounted devices with matching
+        * maj:min but different paths. Booting without initrd relies on
+        * /dev/root initially, later replaced with the actual root device.
+        * A successful scan ensures grub2-probe selects the correct device.
+        */
+       list_for_each_entry(fs_devices, &fs_uuids, fs_list) {
+               struct btrfs_device *device;
+
+               mutex_lock(&fs_devices->device_list_mutex);
+
+               if (!fs_devices->opened) {
+                       mutex_unlock(&fs_devices->device_list_mutex);
+                       continue;
+               }
+
+               list_for_each_entry(device, &fs_devices->devices, dev_list) {
+                       if (device->bdev && (device->bdev->bd_dev == devt) &&
+                           strcmp(device->name->str, path) != 0) {
+                               mutex_unlock(&fs_devices->device_list_mutex);
+
+                               /* Do not skip registration. */
+                               return false;
+                       }
+               }
+               mutex_unlock(&fs_devices->device_list_mutex);
+       }
+
+       if (!mount_arg_dev && btrfs_super_num_devices(disk_super) == 1 &&
+           !(btrfs_super_flags(disk_super) & BTRFS_SUPER_FLAG_SEEDING))
+               return true;
+
+       return false;
+}
+
 /*
  * Look for a btrfs signature on a device. This may be called out of the mount path
  * and we are not allowed to call set_blocksize during the scan. The superblock
        struct btrfs_device *device = NULL;
        struct file *bdev_file;
        u64 bytenr, bytenr_orig;
+       dev_t devt;
        int ret;
 
        lockdep_assert_held(&uuid_mutex);
                goto error_bdev_put;
        }
 
-       if (!mount_arg_dev && btrfs_super_num_devices(disk_super) == 1 &&
-           !(btrfs_super_flags(disk_super) & BTRFS_SUPER_FLAG_SEEDING)) {
-               dev_t devt;
+       devt = file_bdev(bdev_file)->bd_dev;
+       if (btrfs_skip_registration(disk_super, path, devt, mount_arg_dev)) {
+               pr_debug("BTRFS: skip registering single non-seed device %s (%d:%d)\n",
+                         path, MAJOR(devt), MINOR(devt));
 
-               ret = lookup_bdev(path, &devt);
-               if (ret)
-                       btrfs_warn(NULL, "lookup bdev failed for path %s: %d",
-                                  path, ret);
-               else
-                       btrfs_free_stale_devices(devt, NULL);
+               btrfs_free_stale_devices(devt, NULL);
 
-       pr_debug("BTRFS: skip registering single non-seed device %s (%d:%d)\n",
-                       path, MAJOR(devt), MINOR(devt));
                device = NULL;
                goto free_disk_super;
        }