diff options
| -rw-r--r-- | fs/ext4/move_extent.c | 55 |
1 files changed, 34 insertions, 21 deletions
diff --git a/fs/ext4/move_extent.c b/fs/ext4/move_extent.c index 4c4491cef357..e4bd8761498a 100644 --- a/fs/ext4/move_extent.c +++ b/fs/ext4/move_extent.c | |||
| @@ -19,14 +19,29 @@ | |||
| 19 | #include "ext4_extents.h" | 19 | #include "ext4_extents.h" |
| 20 | #include "ext4.h" | 20 | #include "ext4.h" |
| 21 | 21 | ||
| 22 | #define get_ext_path(path, inode, block, ret) \ | 22 | /** |
| 23 | do { \ | 23 | * get_ext_path - Find an extent path for designated logical block number. |
| 24 | path = ext4_ext_find_extent(inode, block, path); \ | 24 | * |
| 25 | if (IS_ERR(path)) { \ | 25 | * @inode: an inode which is searched |
| 26 | ret = PTR_ERR(path); \ | 26 | * @lblock: logical block number to find an extent path |
| 27 | path = NULL; \ | 27 | * @path: pointer to an extent path pointer (for output) |
| 28 | } \ | 28 | * |
| 29 | } while (0) | 29 | * ext4_ext_find_extent wrapper. Return 0 on success, or a negative error value |
| 30 | * on failure. | ||
| 31 | */ | ||
| 32 | static inline int | ||
| 33 | get_ext_path(struct inode *inode, ext4_lblk_t lblock, | ||
| 34 | struct ext4_ext_path **path) | ||
| 35 | { | ||
| 36 | int ret = 0; | ||
| 37 | |||
| 38 | *path = ext4_ext_find_extent(inode, lblock, *path); | ||
| 39 | if (IS_ERR(*path)) { | ||
| 40 | ret = PTR_ERR(*path); | ||
| 41 | *path = NULL; | ||
| 42 | } | ||
| 43 | return ret; | ||
| 44 | } | ||
| 30 | 45 | ||
| 31 | /** | 46 | /** |
| 32 | * copy_extent_status - Copy the extent's initialization status | 47 | * copy_extent_status - Copy the extent's initialization status |
| @@ -283,7 +298,7 @@ mext_insert_across_blocks(handle_t *handle, struct inode *orig_inode, | |||
| 283 | } | 298 | } |
| 284 | 299 | ||
| 285 | if (new_flag) { | 300 | if (new_flag) { |
| 286 | get_ext_path(orig_path, orig_inode, eblock, err); | 301 | err = get_ext_path(orig_inode, eblock, &orig_path); |
| 287 | if (orig_path == NULL) | 302 | if (orig_path == NULL) |
| 288 | goto out; | 303 | goto out; |
| 289 | 304 | ||
| @@ -293,8 +308,8 @@ mext_insert_across_blocks(handle_t *handle, struct inode *orig_inode, | |||
| 293 | } | 308 | } |
| 294 | 309 | ||
| 295 | if (end_flag) { | 310 | if (end_flag) { |
| 296 | get_ext_path(orig_path, orig_inode, | 311 | err = get_ext_path(orig_inode, |
| 297 | le32_to_cpu(end_ext->ee_block) - 1, err); | 312 | le32_to_cpu(end_ext->ee_block) - 1, &orig_path); |
| 298 | if (orig_path == NULL) | 313 | if (orig_path == NULL) |
| 299 | goto out; | 314 | goto out; |
| 300 | 315 | ||
| @@ -631,12 +646,12 @@ mext_replace_branches(handle_t *handle, struct inode *orig_inode, | |||
| 631 | mext_double_down_write(orig_inode, donor_inode); | 646 | mext_double_down_write(orig_inode, donor_inode); |
| 632 | 647 | ||
| 633 | /* Get the original extent for the block "orig_off" */ | 648 | /* Get the original extent for the block "orig_off" */ |
| 634 | get_ext_path(orig_path, orig_inode, orig_off, err); | 649 | err = get_ext_path(orig_inode, orig_off, &orig_path); |
| 635 | if (orig_path == NULL) | 650 | if (orig_path == NULL) |
| 636 | goto out; | 651 | goto out; |
| 637 | 652 | ||
| 638 | /* Get the donor extent for the head */ | 653 | /* Get the donor extent for the head */ |
| 639 | get_ext_path(donor_path, donor_inode, donor_off, err); | 654 | err = get_ext_path(donor_inode, donor_off, &donor_path); |
| 640 | if (donor_path == NULL) | 655 | if (donor_path == NULL) |
| 641 | goto out; | 656 | goto out; |
| 642 | depth = ext_depth(orig_inode); | 657 | depth = ext_depth(orig_inode); |
| @@ -678,7 +693,7 @@ mext_replace_branches(handle_t *handle, struct inode *orig_inode, | |||
| 678 | 693 | ||
| 679 | if (orig_path) | 694 | if (orig_path) |
| 680 | ext4_ext_drop_refs(orig_path); | 695 | ext4_ext_drop_refs(orig_path); |
| 681 | get_ext_path(orig_path, orig_inode, orig_off, err); | 696 | err = get_ext_path(orig_inode, orig_off, &orig_path); |
| 682 | if (orig_path == NULL) | 697 | if (orig_path == NULL) |
| 683 | goto out; | 698 | goto out; |
| 684 | depth = ext_depth(orig_inode); | 699 | depth = ext_depth(orig_inode); |
| @@ -692,8 +707,7 @@ mext_replace_branches(handle_t *handle, struct inode *orig_inode, | |||
| 692 | 707 | ||
| 693 | if (donor_path) | 708 | if (donor_path) |
| 694 | ext4_ext_drop_refs(donor_path); | 709 | ext4_ext_drop_refs(donor_path); |
| 695 | get_ext_path(donor_path, donor_inode, | 710 | err = get_ext_path(donor_inode, donor_off, &donor_path); |
| 696 | donor_off, err); | ||
| 697 | if (donor_path == NULL) | 711 | if (donor_path == NULL) |
| 698 | goto out; | 712 | goto out; |
| 699 | depth = ext_depth(donor_inode); | 713 | depth = ext_depth(donor_inode); |
| @@ -1154,12 +1168,12 @@ ext4_move_extents(struct file *o_filp, struct file *d_filp, | |||
| 1154 | if (file_end < block_end) | 1168 | if (file_end < block_end) |
| 1155 | len -= block_end - file_end; | 1169 | len -= block_end - file_end; |
| 1156 | 1170 | ||
| 1157 | get_ext_path(orig_path, orig_inode, block_start, ret); | 1171 | ret = get_ext_path(orig_inode, block_start, &orig_path); |
| 1158 | if (orig_path == NULL) | 1172 | if (orig_path == NULL) |
| 1159 | goto out2; | 1173 | goto out2; |
| 1160 | 1174 | ||
| 1161 | /* Get path structure to check the hole */ | 1175 | /* Get path structure to check the hole */ |
| 1162 | get_ext_path(holecheck_path, orig_inode, block_start, ret); | 1176 | ret = get_ext_path(orig_inode, block_start, &holecheck_path); |
| 1163 | if (holecheck_path == NULL) | 1177 | if (holecheck_path == NULL) |
| 1164 | goto out; | 1178 | goto out; |
| 1165 | 1179 | ||
| @@ -1289,8 +1303,7 @@ ext4_move_extents(struct file *o_filp, struct file *d_filp, | |||
| 1289 | /* Decrease buffer counter */ | 1303 | /* Decrease buffer counter */ |
| 1290 | if (holecheck_path) | 1304 | if (holecheck_path) |
| 1291 | ext4_ext_drop_refs(holecheck_path); | 1305 | ext4_ext_drop_refs(holecheck_path); |
| 1292 | get_ext_path(holecheck_path, orig_inode, | 1306 | ret = get_ext_path(orig_inode, seq_start, &holecheck_path); |
| 1293 | seq_start, ret); | ||
| 1294 | if (holecheck_path == NULL) | 1307 | if (holecheck_path == NULL) |
| 1295 | break; | 1308 | break; |
| 1296 | depth = holecheck_path->p_depth; | 1309 | depth = holecheck_path->p_depth; |
| @@ -1298,7 +1311,7 @@ ext4_move_extents(struct file *o_filp, struct file *d_filp, | |||
| 1298 | /* Decrease buffer counter */ | 1311 | /* Decrease buffer counter */ |
| 1299 | if (orig_path) | 1312 | if (orig_path) |
| 1300 | ext4_ext_drop_refs(orig_path); | 1313 | ext4_ext_drop_refs(orig_path); |
| 1301 | get_ext_path(orig_path, orig_inode, seq_start, ret); | 1314 | ret = get_ext_path(orig_inode, seq_start, &orig_path); |
| 1302 | if (orig_path == NULL) | 1315 | if (orig_path == NULL) |
| 1303 | break; | 1316 | break; |
| 1304 | 1317 | ||
