diff options
Diffstat (limited to 'fs/btrfs/file.c')
-rw-r--r-- | fs/btrfs/file.c | 65 |
1 files changed, 33 insertions, 32 deletions
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c index faa7d390841b..467620a3b1f9 100644 --- a/fs/btrfs/file.c +++ b/fs/btrfs/file.c | |||
@@ -273,11 +273,7 @@ void btrfs_cleanup_defrag_inodes(struct btrfs_fs_info *fs_info) | |||
273 | defrag = rb_entry(node, struct inode_defrag, rb_node); | 273 | defrag = rb_entry(node, struct inode_defrag, rb_node); |
274 | kmem_cache_free(btrfs_inode_defrag_cachep, defrag); | 274 | kmem_cache_free(btrfs_inode_defrag_cachep, defrag); |
275 | 275 | ||
276 | if (need_resched()) { | 276 | cond_resched_lock(&fs_info->defrag_inodes_lock); |
277 | spin_unlock(&fs_info->defrag_inodes_lock); | ||
278 | cond_resched(); | ||
279 | spin_lock(&fs_info->defrag_inodes_lock); | ||
280 | } | ||
281 | 277 | ||
282 | node = rb_first(&fs_info->defrag_inodes); | 278 | node = rb_first(&fs_info->defrag_inodes); |
283 | } | 279 | } |
@@ -868,7 +864,7 @@ next_slot: | |||
868 | 864 | ||
869 | memcpy(&new_key, &key, sizeof(new_key)); | 865 | memcpy(&new_key, &key, sizeof(new_key)); |
870 | new_key.offset = end; | 866 | new_key.offset = end; |
871 | btrfs_set_item_key_safe(root, path, &new_key); | 867 | btrfs_set_item_key_safe(root->fs_info, path, &new_key); |
872 | 868 | ||
873 | extent_offset += end - key.offset; | 869 | extent_offset += end - key.offset; |
874 | btrfs_set_file_extent_offset(leaf, fi, extent_offset); | 870 | btrfs_set_file_extent_offset(leaf, fi, extent_offset); |
@@ -1126,7 +1122,7 @@ again: | |||
1126 | ino, bytenr, orig_offset, | 1122 | ino, bytenr, orig_offset, |
1127 | &other_start, &other_end)) { | 1123 | &other_start, &other_end)) { |
1128 | new_key.offset = end; | 1124 | new_key.offset = end; |
1129 | btrfs_set_item_key_safe(root, path, &new_key); | 1125 | btrfs_set_item_key_safe(root->fs_info, path, &new_key); |
1130 | fi = btrfs_item_ptr(leaf, path->slots[0], | 1126 | fi = btrfs_item_ptr(leaf, path->slots[0], |
1131 | struct btrfs_file_extent_item); | 1127 | struct btrfs_file_extent_item); |
1132 | btrfs_set_file_extent_generation(leaf, fi, | 1128 | btrfs_set_file_extent_generation(leaf, fi, |
@@ -1160,7 +1156,7 @@ again: | |||
1160 | trans->transid); | 1156 | trans->transid); |
1161 | path->slots[0]++; | 1157 | path->slots[0]++; |
1162 | new_key.offset = start; | 1158 | new_key.offset = start; |
1163 | btrfs_set_item_key_safe(root, path, &new_key); | 1159 | btrfs_set_item_key_safe(root->fs_info, path, &new_key); |
1164 | 1160 | ||
1165 | fi = btrfs_item_ptr(leaf, path->slots[0], | 1161 | fi = btrfs_item_ptr(leaf, path->slots[0], |
1166 | struct btrfs_file_extent_item); | 1162 | struct btrfs_file_extent_item); |
@@ -1485,7 +1481,7 @@ static noinline ssize_t __btrfs_buffered_write(struct file *file, | |||
1485 | PAGE_CACHE_SIZE / (sizeof(struct page *))); | 1481 | PAGE_CACHE_SIZE / (sizeof(struct page *))); |
1486 | nrptrs = min(nrptrs, current->nr_dirtied_pause - current->nr_dirtied); | 1482 | nrptrs = min(nrptrs, current->nr_dirtied_pause - current->nr_dirtied); |
1487 | nrptrs = max(nrptrs, 8); | 1483 | nrptrs = max(nrptrs, 8); |
1488 | pages = kmalloc(nrptrs * sizeof(struct page *), GFP_KERNEL); | 1484 | pages = kmalloc_array(nrptrs, sizeof(struct page *), GFP_KERNEL); |
1489 | if (!pages) | 1485 | if (!pages) |
1490 | return -ENOMEM; | 1486 | return -ENOMEM; |
1491 | 1487 | ||
@@ -1514,7 +1510,7 @@ static noinline ssize_t __btrfs_buffered_write(struct file *file, | |||
1514 | } | 1510 | } |
1515 | 1511 | ||
1516 | reserve_bytes = num_pages << PAGE_CACHE_SHIFT; | 1512 | reserve_bytes = num_pages << PAGE_CACHE_SHIFT; |
1517 | ret = btrfs_check_data_free_space(inode, reserve_bytes); | 1513 | ret = btrfs_check_data_free_space(inode, reserve_bytes, write_bytes); |
1518 | if (ret == -ENOSPC && | 1514 | if (ret == -ENOSPC && |
1519 | (BTRFS_I(inode)->flags & (BTRFS_INODE_NODATACOW | | 1515 | (BTRFS_I(inode)->flags & (BTRFS_INODE_NODATACOW | |
1520 | BTRFS_INODE_PREALLOC))) { | 1516 | BTRFS_INODE_PREALLOC))) { |
@@ -1635,8 +1631,8 @@ again: | |||
1635 | btrfs_end_write_no_snapshoting(root); | 1631 | btrfs_end_write_no_snapshoting(root); |
1636 | 1632 | ||
1637 | if (only_release_metadata && copied > 0) { | 1633 | if (only_release_metadata && copied > 0) { |
1638 | u64 lockstart = round_down(pos, root->sectorsize); | 1634 | lockstart = round_down(pos, root->sectorsize); |
1639 | u64 lockend = lockstart + | 1635 | lockend = lockstart + |
1640 | (dirty_pages << PAGE_CACHE_SHIFT) - 1; | 1636 | (dirty_pages << PAGE_CACHE_SHIFT) - 1; |
1641 | 1637 | ||
1642 | set_extent_bit(&BTRFS_I(inode)->io_tree, lockstart, | 1638 | set_extent_bit(&BTRFS_I(inode)->io_tree, lockstart, |
@@ -1809,7 +1805,9 @@ static ssize_t btrfs_file_write_iter(struct kiocb *iocb, | |||
1809 | * otherwise subsequent syncs to a file that's been synced in this | 1805 | * otherwise subsequent syncs to a file that's been synced in this |
1810 | * transaction will appear to have already occured. | 1806 | * transaction will appear to have already occured. |
1811 | */ | 1807 | */ |
1808 | spin_lock(&BTRFS_I(inode)->lock); | ||
1812 | BTRFS_I(inode)->last_sub_trans = root->log_transid; | 1809 | BTRFS_I(inode)->last_sub_trans = root->log_transid; |
1810 | spin_unlock(&BTRFS_I(inode)->lock); | ||
1813 | if (num_written > 0) { | 1811 | if (num_written > 0) { |
1814 | err = generic_write_sync(file, pos, num_written); | 1812 | err = generic_write_sync(file, pos, num_written); |
1815 | if (err < 0) | 1813 | if (err < 0) |
@@ -2162,7 +2160,7 @@ static int fill_holes(struct btrfs_trans_handle *trans, struct inode *inode, | |||
2162 | u64 num_bytes; | 2160 | u64 num_bytes; |
2163 | 2161 | ||
2164 | key.offset = offset; | 2162 | key.offset = offset; |
2165 | btrfs_set_item_key_safe(root, path, &key); | 2163 | btrfs_set_item_key_safe(root->fs_info, path, &key); |
2166 | fi = btrfs_item_ptr(leaf, path->slots[0], | 2164 | fi = btrfs_item_ptr(leaf, path->slots[0], |
2167 | struct btrfs_file_extent_item); | 2165 | struct btrfs_file_extent_item); |
2168 | num_bytes = btrfs_file_extent_num_bytes(leaf, fi) + end - | 2166 | num_bytes = btrfs_file_extent_num_bytes(leaf, fi) + end - |
@@ -2545,7 +2543,6 @@ static long btrfs_fallocate(struct file *file, int mode, | |||
2545 | { | 2543 | { |
2546 | struct inode *inode = file_inode(file); | 2544 | struct inode *inode = file_inode(file); |
2547 | struct extent_state *cached_state = NULL; | 2545 | struct extent_state *cached_state = NULL; |
2548 | struct btrfs_root *root = BTRFS_I(inode)->root; | ||
2549 | u64 cur_offset; | 2546 | u64 cur_offset; |
2550 | u64 last_byte; | 2547 | u64 last_byte; |
2551 | u64 alloc_start; | 2548 | u64 alloc_start; |
@@ -2570,14 +2567,9 @@ static long btrfs_fallocate(struct file *file, int mode, | |||
2570 | * Make sure we have enough space before we do the | 2567 | * Make sure we have enough space before we do the |
2571 | * allocation. | 2568 | * allocation. |
2572 | */ | 2569 | */ |
2573 | ret = btrfs_check_data_free_space(inode, alloc_end - alloc_start); | 2570 | ret = btrfs_check_data_free_space(inode, alloc_end - alloc_start, alloc_end - alloc_start); |
2574 | if (ret) | 2571 | if (ret) |
2575 | return ret; | 2572 | return ret; |
2576 | if (root->fs_info->quota_enabled) { | ||
2577 | ret = btrfs_qgroup_reserve(root, alloc_end - alloc_start); | ||
2578 | if (ret) | ||
2579 | goto out_reserve_fail; | ||
2580 | } | ||
2581 | 2573 | ||
2582 | mutex_lock(&inode->i_mutex); | 2574 | mutex_lock(&inode->i_mutex); |
2583 | ret = inode_newsize_ok(inode, alloc_end); | 2575 | ret = inode_newsize_ok(inode, alloc_end); |
@@ -2667,23 +2659,35 @@ static long btrfs_fallocate(struct file *file, int mode, | |||
2667 | 1 << inode->i_blkbits, | 2659 | 1 << inode->i_blkbits, |
2668 | offset + len, | 2660 | offset + len, |
2669 | &alloc_hint); | 2661 | &alloc_hint); |
2670 | |||
2671 | if (ret < 0) { | ||
2672 | free_extent_map(em); | ||
2673 | break; | ||
2674 | } | ||
2675 | } else if (actual_end > inode->i_size && | 2662 | } else if (actual_end > inode->i_size && |
2676 | !(mode & FALLOC_FL_KEEP_SIZE)) { | 2663 | !(mode & FALLOC_FL_KEEP_SIZE)) { |
2664 | struct btrfs_trans_handle *trans; | ||
2665 | struct btrfs_root *root = BTRFS_I(inode)->root; | ||
2666 | |||
2677 | /* | 2667 | /* |
2678 | * We didn't need to allocate any more space, but we | 2668 | * We didn't need to allocate any more space, but we |
2679 | * still extended the size of the file so we need to | 2669 | * still extended the size of the file so we need to |
2680 | * update i_size. | 2670 | * update i_size and the inode item. |
2681 | */ | 2671 | */ |
2682 | inode->i_ctime = CURRENT_TIME; | 2672 | trans = btrfs_start_transaction(root, 1); |
2683 | i_size_write(inode, actual_end); | 2673 | if (IS_ERR(trans)) { |
2684 | btrfs_ordered_update_i_size(inode, actual_end, NULL); | 2674 | ret = PTR_ERR(trans); |
2675 | } else { | ||
2676 | inode->i_ctime = CURRENT_TIME; | ||
2677 | i_size_write(inode, actual_end); | ||
2678 | btrfs_ordered_update_i_size(inode, actual_end, | ||
2679 | NULL); | ||
2680 | ret = btrfs_update_inode(trans, root, inode); | ||
2681 | if (ret) | ||
2682 | btrfs_end_transaction(trans, root); | ||
2683 | else | ||
2684 | ret = btrfs_end_transaction(trans, | ||
2685 | root); | ||
2686 | } | ||
2685 | } | 2687 | } |
2686 | free_extent_map(em); | 2688 | free_extent_map(em); |
2689 | if (ret < 0) | ||
2690 | break; | ||
2687 | 2691 | ||
2688 | cur_offset = last_byte; | 2692 | cur_offset = last_byte; |
2689 | if (cur_offset >= alloc_end) { | 2693 | if (cur_offset >= alloc_end) { |
@@ -2695,9 +2699,6 @@ static long btrfs_fallocate(struct file *file, int mode, | |||
2695 | &cached_state, GFP_NOFS); | 2699 | &cached_state, GFP_NOFS); |
2696 | out: | 2700 | out: |
2697 | mutex_unlock(&inode->i_mutex); | 2701 | mutex_unlock(&inode->i_mutex); |
2698 | if (root->fs_info->quota_enabled) | ||
2699 | btrfs_qgroup_free(root, alloc_end - alloc_start); | ||
2700 | out_reserve_fail: | ||
2701 | /* Let go of our reservation. */ | 2702 | /* Let go of our reservation. */ |
2702 | btrfs_free_reserved_data_space(inode, alloc_end - alloc_start); | 2703 | btrfs_free_reserved_data_space(inode, alloc_end - alloc_start); |
2703 | return ret; | 2704 | return ret; |