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); | 
