diff options
Diffstat (limited to 'fs/ext4/move_extent.c')
-rw-r--r-- | fs/ext4/move_extent.c | 36 |
1 files changed, 19 insertions, 17 deletions
diff --git a/fs/ext4/move_extent.c b/fs/ext4/move_extent.c index 82c415be87a4..aa5fe28d180f 100644 --- a/fs/ext4/move_extent.c +++ b/fs/ext4/move_extent.c | |||
@@ -152,12 +152,12 @@ mext_check_null_inode(struct inode *inode1, struct inode *inode2, | |||
152 | int ret = 0; | 152 | int ret = 0; |
153 | 153 | ||
154 | if (inode1 == NULL) { | 154 | if (inode1 == NULL) { |
155 | ext4_error(inode2->i_sb, function, | 155 | __ext4_error(inode2->i_sb, function, |
156 | "Both inodes should not be NULL: " | 156 | "Both inodes should not be NULL: " |
157 | "inode1 NULL inode2 %lu", inode2->i_ino); | 157 | "inode1 NULL inode2 %lu", inode2->i_ino); |
158 | ret = -EIO; | 158 | ret = -EIO; |
159 | } else if (inode2 == NULL) { | 159 | } else if (inode2 == NULL) { |
160 | ext4_error(inode1->i_sb, function, | 160 | __ext4_error(inode1->i_sb, function, |
161 | "Both inodes should not be NULL: " | 161 | "Both inodes should not be NULL: " |
162 | "inode1 %lu inode2 NULL", inode1->i_ino); | 162 | "inode1 %lu inode2 NULL", inode1->i_ino); |
163 | ret = -EIO; | 163 | ret = -EIO; |
@@ -252,6 +252,7 @@ mext_insert_across_blocks(handle_t *handle, struct inode *orig_inode, | |||
252 | } | 252 | } |
253 | 253 | ||
254 | o_start->ee_len = start_ext->ee_len; | 254 | o_start->ee_len = start_ext->ee_len; |
255 | eblock = le32_to_cpu(start_ext->ee_block); | ||
255 | new_flag = 1; | 256 | new_flag = 1; |
256 | 257 | ||
257 | } else if (start_ext->ee_len && new_ext->ee_len && | 258 | } else if (start_ext->ee_len && new_ext->ee_len && |
@@ -262,6 +263,7 @@ mext_insert_across_blocks(handle_t *handle, struct inode *orig_inode, | |||
262 | * orig |------------------------------| | 263 | * orig |------------------------------| |
263 | */ | 264 | */ |
264 | o_start->ee_len = start_ext->ee_len; | 265 | o_start->ee_len = start_ext->ee_len; |
266 | eblock = le32_to_cpu(start_ext->ee_block); | ||
265 | new_flag = 1; | 267 | new_flag = 1; |
266 | 268 | ||
267 | } else if (!start_ext->ee_len && new_ext->ee_len && | 269 | } else if (!start_ext->ee_len && new_ext->ee_len && |
@@ -475,7 +477,6 @@ mext_leaf_block(handle_t *handle, struct inode *orig_inode, | |||
475 | struct ext4_extent *oext, *o_start, *o_end, *prev_ext; | 477 | struct ext4_extent *oext, *o_start, *o_end, *prev_ext; |
476 | struct ext4_extent new_ext, start_ext, end_ext; | 478 | struct ext4_extent new_ext, start_ext, end_ext; |
477 | ext4_lblk_t new_ext_end; | 479 | ext4_lblk_t new_ext_end; |
478 | ext4_fsblk_t new_phys_end; | ||
479 | int oext_alen, new_ext_alen, end_ext_alen; | 480 | int oext_alen, new_ext_alen, end_ext_alen; |
480 | int depth = ext_depth(orig_inode); | 481 | int depth = ext_depth(orig_inode); |
481 | int ret; | 482 | int ret; |
@@ -489,7 +490,6 @@ mext_leaf_block(handle_t *handle, struct inode *orig_inode, | |||
489 | new_ext.ee_len = dext->ee_len; | 490 | new_ext.ee_len = dext->ee_len; |
490 | new_ext_alen = ext4_ext_get_actual_len(&new_ext); | 491 | new_ext_alen = ext4_ext_get_actual_len(&new_ext); |
491 | new_ext_end = le32_to_cpu(new_ext.ee_block) + new_ext_alen - 1; | 492 | new_ext_end = le32_to_cpu(new_ext.ee_block) + new_ext_alen - 1; |
492 | new_phys_end = ext_pblock(&new_ext) + new_ext_alen - 1; | ||
493 | 493 | ||
494 | /* | 494 | /* |
495 | * Case: original extent is first | 495 | * Case: original extent is first |
@@ -502,6 +502,7 @@ mext_leaf_block(handle_t *handle, struct inode *orig_inode, | |||
502 | le32_to_cpu(oext->ee_block) + oext_alen) { | 502 | le32_to_cpu(oext->ee_block) + oext_alen) { |
503 | start_ext.ee_len = cpu_to_le16(le32_to_cpu(new_ext.ee_block) - | 503 | start_ext.ee_len = cpu_to_le16(le32_to_cpu(new_ext.ee_block) - |
504 | le32_to_cpu(oext->ee_block)); | 504 | le32_to_cpu(oext->ee_block)); |
505 | start_ext.ee_block = oext->ee_block; | ||
505 | copy_extent_status(oext, &start_ext); | 506 | copy_extent_status(oext, &start_ext); |
506 | } else if (oext > EXT_FIRST_EXTENT(orig_path[depth].p_hdr)) { | 507 | } else if (oext > EXT_FIRST_EXTENT(orig_path[depth].p_hdr)) { |
507 | prev_ext = oext - 1; | 508 | prev_ext = oext - 1; |
@@ -515,6 +516,7 @@ mext_leaf_block(handle_t *handle, struct inode *orig_inode, | |||
515 | start_ext.ee_len = cpu_to_le16( | 516 | start_ext.ee_len = cpu_to_le16( |
516 | ext4_ext_get_actual_len(prev_ext) + | 517 | ext4_ext_get_actual_len(prev_ext) + |
517 | new_ext_alen); | 518 | new_ext_alen); |
519 | start_ext.ee_block = oext->ee_block; | ||
518 | copy_extent_status(prev_ext, &start_ext); | 520 | copy_extent_status(prev_ext, &start_ext); |
519 | new_ext.ee_len = 0; | 521 | new_ext.ee_len = 0; |
520 | } | 522 | } |
@@ -526,7 +528,7 @@ mext_leaf_block(handle_t *handle, struct inode *orig_inode, | |||
526 | * new_ext |-------| | 528 | * new_ext |-------| |
527 | */ | 529 | */ |
528 | if (le32_to_cpu(oext->ee_block) + oext_alen - 1 < new_ext_end) { | 530 | if (le32_to_cpu(oext->ee_block) + oext_alen - 1 < new_ext_end) { |
529 | ext4_error(orig_inode->i_sb, __func__, | 531 | ext4_error(orig_inode->i_sb, |
530 | "new_ext_end(%u) should be less than or equal to " | 532 | "new_ext_end(%u) should be less than or equal to " |
531 | "oext->ee_block(%u) + oext_alen(%d) - 1", | 533 | "oext->ee_block(%u) + oext_alen(%d) - 1", |
532 | new_ext_end, le32_to_cpu(oext->ee_block), | 534 | new_ext_end, le32_to_cpu(oext->ee_block), |
@@ -689,12 +691,12 @@ mext_replace_branches(handle_t *handle, struct inode *orig_inode, | |||
689 | while (1) { | 691 | while (1) { |
690 | /* The extent for donor must be found. */ | 692 | /* The extent for donor must be found. */ |
691 | if (!dext) { | 693 | if (!dext) { |
692 | ext4_error(donor_inode->i_sb, __func__, | 694 | ext4_error(donor_inode->i_sb, |
693 | "The extent for donor must be found"); | 695 | "The extent for donor must be found"); |
694 | *err = -EIO; | 696 | *err = -EIO; |
695 | goto out; | 697 | goto out; |
696 | } else if (donor_off != le32_to_cpu(tmp_dext.ee_block)) { | 698 | } else if (donor_off != le32_to_cpu(tmp_dext.ee_block)) { |
697 | ext4_error(donor_inode->i_sb, __func__, | 699 | ext4_error(donor_inode->i_sb, |
698 | "Donor offset(%u) and the first block of donor " | 700 | "Donor offset(%u) and the first block of donor " |
699 | "extent(%u) should be equal", | 701 | "extent(%u) should be equal", |
700 | donor_off, | 702 | donor_off, |
@@ -928,7 +930,7 @@ out2: | |||
928 | } | 930 | } |
929 | 931 | ||
930 | /** | 932 | /** |
931 | * mext_check_argumants - Check whether move extent can be done | 933 | * mext_check_arguments - Check whether move extent can be done |
932 | * | 934 | * |
933 | * @orig_inode: original inode | 935 | * @orig_inode: original inode |
934 | * @donor_inode: donor inode | 936 | * @donor_inode: donor inode |
@@ -949,14 +951,6 @@ mext_check_arguments(struct inode *orig_inode, | |||
949 | unsigned int blkbits = orig_inode->i_blkbits; | 951 | unsigned int blkbits = orig_inode->i_blkbits; |
950 | unsigned int blocksize = 1 << blkbits; | 952 | unsigned int blocksize = 1 << blkbits; |
951 | 953 | ||
952 | /* Regular file check */ | ||
953 | if (!S_ISREG(orig_inode->i_mode) || !S_ISREG(donor_inode->i_mode)) { | ||
954 | ext4_debug("ext4 move extent: The argument files should be " | ||
955 | "regular file [ino:orig %lu, donor %lu]\n", | ||
956 | orig_inode->i_ino, donor_inode->i_ino); | ||
957 | return -EINVAL; | ||
958 | } | ||
959 | |||
960 | if (donor_inode->i_mode & (S_ISUID|S_ISGID)) { | 954 | if (donor_inode->i_mode & (S_ISUID|S_ISGID)) { |
961 | ext4_debug("ext4 move extent: suid or sgid is set" | 955 | ext4_debug("ext4 move extent: suid or sgid is set" |
962 | " to donor file [ino:orig %lu, donor %lu]\n", | 956 | " to donor file [ino:orig %lu, donor %lu]\n", |
@@ -1204,6 +1198,14 @@ ext4_move_extents(struct file *o_filp, struct file *d_filp, | |||
1204 | return -EINVAL; | 1198 | return -EINVAL; |
1205 | } | 1199 | } |
1206 | 1200 | ||
1201 | /* Regular file check */ | ||
1202 | if (!S_ISREG(orig_inode->i_mode) || !S_ISREG(donor_inode->i_mode)) { | ||
1203 | ext4_debug("ext4 move extent: The argument files should be " | ||
1204 | "regular file [ino:orig %lu, donor %lu]\n", | ||
1205 | orig_inode->i_ino, donor_inode->i_ino); | ||
1206 | return -EINVAL; | ||
1207 | } | ||
1208 | |||
1207 | /* Protect orig and donor inodes against a truncate */ | 1209 | /* Protect orig and donor inodes against a truncate */ |
1208 | ret1 = mext_inode_double_lock(orig_inode, donor_inode); | 1210 | ret1 = mext_inode_double_lock(orig_inode, donor_inode); |
1209 | if (ret1 < 0) | 1211 | if (ret1 < 0) |
@@ -1351,7 +1353,7 @@ ext4_move_extents(struct file *o_filp, struct file *d_filp, | |||
1351 | if (ret1 < 0) | 1353 | if (ret1 < 0) |
1352 | break; | 1354 | break; |
1353 | if (*moved_len > len) { | 1355 | if (*moved_len > len) { |
1354 | ext4_error(orig_inode->i_sb, __func__, | 1356 | ext4_error(orig_inode->i_sb, |
1355 | "We replaced blocks too much! " | 1357 | "We replaced blocks too much! " |
1356 | "sum of replaced: %llu requested: %llu", | 1358 | "sum of replaced: %llu requested: %llu", |
1357 | *moved_len, len); | 1359 | *moved_len, len); |