From: Nikolay Borisov Date: Wed, 17 Jun 2020 09:10:43 +0000 (+0300) Subject: btrfs: perform data management operations outside of inode lock X-Git-Tag: v5.15~2817^2~145 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=214e61d07e1ab9e497c081d1bad78d05f7c33abf;p=platform%2Fkernel%2Flinux-starfive.git btrfs: perform data management operations outside of inode lock btrfs_alloc_data_chunk_ondemand and btrfs_free_reserved_data_space_noquota don't really use the guts of the inodes being passed to them. This implies it's not required to call them under extent lock. Move code around in prealloc_file_extent_cluster to do the heavy, data alloc/free operations outside of the lock. This also makes the 'out' label unnecessary, so remove it. Reviewed-by: Johannes Thumshirn Signed-off-by: Nikolay Borisov Signed-off-by: David Sterba --- diff --git a/fs/btrfs/relocation.c b/fs/btrfs/relocation.c index ade45fb..f7feada 100644 --- a/fs/btrfs/relocation.c +++ b/fs/btrfs/relocation.c @@ -2584,17 +2584,15 @@ int prealloc_file_extent_cluster(struct inode *inode, int ret = 0; u64 prealloc_start = cluster->start - offset; u64 prealloc_end = cluster->end - offset; - u64 cur_offset; + u64 cur_offset = prealloc_start; BUG_ON(cluster->start != cluster->boundary[0]); - inode_lock(inode); - ret = btrfs_alloc_data_chunk_ondemand(BTRFS_I(inode), prealloc_end + 1 - prealloc_start); if (ret) - goto out; + return ret; - cur_offset = prealloc_start; + inode_lock(inode); while (nr < cluster->nr) { start = cluster->boundary[nr] - offset; if (nr + 1 < cluster->nr) @@ -2613,11 +2611,11 @@ int prealloc_file_extent_cluster(struct inode *inode, break; nr++; } + inode_unlock(inode); + if (cur_offset < prealloc_end) btrfs_free_reserved_data_space_noquota(inode, prealloc_end + 1 - cur_offset); -out: - inode_unlock(inode); return ret; }