diff options
Diffstat (limited to 'fs/btrfs/inode.c')
-rw-r--r-- | fs/btrfs/inode.c | 83 |
1 files changed, 63 insertions, 20 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 2f5975954ccf..e6811c42e41e 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
@@ -566,6 +566,8 @@ cont: | |||
566 | PAGE_SET_WRITEBACK | | 566 | PAGE_SET_WRITEBACK | |
567 | page_error_op | | 567 | page_error_op | |
568 | PAGE_END_WRITEBACK); | 568 | PAGE_END_WRITEBACK); |
569 | btrfs_free_reserved_data_space_noquota(inode, start, | ||
570 | end - start + 1); | ||
569 | goto free_pages_out; | 571 | goto free_pages_out; |
570 | } | 572 | } |
571 | } | 573 | } |
@@ -742,7 +744,7 @@ retry: | |||
742 | lock_extent(io_tree, async_extent->start, | 744 | lock_extent(io_tree, async_extent->start, |
743 | async_extent->start + async_extent->ram_size - 1); | 745 | async_extent->start + async_extent->ram_size - 1); |
744 | 746 | ||
745 | ret = btrfs_reserve_extent(root, | 747 | ret = btrfs_reserve_extent(root, async_extent->ram_size, |
746 | async_extent->compressed_size, | 748 | async_extent->compressed_size, |
747 | async_extent->compressed_size, | 749 | async_extent->compressed_size, |
748 | 0, alloc_hint, &ins, 1, 1); | 750 | 0, alloc_hint, &ins, 1, 1); |
@@ -969,7 +971,8 @@ static noinline int cow_file_range(struct inode *inode, | |||
969 | EXTENT_DEFRAG, PAGE_UNLOCK | | 971 | EXTENT_DEFRAG, PAGE_UNLOCK | |
970 | PAGE_CLEAR_DIRTY | PAGE_SET_WRITEBACK | | 972 | PAGE_CLEAR_DIRTY | PAGE_SET_WRITEBACK | |
971 | PAGE_END_WRITEBACK); | 973 | PAGE_END_WRITEBACK); |
972 | 974 | btrfs_free_reserved_data_space_noquota(inode, start, | |
975 | end - start + 1); | ||
973 | *nr_written = *nr_written + | 976 | *nr_written = *nr_written + |
974 | (end - start + PAGE_SIZE) / PAGE_SIZE; | 977 | (end - start + PAGE_SIZE) / PAGE_SIZE; |
975 | *page_started = 1; | 978 | *page_started = 1; |
@@ -989,7 +992,7 @@ static noinline int cow_file_range(struct inode *inode, | |||
989 | unsigned long op; | 992 | unsigned long op; |
990 | 993 | ||
991 | cur_alloc_size = disk_num_bytes; | 994 | cur_alloc_size = disk_num_bytes; |
992 | ret = btrfs_reserve_extent(root, cur_alloc_size, | 995 | ret = btrfs_reserve_extent(root, cur_alloc_size, cur_alloc_size, |
993 | root->sectorsize, 0, alloc_hint, | 996 | root->sectorsize, 0, alloc_hint, |
994 | &ins, 1, 1); | 997 | &ins, 1, 1); |
995 | if (ret < 0) | 998 | if (ret < 0) |
@@ -1489,8 +1492,10 @@ out_check: | |||
1489 | extent_clear_unlock_delalloc(inode, cur_offset, | 1492 | extent_clear_unlock_delalloc(inode, cur_offset, |
1490 | cur_offset + num_bytes - 1, | 1493 | cur_offset + num_bytes - 1, |
1491 | locked_page, EXTENT_LOCKED | | 1494 | locked_page, EXTENT_LOCKED | |
1492 | EXTENT_DELALLOC, PAGE_UNLOCK | | 1495 | EXTENT_DELALLOC | |
1493 | PAGE_SET_PRIVATE2); | 1496 | EXTENT_CLEAR_DATA_RESV, |
1497 | PAGE_UNLOCK | PAGE_SET_PRIVATE2); | ||
1498 | |||
1494 | if (!nolock && nocow) | 1499 | if (!nolock && nocow) |
1495 | btrfs_end_write_no_snapshoting(root); | 1500 | btrfs_end_write_no_snapshoting(root); |
1496 | cur_offset = extent_end; | 1501 | cur_offset = extent_end; |
@@ -1807,7 +1812,9 @@ static void btrfs_clear_bit_hook(struct inode *inode, | |||
1807 | return; | 1812 | return; |
1808 | 1813 | ||
1809 | if (root->root_key.objectid != BTRFS_DATA_RELOC_TREE_OBJECTID | 1814 | if (root->root_key.objectid != BTRFS_DATA_RELOC_TREE_OBJECTID |
1810 | && do_list && !(state->state & EXTENT_NORESERVE)) | 1815 | && do_list && !(state->state & EXTENT_NORESERVE) |
1816 | && (*bits & (EXTENT_DO_ACCOUNTING | | ||
1817 | EXTENT_CLEAR_DATA_RESV))) | ||
1811 | btrfs_free_reserved_data_space_noquota(inode, | 1818 | btrfs_free_reserved_data_space_noquota(inode, |
1812 | state->start, len); | 1819 | state->start, len); |
1813 | 1820 | ||
@@ -3435,10 +3442,10 @@ int btrfs_orphan_cleanup(struct btrfs_root *root) | |||
3435 | found_key.offset = 0; | 3442 | found_key.offset = 0; |
3436 | inode = btrfs_iget(root->fs_info->sb, &found_key, root, NULL); | 3443 | inode = btrfs_iget(root->fs_info->sb, &found_key, root, NULL); |
3437 | ret = PTR_ERR_OR_ZERO(inode); | 3444 | ret = PTR_ERR_OR_ZERO(inode); |
3438 | if (ret && ret != -ESTALE) | 3445 | if (ret && ret != -ENOENT) |
3439 | goto out; | 3446 | goto out; |
3440 | 3447 | ||
3441 | if (ret == -ESTALE && root == root->fs_info->tree_root) { | 3448 | if (ret == -ENOENT && root == root->fs_info->tree_root) { |
3442 | struct btrfs_root *dead_root; | 3449 | struct btrfs_root *dead_root; |
3443 | struct btrfs_fs_info *fs_info = root->fs_info; | 3450 | struct btrfs_fs_info *fs_info = root->fs_info; |
3444 | int is_dead_root = 0; | 3451 | int is_dead_root = 0; |
@@ -3474,7 +3481,7 @@ int btrfs_orphan_cleanup(struct btrfs_root *root) | |||
3474 | * Inode is already gone but the orphan item is still there, | 3481 | * Inode is already gone but the orphan item is still there, |
3475 | * kill the orphan item. | 3482 | * kill the orphan item. |
3476 | */ | 3483 | */ |
3477 | if (ret == -ESTALE) { | 3484 | if (ret == -ENOENT) { |
3478 | trans = btrfs_start_transaction(root, 1); | 3485 | trans = btrfs_start_transaction(root, 1); |
3479 | if (IS_ERR(trans)) { | 3486 | if (IS_ERR(trans)) { |
3480 | ret = PTR_ERR(trans); | 3487 | ret = PTR_ERR(trans); |
@@ -3633,7 +3640,7 @@ static noinline int acls_after_inode_item(struct extent_buffer *leaf, | |||
3633 | /* | 3640 | /* |
3634 | * read an inode from the btree into the in-memory inode | 3641 | * read an inode from the btree into the in-memory inode |
3635 | */ | 3642 | */ |
3636 | static void btrfs_read_locked_inode(struct inode *inode) | 3643 | static int btrfs_read_locked_inode(struct inode *inode) |
3637 | { | 3644 | { |
3638 | struct btrfs_path *path; | 3645 | struct btrfs_path *path; |
3639 | struct extent_buffer *leaf; | 3646 | struct extent_buffer *leaf; |
@@ -3652,14 +3659,19 @@ static void btrfs_read_locked_inode(struct inode *inode) | |||
3652 | filled = true; | 3659 | filled = true; |
3653 | 3660 | ||
3654 | path = btrfs_alloc_path(); | 3661 | path = btrfs_alloc_path(); |
3655 | if (!path) | 3662 | if (!path) { |
3663 | ret = -ENOMEM; | ||
3656 | goto make_bad; | 3664 | goto make_bad; |
3665 | } | ||
3657 | 3666 | ||
3658 | memcpy(&location, &BTRFS_I(inode)->location, sizeof(location)); | 3667 | memcpy(&location, &BTRFS_I(inode)->location, sizeof(location)); |
3659 | 3668 | ||
3660 | ret = btrfs_lookup_inode(NULL, root, path, &location, 0); | 3669 | ret = btrfs_lookup_inode(NULL, root, path, &location, 0); |
3661 | if (ret) | 3670 | if (ret) { |
3671 | if (ret > 0) | ||
3672 | ret = -ENOENT; | ||
3662 | goto make_bad; | 3673 | goto make_bad; |
3674 | } | ||
3663 | 3675 | ||
3664 | leaf = path->nodes[0]; | 3676 | leaf = path->nodes[0]; |
3665 | 3677 | ||
@@ -3812,11 +3824,12 @@ cache_acl: | |||
3812 | } | 3824 | } |
3813 | 3825 | ||
3814 | btrfs_update_iflags(inode); | 3826 | btrfs_update_iflags(inode); |
3815 | return; | 3827 | return 0; |
3816 | 3828 | ||
3817 | make_bad: | 3829 | make_bad: |
3818 | btrfs_free_path(path); | 3830 | btrfs_free_path(path); |
3819 | make_bad_inode(inode); | 3831 | make_bad_inode(inode); |
3832 | return ret; | ||
3820 | } | 3833 | } |
3821 | 3834 | ||
3822 | /* | 3835 | /* |
@@ -4204,6 +4217,7 @@ static int btrfs_rmdir(struct inode *dir, struct dentry *dentry) | |||
4204 | int err = 0; | 4217 | int err = 0; |
4205 | struct btrfs_root *root = BTRFS_I(dir)->root; | 4218 | struct btrfs_root *root = BTRFS_I(dir)->root; |
4206 | struct btrfs_trans_handle *trans; | 4219 | struct btrfs_trans_handle *trans; |
4220 | u64 last_unlink_trans; | ||
4207 | 4221 | ||
4208 | if (inode->i_size > BTRFS_EMPTY_DIR_SIZE) | 4222 | if (inode->i_size > BTRFS_EMPTY_DIR_SIZE) |
4209 | return -ENOTEMPTY; | 4223 | return -ENOTEMPTY; |
@@ -4226,11 +4240,27 @@ static int btrfs_rmdir(struct inode *dir, struct dentry *dentry) | |||
4226 | if (err) | 4240 | if (err) |
4227 | goto out; | 4241 | goto out; |
4228 | 4242 | ||
4243 | last_unlink_trans = BTRFS_I(inode)->last_unlink_trans; | ||
4244 | |||
4229 | /* now the directory is empty */ | 4245 | /* now the directory is empty */ |
4230 | err = btrfs_unlink_inode(trans, root, dir, d_inode(dentry), | 4246 | err = btrfs_unlink_inode(trans, root, dir, d_inode(dentry), |
4231 | dentry->d_name.name, dentry->d_name.len); | 4247 | dentry->d_name.name, dentry->d_name.len); |
4232 | if (!err) | 4248 | if (!err) { |
4233 | btrfs_i_size_write(inode, 0); | 4249 | btrfs_i_size_write(inode, 0); |
4250 | /* | ||
4251 | * Propagate the last_unlink_trans value of the deleted dir to | ||
4252 | * its parent directory. This is to prevent an unrecoverable | ||
4253 | * log tree in the case we do something like this: | ||
4254 | * 1) create dir foo | ||
4255 | * 2) create snapshot under dir foo | ||
4256 | * 3) delete the snapshot | ||
4257 | * 4) rmdir foo | ||
4258 | * 5) mkdir foo | ||
4259 | * 6) fsync foo or some file inside foo | ||
4260 | */ | ||
4261 | if (last_unlink_trans >= trans->transid) | ||
4262 | BTRFS_I(dir)->last_unlink_trans = last_unlink_trans; | ||
4263 | } | ||
4234 | out: | 4264 | out: |
4235 | btrfs_end_transaction(trans, root); | 4265 | btrfs_end_transaction(trans, root); |
4236 | btrfs_btree_balance_dirty(root); | 4266 | btrfs_btree_balance_dirty(root); |
@@ -5606,7 +5636,9 @@ struct inode *btrfs_iget(struct super_block *s, struct btrfs_key *location, | |||
5606 | return ERR_PTR(-ENOMEM); | 5636 | return ERR_PTR(-ENOMEM); |
5607 | 5637 | ||
5608 | if (inode->i_state & I_NEW) { | 5638 | if (inode->i_state & I_NEW) { |
5609 | btrfs_read_locked_inode(inode); | 5639 | int ret; |
5640 | |||
5641 | ret = btrfs_read_locked_inode(inode); | ||
5610 | if (!is_bad_inode(inode)) { | 5642 | if (!is_bad_inode(inode)) { |
5611 | inode_tree_add(inode); | 5643 | inode_tree_add(inode); |
5612 | unlock_new_inode(inode); | 5644 | unlock_new_inode(inode); |
@@ -5615,7 +5647,8 @@ struct inode *btrfs_iget(struct super_block *s, struct btrfs_key *location, | |||
5615 | } else { | 5647 | } else { |
5616 | unlock_new_inode(inode); | 5648 | unlock_new_inode(inode); |
5617 | iput(inode); | 5649 | iput(inode); |
5618 | inode = ERR_PTR(-ESTALE); | 5650 | ASSERT(ret < 0); |
5651 | inode = ERR_PTR(ret < 0 ? ret : -ESTALE); | ||
5619 | } | 5652 | } |
5620 | } | 5653 | } |
5621 | 5654 | ||
@@ -7225,7 +7258,7 @@ static struct extent_map *btrfs_new_extent_direct(struct inode *inode, | |||
7225 | int ret; | 7258 | int ret; |
7226 | 7259 | ||
7227 | alloc_hint = get_extent_allocation_hint(inode, start, len); | 7260 | alloc_hint = get_extent_allocation_hint(inode, start, len); |
7228 | ret = btrfs_reserve_extent(root, len, root->sectorsize, 0, | 7261 | ret = btrfs_reserve_extent(root, len, len, root->sectorsize, 0, |
7229 | alloc_hint, &ins, 1, 1); | 7262 | alloc_hint, &ins, 1, 1); |
7230 | if (ret) | 7263 | if (ret) |
7231 | return ERR_PTR(ret); | 7264 | return ERR_PTR(ret); |
@@ -7725,6 +7758,13 @@ static int btrfs_get_blocks_direct(struct inode *inode, sector_t iblock, | |||
7725 | ret = PTR_ERR(em2); | 7758 | ret = PTR_ERR(em2); |
7726 | goto unlock_err; | 7759 | goto unlock_err; |
7727 | } | 7760 | } |
7761 | /* | ||
7762 | * For inode marked NODATACOW or extent marked PREALLOC, | ||
7763 | * use the existing or preallocated extent, so does not | ||
7764 | * need to adjust btrfs_space_info's bytes_may_use. | ||
7765 | */ | ||
7766 | btrfs_free_reserved_data_space_noquota(inode, | ||
7767 | start, len); | ||
7728 | goto unlock; | 7768 | goto unlock; |
7729 | } | 7769 | } |
7730 | } | 7770 | } |
@@ -7759,7 +7799,6 @@ unlock: | |||
7759 | i_size_write(inode, start + len); | 7799 | i_size_write(inode, start + len); |
7760 | 7800 | ||
7761 | adjust_dio_outstanding_extents(inode, dio_data, len); | 7801 | adjust_dio_outstanding_extents(inode, dio_data, len); |
7762 | btrfs_free_reserved_data_space(inode, start, len); | ||
7763 | WARN_ON(dio_data->reserve < len); | 7802 | WARN_ON(dio_data->reserve < len); |
7764 | dio_data->reserve -= len; | 7803 | dio_data->reserve -= len; |
7765 | dio_data->unsubmitted_oe_range_end = start + len; | 7804 | dio_data->unsubmitted_oe_range_end = start + len; |
@@ -10280,6 +10319,7 @@ static int __btrfs_prealloc_file_range(struct inode *inode, int mode, | |||
10280 | u64 last_alloc = (u64)-1; | 10319 | u64 last_alloc = (u64)-1; |
10281 | int ret = 0; | 10320 | int ret = 0; |
10282 | bool own_trans = true; | 10321 | bool own_trans = true; |
10322 | u64 end = start + num_bytes - 1; | ||
10283 | 10323 | ||
10284 | if (trans) | 10324 | if (trans) |
10285 | own_trans = false; | 10325 | own_trans = false; |
@@ -10301,8 +10341,8 @@ static int __btrfs_prealloc_file_range(struct inode *inode, int mode, | |||
10301 | * sized chunks. | 10341 | * sized chunks. |
10302 | */ | 10342 | */ |
10303 | cur_bytes = min(cur_bytes, last_alloc); | 10343 | cur_bytes = min(cur_bytes, last_alloc); |
10304 | ret = btrfs_reserve_extent(root, cur_bytes, min_size, 0, | 10344 | ret = btrfs_reserve_extent(root, cur_bytes, cur_bytes, |
10305 | *alloc_hint, &ins, 1, 0); | 10345 | min_size, 0, *alloc_hint, &ins, 1, 0); |
10306 | if (ret) { | 10346 | if (ret) { |
10307 | if (own_trans) | 10347 | if (own_trans) |
10308 | btrfs_end_transaction(trans, root); | 10348 | btrfs_end_transaction(trans, root); |
@@ -10388,6 +10428,9 @@ next: | |||
10388 | if (own_trans) | 10428 | if (own_trans) |
10389 | btrfs_end_transaction(trans, root); | 10429 | btrfs_end_transaction(trans, root); |
10390 | } | 10430 | } |
10431 | if (cur_offset < end) | ||
10432 | btrfs_free_reserved_data_space(inode, cur_offset, | ||
10433 | end - cur_offset + 1); | ||
10391 | return ret; | 10434 | return ret; |
10392 | } | 10435 | } |
10393 | 10436 | ||