Message ID | 9d42ab56ffa6b454998453764dbb1c899d10bc40.1612350698.git.fdmanana@suse.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | btrfs: fix a couple swapfile support bugs | expand |
On 2/3/2021 7:17 PM, fdmanana@kernel.org wrote: > From: Filipe Manana <fdmanana@suse.com> > > During the nocow writeback path, we currently iterate the rbtree of block > groups twice: once for checking if the target block group is RO with the > call to btrfs_extent_readonly()), and once again for getting a nocow > reference on the block group with a call to btrfs_inc_nocow_writers(). > > Since btrfs_inc_nocow_writers() already returns false when the target > block group is RO, remove the call to btrfs_extent_readonly(). Not only > we avoid searching the blocks group rbtree twice, it also helps reduce > contention on the lock that protects it (specially since it is a spin > lock and not a read-write lock). That may make a noticeable difference > on very large filesystems, with thousands of allocated block groups. > > Signed-off-by: Filipe Manana <fdmanana@suse.com> Reviewed-by: Anand Jain <anand.jain@oracle.com> Thanks. > --- > fs/btrfs/inode.c | 4 +--- > 1 file changed, 1 insertion(+), 3 deletions(-) > > diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c > index 589030cefd90..b10fc42f9e9a 100644 > --- a/fs/btrfs/inode.c > +++ b/fs/btrfs/inode.c > @@ -1657,9 +1657,6 @@ static noinline int run_delalloc_nocow(struct btrfs_inode *inode, > */ > btrfs_release_path(path); > > - /* If extent is RO, we must COW it */ > - if (btrfs_extent_readonly(fs_info, disk_bytenr)) > - goto out_check; > ret = btrfs_cross_ref_exist(root, ino, > found_key.offset - > extent_offset, disk_bytenr, false); > @@ -1706,6 +1703,7 @@ static noinline int run_delalloc_nocow(struct btrfs_inode *inode, > WARN_ON_ONCE(freespace_inode); > goto out_check; > } > + /* If the extent's block group is RO, we must COW. */ > if (!btrfs_inc_nocow_writers(fs_info, disk_bytenr)) > goto out_check; > nocow = true; >
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 589030cefd90..b10fc42f9e9a 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -1657,9 +1657,6 @@ static noinline int run_delalloc_nocow(struct btrfs_inode *inode, */ btrfs_release_path(path); - /* If extent is RO, we must COW it */ - if (btrfs_extent_readonly(fs_info, disk_bytenr)) - goto out_check; ret = btrfs_cross_ref_exist(root, ino, found_key.offset - extent_offset, disk_bytenr, false); @@ -1706,6 +1703,7 @@ static noinline int run_delalloc_nocow(struct btrfs_inode *inode, WARN_ON_ONCE(freespace_inode); goto out_check; } + /* If the extent's block group is RO, we must COW. */ if (!btrfs_inc_nocow_writers(fs_info, disk_bytenr)) goto out_check; nocow = true;