]> git.baikalelectronics.ru Git - kernel.git/commit
btrfs: reduce lock contention when creating snapshot
authorRobbie Ko <robbieko@synology.com>
Thu, 14 May 2020 09:19:18 +0000 (17:19 +0800)
committerDavid Sterba <dsterba@suse.com>
Mon, 25 May 2020 09:25:36 +0000 (11:25 +0200)
commit9f0fd529b49640226d3ca42415c4a8dd601e79e8
treece99a3789e94b681fda1dba17e96c584c1919d3d
parent75790c0e57b82699751abc8279b2b2f38b77bce7
btrfs: reduce lock contention when creating snapshot

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: Filipe Manana <fdmanana@suse.com>
Signed-off-by: Robbie Ko <robbieko@synology.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/ioctl.c