diff options
author | Qu Wenruo <wqu@suse.com> | 2017-11-07 19:54:26 -0500 |
---|---|---|
committer | David Sterba <dsterba@suse.com> | 2018-01-22 10:08:12 -0500 |
commit | bae15d95e247f94ceb32caaf13d1d71ecbfc8735 (patch) | |
tree | 79a144412a3b0a8ecb9f5631d6f09a5a4d342625 /fs/btrfs/tree-log.c | |
parent | ad7b0368f33cffe67fecd302028915926e50ef7e (diff) |
btrfs: Cleanup existing name_len checks
Since tree-checker has verified leaf when reading from disk, we don't
need the existing verify_dir_item() or btrfs_is_name_len_valid() checks.
Signed-off-by: Qu Wenruo <wqu@suse.com>
Reviewed-by: Nikolay Borisov <nborisov@suse.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
Diffstat (limited to 'fs/btrfs/tree-log.c')
-rw-r--r-- | fs/btrfs/tree-log.c | 47 |
1 files changed, 9 insertions, 38 deletions
diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c index 7bf9b31561db..a806182dfea6 100644 --- a/fs/btrfs/tree-log.c +++ b/fs/btrfs/tree-log.c | |||
@@ -1173,19 +1173,15 @@ next: | |||
1173 | return 0; | 1173 | return 0; |
1174 | } | 1174 | } |
1175 | 1175 | ||
1176 | static int extref_get_fields(struct extent_buffer *eb, int slot, | 1176 | static int extref_get_fields(struct extent_buffer *eb, unsigned long ref_ptr, |
1177 | unsigned long ref_ptr, u32 *namelen, char **name, | 1177 | u32 *namelen, char **name, u64 *index, |
1178 | u64 *index, u64 *parent_objectid) | 1178 | u64 *parent_objectid) |
1179 | { | 1179 | { |
1180 | struct btrfs_inode_extref *extref; | 1180 | struct btrfs_inode_extref *extref; |
1181 | 1181 | ||
1182 | extref = (struct btrfs_inode_extref *)ref_ptr; | 1182 | extref = (struct btrfs_inode_extref *)ref_ptr; |
1183 | 1183 | ||
1184 | *namelen = btrfs_inode_extref_name_len(eb, extref); | 1184 | *namelen = btrfs_inode_extref_name_len(eb, extref); |
1185 | if (!btrfs_is_name_len_valid(eb, slot, (unsigned long)&extref->name, | ||
1186 | *namelen)) | ||
1187 | return -EIO; | ||
1188 | |||
1189 | *name = kmalloc(*namelen, GFP_NOFS); | 1185 | *name = kmalloc(*namelen, GFP_NOFS); |
1190 | if (*name == NULL) | 1186 | if (*name == NULL) |
1191 | return -ENOMEM; | 1187 | return -ENOMEM; |
@@ -1200,19 +1196,14 @@ static int extref_get_fields(struct extent_buffer *eb, int slot, | |||
1200 | return 0; | 1196 | return 0; |
1201 | } | 1197 | } |
1202 | 1198 | ||
1203 | static int ref_get_fields(struct extent_buffer *eb, int slot, | 1199 | static int ref_get_fields(struct extent_buffer *eb, unsigned long ref_ptr, |
1204 | unsigned long ref_ptr, u32 *namelen, char **name, | 1200 | u32 *namelen, char **name, u64 *index) |
1205 | u64 *index) | ||
1206 | { | 1201 | { |
1207 | struct btrfs_inode_ref *ref; | 1202 | struct btrfs_inode_ref *ref; |
1208 | 1203 | ||
1209 | ref = (struct btrfs_inode_ref *)ref_ptr; | 1204 | ref = (struct btrfs_inode_ref *)ref_ptr; |
1210 | 1205 | ||
1211 | *namelen = btrfs_inode_ref_name_len(eb, ref); | 1206 | *namelen = btrfs_inode_ref_name_len(eb, ref); |
1212 | if (!btrfs_is_name_len_valid(eb, slot, (unsigned long)(ref + 1), | ||
1213 | *namelen)) | ||
1214 | return -EIO; | ||
1215 | |||
1216 | *name = kmalloc(*namelen, GFP_NOFS); | 1207 | *name = kmalloc(*namelen, GFP_NOFS); |
1217 | if (*name == NULL) | 1208 | if (*name == NULL) |
1218 | return -ENOMEM; | 1209 | return -ENOMEM; |
@@ -1287,8 +1278,8 @@ static noinline int add_inode_ref(struct btrfs_trans_handle *trans, | |||
1287 | 1278 | ||
1288 | while (ref_ptr < ref_end) { | 1279 | while (ref_ptr < ref_end) { |
1289 | if (log_ref_ver) { | 1280 | if (log_ref_ver) { |
1290 | ret = extref_get_fields(eb, slot, ref_ptr, &namelen, | 1281 | ret = extref_get_fields(eb, ref_ptr, &namelen, &name, |
1291 | &name, &ref_index, &parent_objectid); | 1282 | &ref_index, &parent_objectid); |
1292 | /* | 1283 | /* |
1293 | * parent object can change from one array | 1284 | * parent object can change from one array |
1294 | * item to another. | 1285 | * item to another. |
@@ -1300,8 +1291,8 @@ static noinline int add_inode_ref(struct btrfs_trans_handle *trans, | |||
1300 | goto out; | 1291 | goto out; |
1301 | } | 1292 | } |
1302 | } else { | 1293 | } else { |
1303 | ret = ref_get_fields(eb, slot, ref_ptr, &namelen, | 1294 | ret = ref_get_fields(eb, ref_ptr, &namelen, &name, |
1304 | &name, &ref_index); | 1295 | &ref_index); |
1305 | } | 1296 | } |
1306 | if (ret) | 1297 | if (ret) |
1307 | goto out; | 1298 | goto out; |
@@ -1835,7 +1826,6 @@ static noinline int replay_one_dir_item(struct btrfs_trans_handle *trans, | |||
1835 | struct extent_buffer *eb, int slot, | 1826 | struct extent_buffer *eb, int slot, |
1836 | struct btrfs_key *key) | 1827 | struct btrfs_key *key) |
1837 | { | 1828 | { |
1838 | struct btrfs_fs_info *fs_info = root->fs_info; | ||
1839 | int ret = 0; | 1829 | int ret = 0; |
1840 | u32 item_size = btrfs_item_size_nr(eb, slot); | 1830 | u32 item_size = btrfs_item_size_nr(eb, slot); |
1841 | struct btrfs_dir_item *di; | 1831 | struct btrfs_dir_item *di; |
@@ -1848,8 +1838,6 @@ static noinline int replay_one_dir_item(struct btrfs_trans_handle *trans, | |||
1848 | ptr_end = ptr + item_size; | 1838 | ptr_end = ptr + item_size; |
1849 | while (ptr < ptr_end) { | 1839 | while (ptr < ptr_end) { |
1850 | di = (struct btrfs_dir_item *)ptr; | 1840 | di = (struct btrfs_dir_item *)ptr; |
1851 | if (verify_dir_item(fs_info, eb, slot, di)) | ||
1852 | return -EIO; | ||
1853 | name_len = btrfs_dir_name_len(eb, di); | 1841 | name_len = btrfs_dir_name_len(eb, di); |
1854 | ret = replay_one_name(trans, root, path, eb, di, key); | 1842 | ret = replay_one_name(trans, root, path, eb, di, key); |
1855 | if (ret < 0) | 1843 | if (ret < 0) |
@@ -2024,11 +2012,6 @@ again: | |||
2024 | ptr_end = ptr + item_size; | 2012 | ptr_end = ptr + item_size; |
2025 | while (ptr < ptr_end) { | 2013 | while (ptr < ptr_end) { |
2026 | di = (struct btrfs_dir_item *)ptr; | 2014 | di = (struct btrfs_dir_item *)ptr; |
2027 | if (verify_dir_item(fs_info, eb, slot, di)) { | ||
2028 | ret = -EIO; | ||
2029 | goto out; | ||
2030 | } | ||
2031 | |||
2032 | name_len = btrfs_dir_name_len(eb, di); | 2015 | name_len = btrfs_dir_name_len(eb, di); |
2033 | name = kmalloc(name_len, GFP_NOFS); | 2016 | name = kmalloc(name_len, GFP_NOFS); |
2034 | if (!name) { | 2017 | if (!name) { |
@@ -2109,7 +2092,6 @@ static int replay_xattr_deletes(struct btrfs_trans_handle *trans, | |||
2109 | struct btrfs_path *path, | 2092 | struct btrfs_path *path, |
2110 | const u64 ino) | 2093 | const u64 ino) |
2111 | { | 2094 | { |
2112 | struct btrfs_fs_info *fs_info = root->fs_info; | ||
2113 | struct btrfs_key search_key; | 2095 | struct btrfs_key search_key; |
2114 | struct btrfs_path *log_path; | 2096 | struct btrfs_path *log_path; |
2115 | int i; | 2097 | int i; |
@@ -2151,11 +2133,6 @@ process_leaf: | |||
2151 | u32 this_len = sizeof(*di) + name_len + data_len; | 2133 | u32 this_len = sizeof(*di) + name_len + data_len; |
2152 | char *name; | 2134 | char *name; |
2153 | 2135 | ||
2154 | ret = verify_dir_item(fs_info, path->nodes[0], i, di); | ||
2155 | if (ret) { | ||
2156 | ret = -EIO; | ||
2157 | goto out; | ||
2158 | } | ||
2159 | name = kmalloc(name_len, GFP_NOFS); | 2136 | name = kmalloc(name_len, GFP_NOFS); |
2160 | if (!name) { | 2137 | if (!name) { |
2161 | ret = -ENOMEM; | 2138 | ret = -ENOMEM; |
@@ -4572,12 +4549,6 @@ static int btrfs_check_ref_name_override(struct extent_buffer *eb, | |||
4572 | this_len = sizeof(*extref) + this_name_len; | 4549 | this_len = sizeof(*extref) + this_name_len; |
4573 | } | 4550 | } |
4574 | 4551 | ||
4575 | ret = btrfs_is_name_len_valid(eb, slot, name_ptr, | ||
4576 | this_name_len); | ||
4577 | if (!ret) { | ||
4578 | ret = -EIO; | ||
4579 | goto out; | ||
4580 | } | ||
4581 | if (this_name_len > name_len) { | 4552 | if (this_name_len > name_len) { |
4582 | char *new_name; | 4553 | char *new_name; |
4583 | 4554 | ||