aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/inode.c
diff options
context:
space:
mode:
authorMiao Xie <miaox@cn.fujitsu.com>2013-01-29 05:10:51 -0500
committerJosef Bacik <jbacik@fusionio.com>2013-02-20 12:59:05 -0500
commit963d678b0f7649300e3a67f2513ca9d830c6e303 (patch)
tree4f7568f541891a7bbe8b279c98d21aec1cabe06f /fs/btrfs/inode.c
parente2d845211eda9cf296e8edf6724b3d541f4fbfd5 (diff)
Btrfs: use percpu counter for fs_info->delalloc_bytes
fs_info->delalloc_bytes is accessed very frequently, so use percpu counter instead of the u64 variant for it to reduce the lock contention. This patch also fixed the problem that we access the variant without the lock protection.At worst, we would not flush the delalloc inodes, and just return ENOSPC error when we still have some free space in the fs. Signed-off-by: Miao Xie <miaox@cn.fujitsu.com> Signed-off-by: Josef Bacik <jbacik@fusionio.com>
Diffstat (limited to 'fs/btrfs/inode.c')
-rw-r--r--fs/btrfs/inode.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index fc8aa8bf80a1..24c0b7805fe1 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -1516,7 +1516,8 @@ static void btrfs_set_bit_hook(struct inode *inode,
1516 1516
1517 spin_lock(&root->fs_info->delalloc_lock); 1517 spin_lock(&root->fs_info->delalloc_lock);
1518 BTRFS_I(inode)->delalloc_bytes += len; 1518 BTRFS_I(inode)->delalloc_bytes += len;
1519 root->fs_info->delalloc_bytes += len; 1519 __percpu_counter_add(&root->fs_info->delalloc_bytes, len,
1520 root->fs_info->delalloc_batch);
1520 if (do_list && list_empty(&BTRFS_I(inode)->delalloc_inodes)) { 1521 if (do_list && list_empty(&BTRFS_I(inode)->delalloc_inodes)) {
1521 list_add_tail(&BTRFS_I(inode)->delalloc_inodes, 1522 list_add_tail(&BTRFS_I(inode)->delalloc_inodes,
1522 &root->fs_info->delalloc_inodes); 1523 &root->fs_info->delalloc_inodes);
@@ -1557,7 +1558,8 @@ static void btrfs_clear_bit_hook(struct inode *inode,
1557 btrfs_free_reserved_data_space(inode, len); 1558 btrfs_free_reserved_data_space(inode, len);
1558 1559
1559 spin_lock(&root->fs_info->delalloc_lock); 1560 spin_lock(&root->fs_info->delalloc_lock);
1560 root->fs_info->delalloc_bytes -= len; 1561 __percpu_counter_add(&root->fs_info->delalloc_bytes, -len,
1562 root->fs_info->delalloc_batch);
1561 BTRFS_I(inode)->delalloc_bytes -= len; 1563 BTRFS_I(inode)->delalloc_bytes -= len;
1562 1564
1563 if (do_list && BTRFS_I(inode)->delalloc_bytes == 0 && 1565 if (do_list && BTRFS_I(inode)->delalloc_bytes == 0 &&