aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/tree-log.c
diff options
context:
space:
mode:
authorQu Wenruo <wqu@suse.com>2017-11-07 19:54:26 -0500
committerDavid Sterba <dsterba@suse.com>2018-01-22 10:08:12 -0500
commitbae15d95e247f94ceb32caaf13d1d71ecbfc8735 (patch)
tree79a144412a3b0a8ecb9f5631d6f09a5a4d342625 /fs/btrfs/tree-log.c
parentad7b0368f33cffe67fecd302028915926e50ef7e (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.c47
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
1176static int extref_get_fields(struct extent_buffer *eb, int slot, 1176static 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
1203static int ref_get_fields(struct extent_buffer *eb, int slot, 1199static 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