diff options
author | Liu Bo <bo.li.liu@oracle.com> | 2017-01-30 15:25:28 -0500 |
---|---|---|
committer | David Sterba <dsterba@suse.com> | 2017-02-14 09:51:00 -0500 |
commit | e4c3b2dcd1449def1229efb138da7cb28c796c71 (patch) | |
tree | a969e93a86cd12a9c81c99b474b923a314ecbfd7 | |
parent | f72ad18e996338a8033aeb981e645f8dbf4e22c1 (diff) |
Btrfs: kill trans in run_delalloc_nocow and btrfs_cross_ref_exist
run_delalloc_nocow has used trans in two places where they don't
actually need @trans.
For btrfs_lookup_file_extent, we search for file extents without COWing
anything, and for btrfs_cross_ref_exist, the only place where we need
@trans is deferencing it in order to get running_transaction which we
could easily get from the global fs_info.
Signed-off-by: Liu Bo <bo.li.liu@oracle.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
-rw-r--r-- | fs/btrfs/ctree.h | 3 | ||||
-rw-r--r-- | fs/btrfs/extent-tree.c | 22 | ||||
-rw-r--r-- | fs/btrfs/inode.c | 38 |
3 files changed, 16 insertions, 47 deletions
diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h index 56b8595eacbb..1692ebb05955 100644 --- a/fs/btrfs/ctree.h +++ b/fs/btrfs/ctree.h | |||
@@ -2584,8 +2584,7 @@ int btrfs_pin_extent_for_log_replay(struct btrfs_fs_info *fs_info, | |||
2584 | u64 bytenr, u64 num_bytes); | 2584 | u64 bytenr, u64 num_bytes); |
2585 | int btrfs_exclude_logged_extents(struct btrfs_fs_info *fs_info, | 2585 | int btrfs_exclude_logged_extents(struct btrfs_fs_info *fs_info, |
2586 | struct extent_buffer *eb); | 2586 | struct extent_buffer *eb); |
2587 | int btrfs_cross_ref_exist(struct btrfs_trans_handle *trans, | 2587 | int btrfs_cross_ref_exist(struct btrfs_root *root, |
2588 | struct btrfs_root *root, | ||
2589 | u64 objectid, u64 offset, u64 bytenr); | 2588 | u64 objectid, u64 offset, u64 bytenr); |
2590 | struct btrfs_block_group_cache *btrfs_lookup_block_group( | 2589 | struct btrfs_block_group_cache *btrfs_lookup_block_group( |
2591 | struct btrfs_fs_info *info, | 2590 | struct btrfs_fs_info *info, |
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index be235b30a798..0992cd1393a6 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c | |||
@@ -3028,8 +3028,7 @@ int btrfs_set_disk_extent_flags(struct btrfs_trans_handle *trans, | |||
3028 | return ret; | 3028 | return ret; |
3029 | } | 3029 | } |
3030 | 3030 | ||
3031 | static noinline int check_delayed_ref(struct btrfs_trans_handle *trans, | 3031 | static noinline int check_delayed_ref(struct btrfs_root *root, |
3032 | struct btrfs_root *root, | ||
3033 | struct btrfs_path *path, | 3032 | struct btrfs_path *path, |
3034 | u64 objectid, u64 offset, u64 bytenr) | 3033 | u64 objectid, u64 offset, u64 bytenr) |
3035 | { | 3034 | { |
@@ -3037,9 +3036,14 @@ static noinline int check_delayed_ref(struct btrfs_trans_handle *trans, | |||
3037 | struct btrfs_delayed_ref_node *ref; | 3036 | struct btrfs_delayed_ref_node *ref; |
3038 | struct btrfs_delayed_data_ref *data_ref; | 3037 | struct btrfs_delayed_data_ref *data_ref; |
3039 | struct btrfs_delayed_ref_root *delayed_refs; | 3038 | struct btrfs_delayed_ref_root *delayed_refs; |
3039 | struct btrfs_transaction *cur_trans; | ||
3040 | int ret = 0; | 3040 | int ret = 0; |
3041 | 3041 | ||
3042 | delayed_refs = &trans->transaction->delayed_refs; | 3042 | cur_trans = root->fs_info->running_transaction; |
3043 | if (!cur_trans) | ||
3044 | return 0; | ||
3045 | |||
3046 | delayed_refs = &cur_trans->delayed_refs; | ||
3043 | spin_lock(&delayed_refs->lock); | 3047 | spin_lock(&delayed_refs->lock); |
3044 | head = btrfs_find_delayed_ref_head(delayed_refs, bytenr); | 3048 | head = btrfs_find_delayed_ref_head(delayed_refs, bytenr); |
3045 | if (!head) { | 3049 | if (!head) { |
@@ -3090,8 +3094,7 @@ static noinline int check_delayed_ref(struct btrfs_trans_handle *trans, | |||
3090 | return ret; | 3094 | return ret; |
3091 | } | 3095 | } |
3092 | 3096 | ||
3093 | static noinline int check_committed_ref(struct btrfs_trans_handle *trans, | 3097 | static noinline int check_committed_ref(struct btrfs_root *root, |
3094 | struct btrfs_root *root, | ||
3095 | struct btrfs_path *path, | 3098 | struct btrfs_path *path, |
3096 | u64 objectid, u64 offset, u64 bytenr) | 3099 | u64 objectid, u64 offset, u64 bytenr) |
3097 | { | 3100 | { |
@@ -3162,9 +3165,8 @@ out: | |||
3162 | return ret; | 3165 | return ret; |
3163 | } | 3166 | } |
3164 | 3167 | ||
3165 | int btrfs_cross_ref_exist(struct btrfs_trans_handle *trans, | 3168 | int btrfs_cross_ref_exist(struct btrfs_root *root, u64 objectid, u64 offset, |
3166 | struct btrfs_root *root, | 3169 | u64 bytenr) |
3167 | u64 objectid, u64 offset, u64 bytenr) | ||
3168 | { | 3170 | { |
3169 | struct btrfs_path *path; | 3171 | struct btrfs_path *path; |
3170 | int ret; | 3172 | int ret; |
@@ -3175,12 +3177,12 @@ int btrfs_cross_ref_exist(struct btrfs_trans_handle *trans, | |||
3175 | return -ENOENT; | 3177 | return -ENOENT; |
3176 | 3178 | ||
3177 | do { | 3179 | do { |
3178 | ret = check_committed_ref(trans, root, path, objectid, | 3180 | ret = check_committed_ref(root, path, objectid, |
3179 | offset, bytenr); | 3181 | offset, bytenr); |
3180 | if (ret && ret != -ENOENT) | 3182 | if (ret && ret != -ENOENT) |
3181 | goto out; | 3183 | goto out; |
3182 | 3184 | ||
3183 | ret2 = check_delayed_ref(trans, root, path, objectid, | 3185 | ret2 = check_delayed_ref(root, path, objectid, |
3184 | offset, bytenr); | 3186 | offset, bytenr); |
3185 | } while (ret2 == -EAGAIN); | 3187 | } while (ret2 == -EAGAIN); |
3186 | 3188 | ||
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index ac5f8c404268..92416f3ea9a8 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
@@ -1247,7 +1247,6 @@ static noinline int run_delalloc_nocow(struct inode *inode, | |||
1247 | { | 1247 | { |
1248 | struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb); | 1248 | struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb); |
1249 | struct btrfs_root *root = BTRFS_I(inode)->root; | 1249 | struct btrfs_root *root = BTRFS_I(inode)->root; |
1250 | struct btrfs_trans_handle *trans; | ||
1251 | struct extent_buffer *leaf; | 1250 | struct extent_buffer *leaf; |
1252 | struct btrfs_path *path; | 1251 | struct btrfs_path *path; |
1253 | struct btrfs_file_extent_item *fi; | 1252 | struct btrfs_file_extent_item *fi; |
@@ -1283,30 +1282,10 @@ static noinline int run_delalloc_nocow(struct inode *inode, | |||
1283 | 1282 | ||
1284 | nolock = btrfs_is_free_space_inode(inode); | 1283 | nolock = btrfs_is_free_space_inode(inode); |
1285 | 1284 | ||
1286 | if (nolock) | ||
1287 | trans = btrfs_join_transaction_nolock(root); | ||
1288 | else | ||
1289 | trans = btrfs_join_transaction(root); | ||
1290 | |||
1291 | if (IS_ERR(trans)) { | ||
1292 | extent_clear_unlock_delalloc(inode, start, end, end, | ||
1293 | locked_page, | ||
1294 | EXTENT_LOCKED | EXTENT_DELALLOC | | ||
1295 | EXTENT_DO_ACCOUNTING | | ||
1296 | EXTENT_DEFRAG, PAGE_UNLOCK | | ||
1297 | PAGE_CLEAR_DIRTY | | ||
1298 | PAGE_SET_WRITEBACK | | ||
1299 | PAGE_END_WRITEBACK); | ||
1300 | btrfs_free_path(path); | ||
1301 | return PTR_ERR(trans); | ||
1302 | } | ||
1303 | |||
1304 | trans->block_rsv = &fs_info->delalloc_block_rsv; | ||
1305 | |||
1306 | cow_start = (u64)-1; | 1285 | cow_start = (u64)-1; |
1307 | cur_offset = start; | 1286 | cur_offset = start; |
1308 | while (1) { | 1287 | while (1) { |
1309 | ret = btrfs_lookup_file_extent(trans, root, path, ino, | 1288 | ret = btrfs_lookup_file_extent(NULL, root, path, ino, |
1310 | cur_offset, 0); | 1289 | cur_offset, 0); |
1311 | if (ret < 0) | 1290 | if (ret < 0) |
1312 | goto error; | 1291 | goto error; |
@@ -1379,7 +1358,7 @@ next_slot: | |||
1379 | goto out_check; | 1358 | goto out_check; |
1380 | if (btrfs_extent_readonly(fs_info, disk_bytenr)) | 1359 | if (btrfs_extent_readonly(fs_info, disk_bytenr)) |
1381 | goto out_check; | 1360 | goto out_check; |
1382 | if (btrfs_cross_ref_exist(trans, root, ino, | 1361 | if (btrfs_cross_ref_exist(root, ino, |
1383 | found_key.offset - | 1362 | found_key.offset - |
1384 | extent_offset, disk_bytenr)) | 1363 | extent_offset, disk_bytenr)) |
1385 | goto out_check; | 1364 | goto out_check; |
@@ -1531,10 +1510,6 @@ out_check: | |||
1531 | } | 1510 | } |
1532 | 1511 | ||
1533 | error: | 1512 | error: |
1534 | err = btrfs_end_transaction(trans); | ||
1535 | if (!ret) | ||
1536 | ret = err; | ||
1537 | |||
1538 | if (ret && cur_offset < end) | 1513 | if (ret && cur_offset < end) |
1539 | extent_clear_unlock_delalloc(inode, cur_offset, end, end, | 1514 | extent_clear_unlock_delalloc(inode, cur_offset, end, end, |
1540 | locked_page, EXTENT_LOCKED | | 1515 | locked_page, EXTENT_LOCKED | |
@@ -7290,7 +7265,6 @@ noinline int can_nocow_extent(struct inode *inode, u64 offset, u64 *len, | |||
7290 | u64 *ram_bytes) | 7265 | u64 *ram_bytes) |
7291 | { | 7266 | { |
7292 | struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb); | 7267 | struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb); |
7293 | struct btrfs_trans_handle *trans; | ||
7294 | struct btrfs_path *path; | 7268 | struct btrfs_path *path; |
7295 | int ret; | 7269 | int ret; |
7296 | struct extent_buffer *leaf; | 7270 | struct extent_buffer *leaf; |
@@ -7393,15 +7367,9 @@ noinline int can_nocow_extent(struct inode *inode, u64 offset, u64 *len, | |||
7393 | * look for other files referencing this extent, if we | 7367 | * look for other files referencing this extent, if we |
7394 | * find any we must cow | 7368 | * find any we must cow |
7395 | */ | 7369 | */ |
7396 | trans = btrfs_join_transaction(root); | ||
7397 | if (IS_ERR(trans)) { | ||
7398 | ret = 0; | ||
7399 | goto out; | ||
7400 | } | ||
7401 | 7370 | ||
7402 | ret = btrfs_cross_ref_exist(trans, root, btrfs_ino(BTRFS_I(inode)), | 7371 | ret = btrfs_cross_ref_exist(root, btrfs_ino(BTRFS_I(inode)), |
7403 | key.offset - backref_offset, disk_bytenr); | 7372 | key.offset - backref_offset, disk_bytenr); |
7404 | btrfs_end_transaction(trans); | ||
7405 | if (ret) { | 7373 | if (ret) { |
7406 | ret = 0; | 7374 | ret = 0; |
7407 | goto out; | 7375 | goto out; |