• Robbie Ko's avatar
    btrfs: reduce lock contention when creating snapshot · c11fbb6e
    Robbie Ko authored
    When creating a snapshot, ordered extents need to be flushed and this
    can take a long time.
    
    In create_snapshot there are two locks held when this happens:
    
      1. Destination directory inode lock
      2. Global subvolume semaphore
    
    This will unnecessarily block other operations like subvolume destroy,
    create, or setflag until the snapshot is created.
    
    We can fix that by moving the flush outside the locked section as this
    does not depend on the aforementioned locks.  The code factors out the
    snapshot related work from create_snapshot to btrfs_mksnapshot.
    
    __btrfs_ioctl_snap_create
      btrfs_mksubvol
        create_subvol
      btrfs_mksnapshot
        <flush>
        btrfs_mksubvol
          create_snapshot
    Reviewed-by: default avatarFilipe Manana <fdmanana@suse.com>
    Signed-off-by: default avatarRobbie Ko <robbieko@synology.com>
    Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    c11fbb6e
ioctl.c 118 KB