aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTahsin Erdogan <tahsin@google.com>2017-06-21 22:24:38 -0400
committerTheodore Ts'o <tytso@mit.edu>2017-06-21 22:24:38 -0400
commit65d3000520c50f3c160403a210a7504d789eafca (patch)
tree88dce16fde2b58f131fc4a74af7cea2d91645d6e
parentb347e2bcd18eba7ed44659d12e4a39a9b5bdc873 (diff)
ext4: ext4_xattr_delete_inode() should return accurate errors
In a few places the function returns without trying to pass the actual error code to the caller. Fix those. Signed-off-by: Tahsin Erdogan <tahsin@google.com> Signed-off-by: Theodore Ts'o <tytso@mit.edu>
-rw-r--r--fs/ext4/xattr.c16
1 files changed, 10 insertions, 6 deletions
diff --git a/fs/ext4/xattr.c b/fs/ext4/xattr.c
index ab94d6ee496b..c8b71bd118b0 100644
--- a/fs/ext4/xattr.c
+++ b/fs/ext4/xattr.c
@@ -2024,7 +2024,8 @@ ext4_xattr_delete_inode(handle_t *handle, struct inode *inode,
2024 if (!entry->e_value_inum) 2024 if (!entry->e_value_inum)
2025 continue; 2025 continue;
2026 ea_ino = le32_to_cpu(entry->e_value_inum); 2026 ea_ino = le32_to_cpu(entry->e_value_inum);
2027 if (ext4_expand_ino_array(lea_ino_array, ea_ino) != 0) { 2027 error = ext4_expand_ino_array(lea_ino_array, ea_ino);
2028 if (error) {
2028 brelse(iloc.bh); 2029 brelse(iloc.bh);
2029 goto cleanup; 2030 goto cleanup;
2030 } 2031 }
@@ -2035,20 +2036,22 @@ ext4_xattr_delete_inode(handle_t *handle, struct inode *inode,
2035delete_external_ea: 2036delete_external_ea:
2036 if (!EXT4_I(inode)->i_file_acl) { 2037 if (!EXT4_I(inode)->i_file_acl) {
2037 /* add xattr inode to orphan list */ 2038 /* add xattr inode to orphan list */
2038 ext4_xattr_inode_orphan_add(handle, inode, credits, 2039 error = ext4_xattr_inode_orphan_add(handle, inode, credits,
2039 *lea_ino_array); 2040 *lea_ino_array);
2040 goto cleanup; 2041 goto cleanup;
2041 } 2042 }
2042 bh = sb_bread(inode->i_sb, EXT4_I(inode)->i_file_acl); 2043 bh = sb_bread(inode->i_sb, EXT4_I(inode)->i_file_acl);
2043 if (!bh) { 2044 if (!bh) {
2044 EXT4_ERROR_INODE(inode, "block %llu read error", 2045 EXT4_ERROR_INODE(inode, "block %llu read error",
2045 EXT4_I(inode)->i_file_acl); 2046 EXT4_I(inode)->i_file_acl);
2047 error = -EIO;
2046 goto cleanup; 2048 goto cleanup;
2047 } 2049 }
2048 if (BHDR(bh)->h_magic != cpu_to_le32(EXT4_XATTR_MAGIC) || 2050 if (BHDR(bh)->h_magic != cpu_to_le32(EXT4_XATTR_MAGIC) ||
2049 BHDR(bh)->h_blocks != cpu_to_le32(1)) { 2051 BHDR(bh)->h_blocks != cpu_to_le32(1)) {
2050 EXT4_ERROR_INODE(inode, "bad block %llu", 2052 EXT4_ERROR_INODE(inode, "bad block %llu",
2051 EXT4_I(inode)->i_file_acl); 2053 EXT4_I(inode)->i_file_acl);
2054 error = -EFSCORRUPTED;
2052 goto cleanup; 2055 goto cleanup;
2053 } 2056 }
2054 2057
@@ -2057,7 +2060,8 @@ delete_external_ea:
2057 if (!entry->e_value_inum) 2060 if (!entry->e_value_inum)
2058 continue; 2061 continue;
2059 ea_ino = le32_to_cpu(entry->e_value_inum); 2062 ea_ino = le32_to_cpu(entry->e_value_inum);
2060 if (ext4_expand_ino_array(lea_ino_array, ea_ino) != 0) 2063 error = ext4_expand_ino_array(lea_ino_array, ea_ino);
2064 if (error)
2061 goto cleanup; 2065 goto cleanup;
2062 entry->e_value_inum = 0; 2066 entry->e_value_inum = 0;
2063 } 2067 }
@@ -2065,7 +2069,7 @@ delete_external_ea:
2065 /* add xattr inode to orphan list */ 2069 /* add xattr inode to orphan list */
2066 error = ext4_xattr_inode_orphan_add(handle, inode, credits, 2070 error = ext4_xattr_inode_orphan_add(handle, inode, credits,
2067 *lea_ino_array); 2071 *lea_ino_array);
2068 if (error != 0) 2072 if (error)
2069 goto cleanup; 2073 goto cleanup;
2070 2074
2071 if (!IS_NOQUOTA(inode)) 2075 if (!IS_NOQUOTA(inode))
@@ -2075,7 +2079,7 @@ delete_external_ea:
2075 error = ext4_journal_extend(handle, credits); 2079 error = ext4_journal_extend(handle, credits);
2076 if (error > 0) 2080 if (error > 0)
2077 error = ext4_journal_restart(handle, credits); 2081 error = ext4_journal_restart(handle, credits);
2078 if (error != 0) { 2082 if (error) {
2079 ext4_warning(inode->i_sb, 2083 ext4_warning(inode->i_sb,
2080 "couldn't extend journal (err %d)", error); 2084 "couldn't extend journal (err %d)", error);
2081 goto cleanup; 2085 goto cleanup;