• David Sterba's avatar
    btrfs: fix mount and ioctl device scan ioctl race · 81ffd56b
    David Sterba authored
    Technically this extends the critical section covered by uuid_mutex to:
    
    - parse early mount options -- here we can call device scan on paths
      that can be passed as 'device=/dev/...'
    
    - scan the device passed to mount
    
    - open the devices related to the fs_devices -- this increases
      fs_devices::opened
    
    The race can happen when mount calls one of the scans and there's
    another one called eg. by mkfs or 'btrfs dev scan':
    
    Mount                                  Scan
    -----                                  ----
    scan_one_device (dev1, fsid1)
                                           scan_one_device (dev2, fsid1)
    				           add the device
    					   free stale devices
    					       fsid1 fs_devices::opened == 0
    					           find fsid1:dev1
    					           free fsid1:dev1
    					           if it's the last one,
    					            free fs_devices of fsid1
    						    too
    
    open_devices (dev1, fsid1)
       dev1 not found
    
    When fixed, the uuid mutex will make sure that mount will increase
    fs_devices::opened and this will not be touched by the racing scan
    ioctl.
    
    Reported-and-tested-by: syzbot+909a5177749d7990ffa4@syzkaller.appspotmail.com
    Reported-and-tested-by: syzbot+ceb2606025ec1cc3479c@syzkaller.appspotmail.com
    Reviewed-by: default avatarAnand Jain <anand.jain@oracle.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    81ffd56b
super.c 65.4 KB