summaryrefslogtreecommitdiffstats
path: root/fs/btrfs
diff options
context:
space:
mode:
authorNikolay Borisov <n.borisov.lkml@gmail.com>2017-02-20 06:50:47 -0500
committerDavid Sterba <dsterba@suse.com>2017-02-28 05:30:08 -0500
commita012a74e78d99aa27f8487c050e9ac3183bc3785 (patch)
tree87997b44b50d8ccf3b35289fadaf15404858d083 /fs/btrfs
parent35339c245b5939315e8763deb7f9b68fffe54912 (diff)
btrfs: Make fill_holes take btrfs_inode
Signed-off-by: Nikolay Borisov <nborisov@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
Diffstat (limited to 'fs/btrfs')
-rw-r--r--fs/btrfs/file.c37
1 files changed, 18 insertions, 19 deletions
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c
index 27dfdfb7ff19..ef4ecd003742 100644
--- a/fs/btrfs/file.c
+++ b/fs/btrfs/file.c
@@ -2224,22 +2224,23 @@ static int hole_mergeable(struct btrfs_inode *inode, struct extent_buffer *leaf,
2224 return 0; 2224 return 0;
2225} 2225}
2226 2226
2227static int fill_holes(struct btrfs_trans_handle *trans, struct inode *inode, 2227static int fill_holes(struct btrfs_trans_handle *trans,
2228 struct btrfs_path *path, u64 offset, u64 end) 2228 struct btrfs_inode *inode,
2229 struct btrfs_path *path, u64 offset, u64 end)
2229{ 2230{
2230 struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb); 2231 struct btrfs_fs_info *fs_info = btrfs_sb(inode->vfs_inode.i_sb);
2231 struct btrfs_root *root = BTRFS_I(inode)->root; 2232 struct btrfs_root *root = inode->root;
2232 struct extent_buffer *leaf; 2233 struct extent_buffer *leaf;
2233 struct btrfs_file_extent_item *fi; 2234 struct btrfs_file_extent_item *fi;
2234 struct extent_map *hole_em; 2235 struct extent_map *hole_em;
2235 struct extent_map_tree *em_tree = &BTRFS_I(inode)->extent_tree; 2236 struct extent_map_tree *em_tree = &inode->extent_tree;
2236 struct btrfs_key key; 2237 struct btrfs_key key;
2237 int ret; 2238 int ret;
2238 2239
2239 if (btrfs_fs_incompat(fs_info, NO_HOLES)) 2240 if (btrfs_fs_incompat(fs_info, NO_HOLES))
2240 goto out; 2241 goto out;
2241 2242
2242 key.objectid = btrfs_ino(BTRFS_I(inode)); 2243 key.objectid = btrfs_ino(inode);
2243 key.type = BTRFS_EXTENT_DATA_KEY; 2244 key.type = BTRFS_EXTENT_DATA_KEY;
2244 key.offset = offset; 2245 key.offset = offset;
2245 2246
@@ -2255,8 +2256,7 @@ static int fill_holes(struct btrfs_trans_handle *trans, struct inode *inode,
2255 } 2256 }
2256 2257
2257 leaf = path->nodes[0]; 2258 leaf = path->nodes[0];
2258 if (hole_mergeable(BTRFS_I(inode), leaf, path->slots[0] - 1, 2259 if (hole_mergeable(inode, leaf, path->slots[0] - 1, offset, end)) {
2259 offset, end)) {
2260 u64 num_bytes; 2260 u64 num_bytes;
2261 2261
2262 path->slots[0]--; 2262 path->slots[0]--;
@@ -2271,7 +2271,7 @@ static int fill_holes(struct btrfs_trans_handle *trans, struct inode *inode,
2271 goto out; 2271 goto out;
2272 } 2272 }
2273 2273
2274 if (hole_mergeable(BTRFS_I(inode), leaf, path->slots[0], offset, end)) { 2274 if (hole_mergeable(inode, leaf, path->slots[0], offset, end)) {
2275 u64 num_bytes; 2275 u64 num_bytes;
2276 2276
2277 key.offset = offset; 2277 key.offset = offset;
@@ -2288,7 +2288,7 @@ static int fill_holes(struct btrfs_trans_handle *trans, struct inode *inode,
2288 } 2288 }
2289 btrfs_release_path(path); 2289 btrfs_release_path(path);
2290 2290
2291 ret = btrfs_insert_file_extent(trans, root, btrfs_ino(BTRFS_I(inode)), 2291 ret = btrfs_insert_file_extent(trans, root, btrfs_ino(inode),
2292 offset, 0, 0, end - offset, 0, end - offset, 0, 0, 0); 2292 offset, 0, 0, end - offset, 0, end - offset, 0, 0, 0);
2293 if (ret) 2293 if (ret)
2294 return ret; 2294 return ret;
@@ -2298,9 +2298,8 @@ out:
2298 2298
2299 hole_em = alloc_extent_map(); 2299 hole_em = alloc_extent_map();
2300 if (!hole_em) { 2300 if (!hole_em) {
2301 btrfs_drop_extent_cache(BTRFS_I(inode), offset, end - 1, 0); 2301 btrfs_drop_extent_cache(inode, offset, end - 1, 0);
2302 set_bit(BTRFS_INODE_NEEDS_FULL_SYNC, 2302 set_bit(BTRFS_INODE_NEEDS_FULL_SYNC, &inode->runtime_flags);
2303 &BTRFS_I(inode)->runtime_flags);
2304 } else { 2303 } else {
2305 hole_em->start = offset; 2304 hole_em->start = offset;
2306 hole_em->len = end - offset; 2305 hole_em->len = end - offset;
@@ -2315,8 +2314,7 @@ out:
2315 hole_em->generation = trans->transid; 2314 hole_em->generation = trans->transid;
2316 2315
2317 do { 2316 do {
2318 btrfs_drop_extent_cache(BTRFS_I(inode), offset, 2317 btrfs_drop_extent_cache(inode, offset, end - 1, 0);
2319 end - 1, 0);
2320 write_lock(&em_tree->lock); 2318 write_lock(&em_tree->lock);
2321 ret = add_extent_mapping(em_tree, hole_em, 1); 2319 ret = add_extent_mapping(em_tree, hole_em, 1);
2322 write_unlock(&em_tree->lock); 2320 write_unlock(&em_tree->lock);
@@ -2324,7 +2322,7 @@ out:
2324 free_extent_map(hole_em); 2322 free_extent_map(hole_em);
2325 if (ret) 2323 if (ret)
2326 set_bit(BTRFS_INODE_NEEDS_FULL_SYNC, 2324 set_bit(BTRFS_INODE_NEEDS_FULL_SYNC,
2327 &BTRFS_I(inode)->runtime_flags); 2325 &inode->runtime_flags);
2328 } 2326 }
2329 2327
2330 return 0; 2328 return 0;
@@ -2554,8 +2552,8 @@ static int btrfs_punch_hole(struct inode *inode, loff_t offset, loff_t len)
2554 trans->block_rsv = &fs_info->trans_block_rsv; 2552 trans->block_rsv = &fs_info->trans_block_rsv;
2555 2553
2556 if (cur_offset < drop_end && cur_offset < ino_size) { 2554 if (cur_offset < drop_end && cur_offset < ino_size) {
2557 ret = fill_holes(trans, inode, path, cur_offset, 2555 ret = fill_holes(trans, BTRFS_I(inode), path,
2558 drop_end); 2556 cur_offset, drop_end);
2559 if (ret) { 2557 if (ret) {
2560 /* 2558 /*
2561 * If we failed then we didn't insert our hole 2559 * If we failed then we didn't insert our hole
@@ -2626,7 +2624,8 @@ static int btrfs_punch_hole(struct inode *inode, loff_t offset, loff_t len)
2626 * cur_offset == drop_end). 2624 * cur_offset == drop_end).
2627 */ 2625 */
2628 if (cur_offset < ino_size && cur_offset < drop_end) { 2626 if (cur_offset < ino_size && cur_offset < drop_end) {
2629 ret = fill_holes(trans, inode, path, cur_offset, drop_end); 2627 ret = fill_holes(trans, BTRFS_I(inode), path,
2628 cur_offset, drop_end);
2630 if (ret) { 2629 if (ret) {
2631 /* Same comment as above. */ 2630 /* Same comment as above. */
2632 btrfs_abort_transaction(trans, ret); 2631 btrfs_abort_transaction(trans, ret);