diff options
Diffstat (limited to 'fs/ext4/move_extent.c')
-rw-r--r-- | fs/ext4/move_extent.c | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/fs/ext4/move_extent.c b/fs/ext4/move_extent.c index d1fc662cc311..52abfa12762a 100644 --- a/fs/ext4/move_extent.c +++ b/fs/ext4/move_extent.c | |||
@@ -482,6 +482,7 @@ mext_leaf_block(handle_t *handle, struct inode *orig_inode, | |||
482 | int depth = ext_depth(orig_inode); | 482 | int depth = ext_depth(orig_inode); |
483 | int ret; | 483 | int ret; |
484 | 484 | ||
485 | start_ext.ee_block = end_ext.ee_block = 0; | ||
485 | o_start = o_end = oext = orig_path[depth].p_ext; | 486 | o_start = o_end = oext = orig_path[depth].p_ext; |
486 | oext_alen = ext4_ext_get_actual_len(oext); | 487 | oext_alen = ext4_ext_get_actual_len(oext); |
487 | start_ext.ee_len = end_ext.ee_len = 0; | 488 | start_ext.ee_len = end_ext.ee_len = 0; |
@@ -529,7 +530,7 @@ mext_leaf_block(handle_t *handle, struct inode *orig_inode, | |||
529 | * new_ext |-------| | 530 | * new_ext |-------| |
530 | */ | 531 | */ |
531 | if (le32_to_cpu(oext->ee_block) + oext_alen - 1 < new_ext_end) { | 532 | if (le32_to_cpu(oext->ee_block) + oext_alen - 1 < new_ext_end) { |
532 | ext4_error(orig_inode->i_sb, | 533 | EXT4_ERROR_INODE(orig_inode, |
533 | "new_ext_end(%u) should be less than or equal to " | 534 | "new_ext_end(%u) should be less than or equal to " |
534 | "oext->ee_block(%u) + oext_alen(%d) - 1", | 535 | "oext->ee_block(%u) + oext_alen(%d) - 1", |
535 | new_ext_end, le32_to_cpu(oext->ee_block), | 536 | new_ext_end, le32_to_cpu(oext->ee_block), |
@@ -692,12 +693,12 @@ mext_replace_branches(handle_t *handle, struct inode *orig_inode, | |||
692 | while (1) { | 693 | while (1) { |
693 | /* The extent for donor must be found. */ | 694 | /* The extent for donor must be found. */ |
694 | if (!dext) { | 695 | if (!dext) { |
695 | ext4_error(donor_inode->i_sb, | 696 | EXT4_ERROR_INODE(donor_inode, |
696 | "The extent for donor must be found"); | 697 | "The extent for donor must be found"); |
697 | *err = -EIO; | 698 | *err = -EIO; |
698 | goto out; | 699 | goto out; |
699 | } else if (donor_off != le32_to_cpu(tmp_dext.ee_block)) { | 700 | } else if (donor_off != le32_to_cpu(tmp_dext.ee_block)) { |
700 | ext4_error(donor_inode->i_sb, | 701 | EXT4_ERROR_INODE(donor_inode, |
701 | "Donor offset(%u) and the first block of donor " | 702 | "Donor offset(%u) and the first block of donor " |
702 | "extent(%u) should be equal", | 703 | "extent(%u) should be equal", |
703 | donor_off, | 704 | donor_off, |
@@ -959,6 +960,9 @@ mext_check_arguments(struct inode *orig_inode, | |||
959 | return -EINVAL; | 960 | return -EINVAL; |
960 | } | 961 | } |
961 | 962 | ||
963 | if (IS_IMMUTABLE(donor_inode) || IS_APPEND(donor_inode)) | ||
964 | return -EPERM; | ||
965 | |||
962 | /* Ext4 move extent does not support swapfile */ | 966 | /* Ext4 move extent does not support swapfile */ |
963 | if (IS_SWAPFILE(orig_inode) || IS_SWAPFILE(donor_inode)) { | 967 | if (IS_SWAPFILE(orig_inode) || IS_SWAPFILE(donor_inode)) { |
964 | ext4_debug("ext4 move extent: The argument files should " | 968 | ext4_debug("ext4 move extent: The argument files should " |
@@ -976,11 +980,11 @@ mext_check_arguments(struct inode *orig_inode, | |||
976 | } | 980 | } |
977 | 981 | ||
978 | /* Ext4 move extent supports only extent based file */ | 982 | /* Ext4 move extent supports only extent based file */ |
979 | if (!(EXT4_I(orig_inode)->i_flags & EXT4_EXTENTS_FL)) { | 983 | if (!(ext4_test_inode_flag(orig_inode, EXT4_INODE_EXTENTS))) { |
980 | ext4_debug("ext4 move extent: orig file is not extents " | 984 | ext4_debug("ext4 move extent: orig file is not extents " |
981 | "based file [ino:orig %lu]\n", orig_inode->i_ino); | 985 | "based file [ino:orig %lu]\n", orig_inode->i_ino); |
982 | return -EOPNOTSUPP; | 986 | return -EOPNOTSUPP; |
983 | } else if (!(EXT4_I(donor_inode)->i_flags & EXT4_EXTENTS_FL)) { | 987 | } else if (!(ext4_test_inode_flag(donor_inode, EXT4_INODE_EXTENTS))) { |
984 | ext4_debug("ext4 move extent: donor file is not extents " | 988 | ext4_debug("ext4 move extent: donor file is not extents " |
985 | "based file [ino:donor %lu]\n", donor_inode->i_ino); | 989 | "based file [ino:donor %lu]\n", donor_inode->i_ino); |
986 | return -EOPNOTSUPP; | 990 | return -EOPNOTSUPP; |
@@ -1354,7 +1358,7 @@ ext4_move_extents(struct file *o_filp, struct file *d_filp, | |||
1354 | if (ret1 < 0) | 1358 | if (ret1 < 0) |
1355 | break; | 1359 | break; |
1356 | if (*moved_len > len) { | 1360 | if (*moved_len > len) { |
1357 | ext4_error(orig_inode->i_sb, | 1361 | EXT4_ERROR_INODE(orig_inode, |
1358 | "We replaced blocks too much! " | 1362 | "We replaced blocks too much! " |
1359 | "sum of replaced: %llu requested: %llu", | 1363 | "sum of replaced: %llu requested: %llu", |
1360 | *moved_len, len); | 1364 | *moved_len, len); |