• Anand Jain's avatar
    btrfs: scan device in non-exclusive mode · 50d281fc
    Anand Jain authored
    This fixes mkfs/mount/check failures due to race with systemd-udevd
    scan.
    
    During the device scan initiated by systemd-udevd, other user space
    EXCL operations such as mkfs, mount, or check may get blocked and result
    in a "Device or resource busy" error. This is because the device
    scan process opens the device with the EXCL flag in the kernel.
    
    Two reports were received:
    
     - btrfs/179 test case, where the fsck command failed with the -EBUSY
       error
    
     - LTP pwritev03 test case, where mkfs.vfs failed with
       the -EBUSY error, when mkfs.vfs tried to overwrite old btrfs filesystem
       on the device.
    
    In both cases, fsck and mkfs (respectively) were racing with a
    systemd-udevd device scan, and systemd-udevd won, resulting in the
    -EBUSY error for fsck and mkfs.
    
    Reproducing the problem has been difficult because there is a very
    small window during which these userspace threads can race to
    acquire the exclusive device open. Even on the system where the problem
    was observed, the problem occurrences were anywhere between 10 to 400
    iterations and chances of reproducing decreases with debug printk()s.
    
    However, an exclusive device open is unnecessary for the scan process,
    as there are no write operations on the device during scan. Furthermore,
    during the mount process, the superblock is re-read in the below
    function call chain:
    
      btrfs_mount_root
       btrfs_open_devices
        open_fs_devices
         btrfs_open_one_device
           btrfs_get_bdev_and_sb
    
    So, to fix this issue, removes the FMODE_EXCL flag from the scan
    operation, and add a comment.
    
    The case where mkfs may still write to the device and a scan is running,
    the btrfs signature is not written at that time so scan will not
    recognize such device.
    Reported-by: default avatarSherry Yang <sherry.yang@oracle.com>
    Reported-by: default avatarkernel test robot <oliver.sang@intel.com>
    Link: https://lore.kernel.org/oe-lkp/202303170839.fdf23068-oliver.sang@intel.com
    CC: stable@vger.kernel.org # 5.4+
    Signed-off-by: default avatarAnand Jain <anand.jain@oracle.com>
    Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    50d281fc
volumes.c 219 KB