diff options
-rw-r--r-- | fs/btrfs/btrfs_inode.h | 1 | ||||
-rw-r--r-- | fs/btrfs/disk-io.c | 2 | ||||
-rw-r--r-- | fs/btrfs/inode.c | 47 |
3 files changed, 37 insertions, 13 deletions
diff --git a/fs/btrfs/btrfs_inode.h b/fs/btrfs/btrfs_inode.h index 2a8c242bc4f5..c935a774a9f8 100644 --- a/fs/btrfs/btrfs_inode.h +++ b/fs/btrfs/btrfs_inode.h | |||
@@ -40,6 +40,7 @@ | |||
40 | #define BTRFS_INODE_HAS_ASYNC_EXTENT 6 | 40 | #define BTRFS_INODE_HAS_ASYNC_EXTENT 6 |
41 | #define BTRFS_INODE_NEEDS_FULL_SYNC 7 | 41 | #define BTRFS_INODE_NEEDS_FULL_SYNC 7 |
42 | #define BTRFS_INODE_COPY_EVERYTHING 8 | 42 | #define BTRFS_INODE_COPY_EVERYTHING 8 |
43 | #define BTRFS_INODE_IN_DELALLOC_LIST 9 | ||
43 | 44 | ||
44 | /* in memory btrfs inode */ | 45 | /* in memory btrfs inode */ |
45 | struct btrfs_inode { | 46 | struct btrfs_inode { |
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 2c9498aefe86..11f6dbcb1191 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c | |||
@@ -3690,6 +3690,8 @@ static void btrfs_destroy_delalloc_inodes(struct btrfs_root *root) | |||
3690 | delalloc_inodes); | 3690 | delalloc_inodes); |
3691 | 3691 | ||
3692 | list_del_init(&btrfs_inode->delalloc_inodes); | 3692 | list_del_init(&btrfs_inode->delalloc_inodes); |
3693 | clear_bit(BTRFS_INODE_IN_DELALLOC_LIST, | ||
3694 | &btrfs_inode->runtime_flags); | ||
3693 | 3695 | ||
3694 | btrfs_invalidate_inodes(btrfs_inode->root); | 3696 | btrfs_invalidate_inodes(btrfs_inode->root); |
3695 | } | 3697 | } |
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 24c0b7805fe1..82c7c66f8523 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
@@ -1514,15 +1514,22 @@ static void btrfs_set_bit_hook(struct inode *inode, | |||
1514 | spin_unlock(&BTRFS_I(inode)->lock); | 1514 | spin_unlock(&BTRFS_I(inode)->lock); |
1515 | } | 1515 | } |
1516 | 1516 | ||
1517 | spin_lock(&root->fs_info->delalloc_lock); | ||
1518 | BTRFS_I(inode)->delalloc_bytes += len; | ||
1519 | __percpu_counter_add(&root->fs_info->delalloc_bytes, len, | 1517 | __percpu_counter_add(&root->fs_info->delalloc_bytes, len, |
1520 | root->fs_info->delalloc_batch); | 1518 | root->fs_info->delalloc_batch); |
1521 | if (do_list && list_empty(&BTRFS_I(inode)->delalloc_inodes)) { | 1519 | spin_lock(&BTRFS_I(inode)->lock); |
1522 | list_add_tail(&BTRFS_I(inode)->delalloc_inodes, | 1520 | BTRFS_I(inode)->delalloc_bytes += len; |
1523 | &root->fs_info->delalloc_inodes); | 1521 | if (do_list && !test_bit(BTRFS_INODE_IN_DELALLOC_LIST, |
1522 | &BTRFS_I(inode)->runtime_flags)) { | ||
1523 | spin_lock(&root->fs_info->delalloc_lock); | ||
1524 | if (list_empty(&BTRFS_I(inode)->delalloc_inodes)) { | ||
1525 | list_add_tail(&BTRFS_I(inode)->delalloc_inodes, | ||
1526 | &root->fs_info->delalloc_inodes); | ||
1527 | set_bit(BTRFS_INODE_IN_DELALLOC_LIST, | ||
1528 | &BTRFS_I(inode)->runtime_flags); | ||
1529 | } | ||
1530 | spin_unlock(&root->fs_info->delalloc_lock); | ||
1524 | } | 1531 | } |
1525 | spin_unlock(&root->fs_info->delalloc_lock); | 1532 | spin_unlock(&BTRFS_I(inode)->lock); |
1526 | } | 1533 | } |
1527 | } | 1534 | } |
1528 | 1535 | ||
@@ -1557,16 +1564,22 @@ static void btrfs_clear_bit_hook(struct inode *inode, | |||
1557 | && do_list) | 1564 | && do_list) |
1558 | btrfs_free_reserved_data_space(inode, len); | 1565 | btrfs_free_reserved_data_space(inode, len); |
1559 | 1566 | ||
1560 | spin_lock(&root->fs_info->delalloc_lock); | ||
1561 | __percpu_counter_add(&root->fs_info->delalloc_bytes, -len, | 1567 | __percpu_counter_add(&root->fs_info->delalloc_bytes, -len, |
1562 | root->fs_info->delalloc_batch); | 1568 | root->fs_info->delalloc_batch); |
1569 | spin_lock(&BTRFS_I(inode)->lock); | ||
1563 | BTRFS_I(inode)->delalloc_bytes -= len; | 1570 | BTRFS_I(inode)->delalloc_bytes -= len; |
1564 | |||
1565 | if (do_list && BTRFS_I(inode)->delalloc_bytes == 0 && | 1571 | if (do_list && BTRFS_I(inode)->delalloc_bytes == 0 && |
1566 | !list_empty(&BTRFS_I(inode)->delalloc_inodes)) { | 1572 | test_bit(BTRFS_INODE_IN_DELALLOC_LIST, |
1567 | list_del_init(&BTRFS_I(inode)->delalloc_inodes); | 1573 | &BTRFS_I(inode)->runtime_flags)) { |
1574 | spin_lock(&root->fs_info->delalloc_lock); | ||
1575 | if (!list_empty(&BTRFS_I(inode)->delalloc_inodes)) { | ||
1576 | list_del_init(&BTRFS_I(inode)->delalloc_inodes); | ||
1577 | clear_bit(BTRFS_INODE_IN_DELALLOC_LIST, | ||
1578 | &BTRFS_I(inode)->runtime_flags); | ||
1579 | } | ||
1580 | spin_unlock(&root->fs_info->delalloc_lock); | ||
1568 | } | 1581 | } |
1569 | spin_unlock(&root->fs_info->delalloc_lock); | 1582 | spin_unlock(&BTRFS_I(inode)->lock); |
1570 | } | 1583 | } |
1571 | } | 1584 | } |
1572 | 1585 | ||
@@ -7326,14 +7339,19 @@ fail: | |||
7326 | static int btrfs_getattr(struct vfsmount *mnt, | 7339 | static int btrfs_getattr(struct vfsmount *mnt, |
7327 | struct dentry *dentry, struct kstat *stat) | 7340 | struct dentry *dentry, struct kstat *stat) |
7328 | { | 7341 | { |
7342 | u64 delalloc_bytes; | ||
7329 | struct inode *inode = dentry->d_inode; | 7343 | struct inode *inode = dentry->d_inode; |
7330 | u32 blocksize = inode->i_sb->s_blocksize; | 7344 | u32 blocksize = inode->i_sb->s_blocksize; |
7331 | 7345 | ||
7332 | generic_fillattr(inode, stat); | 7346 | generic_fillattr(inode, stat); |
7333 | stat->dev = BTRFS_I(inode)->root->anon_dev; | 7347 | stat->dev = BTRFS_I(inode)->root->anon_dev; |
7334 | stat->blksize = PAGE_CACHE_SIZE; | 7348 | stat->blksize = PAGE_CACHE_SIZE; |
7349 | |||
7350 | spin_lock(&BTRFS_I(inode)->lock); | ||
7351 | delalloc_bytes = BTRFS_I(inode)->delalloc_bytes; | ||
7352 | spin_unlock(&BTRFS_I(inode)->lock); | ||
7335 | stat->blocks = (ALIGN(inode_get_bytes(inode), blocksize) + | 7353 | stat->blocks = (ALIGN(inode_get_bytes(inode), blocksize) + |
7336 | ALIGN(BTRFS_I(inode)->delalloc_bytes, blocksize)) >> 9; | 7354 | ALIGN(delalloc_bytes, blocksize)) >> 9; |
7337 | return 0; | 7355 | return 0; |
7338 | } | 7356 | } |
7339 | 7357 | ||
@@ -7620,8 +7638,11 @@ int btrfs_start_delalloc_inodes(struct btrfs_root *root, int delay_iput) | |||
7620 | list_del_init(&binode->delalloc_inodes); | 7638 | list_del_init(&binode->delalloc_inodes); |
7621 | 7639 | ||
7622 | inode = igrab(&binode->vfs_inode); | 7640 | inode = igrab(&binode->vfs_inode); |
7623 | if (!inode) | 7641 | if (!inode) { |
7642 | clear_bit(BTRFS_INODE_IN_DELALLOC_LIST, | ||
7643 | &binode->runtime_flags); | ||
7624 | continue; | 7644 | continue; |
7645 | } | ||
7625 | 7646 | ||
7626 | list_add_tail(&binode->delalloc_inodes, | 7647 | list_add_tail(&binode->delalloc_inodes, |
7627 | &root->fs_info->delalloc_inodes); | 7648 | &root->fs_info->delalloc_inodes); |