Skip to content

Commit b0f6ba5

Browse files
adam900710jfvogel
authored andcommitted
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 <[email protected]> Reviewed-by: Nikolay Borisov <[email protected]> Reviewed-by: David Sterba <[email protected]> Signed-off-by: David Sterba <[email protected]> (cherry picked from commit bae15d9) Orabug: 28920621 Signed-off-by: Shan Hai <[email protected]> Reviewed-by: Allen Pais <[email protected]>
1 parent 74b7040 commit b0f6ba5

File tree

9 files changed

+9
-186
lines changed

9 files changed

+9
-186
lines changed

fs/btrfs/ctree.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3048,15 +3048,10 @@ struct btrfs_dir_item *btrfs_lookup_xattr(struct btrfs_trans_handle *trans,
30483048
struct btrfs_path *path, u64 dir,
30493049
const char *name, u16 name_len,
30503050
int mod);
3051-
int verify_dir_item(struct btrfs_fs_info *fs_info,
3052-
struct extent_buffer *leaf, int slot,
3053-
struct btrfs_dir_item *dir_item);
30543051
struct btrfs_dir_item *btrfs_match_dir_item_name(struct btrfs_fs_info *fs_info,
30553052
struct btrfs_path *path,
30563053
const char *name,
30573054
int name_len);
3058-
bool btrfs_is_name_len_valid(struct extent_buffer *leaf, int slot,
3059-
unsigned long start, u16 name_len);
30603055

30613056
/* orphan.c */
30623057
int btrfs_insert_orphan_item(struct btrfs_trans_handle *trans,

fs/btrfs/dir-item.c

Lines changed: 0 additions & 108 deletions
Original file line numberDiff line numberDiff line change
@@ -403,8 +403,6 @@ struct btrfs_dir_item *btrfs_match_dir_item_name(struct btrfs_fs_info *fs_info,
403403
btrfs_dir_data_len(leaf, dir_item);
404404
name_ptr = (unsigned long)(dir_item + 1);
405405

406-
if (verify_dir_item(fs_info, leaf, path->slots[0], dir_item))
407-
return NULL;
408406
if (btrfs_dir_name_len(leaf, dir_item) == name_len &&
409407
memcmp_extent_buffer(leaf, name, name_ptr, name_len) == 0)
410408
return dir_item;
@@ -450,109 +448,3 @@ int btrfs_delete_one_dir_name(struct btrfs_trans_handle *trans,
450448
}
451449
return ret;
452450
}
453-
454-
int verify_dir_item(struct btrfs_fs_info *fs_info,
455-
struct extent_buffer *leaf,
456-
int slot,
457-
struct btrfs_dir_item *dir_item)
458-
{
459-
u16 namelen = BTRFS_NAME_LEN;
460-
int ret;
461-
u8 type = btrfs_dir_type(leaf, dir_item);
462-
463-
if (type >= BTRFS_FT_MAX) {
464-
btrfs_crit(fs_info, "invalid dir item type: %d", (int)type);
465-
return 1;
466-
}
467-
468-
if (type == BTRFS_FT_XATTR)
469-
namelen = XATTR_NAME_MAX;
470-
471-
if (btrfs_dir_name_len(leaf, dir_item) > namelen) {
472-
btrfs_crit(fs_info, "invalid dir item name len: %u",
473-
(unsigned)btrfs_dir_name_len(leaf, dir_item));
474-
return 1;
475-
}
476-
477-
namelen = btrfs_dir_name_len(leaf, dir_item);
478-
ret = btrfs_is_name_len_valid(leaf, slot,
479-
(unsigned long)(dir_item + 1), namelen);
480-
if (!ret)
481-
return 1;
482-
483-
/* BTRFS_MAX_XATTR_SIZE is the same for all dir items */
484-
if ((btrfs_dir_data_len(leaf, dir_item) +
485-
btrfs_dir_name_len(leaf, dir_item)) >
486-
BTRFS_MAX_XATTR_SIZE(fs_info)) {
487-
btrfs_crit(fs_info, "invalid dir item name + data len: %u + %u",
488-
(unsigned)btrfs_dir_name_len(leaf, dir_item),
489-
(unsigned)btrfs_dir_data_len(leaf, dir_item));
490-
return 1;
491-
}
492-
493-
return 0;
494-
}
495-
496-
bool btrfs_is_name_len_valid(struct extent_buffer *leaf, int slot,
497-
unsigned long start, u16 name_len)
498-
{
499-
struct btrfs_fs_info *fs_info = leaf->fs_info;
500-
struct btrfs_key key;
501-
u32 read_start;
502-
u32 read_end;
503-
u32 item_start;
504-
u32 item_end;
505-
u32 size;
506-
bool ret = true;
507-
508-
ASSERT(start > BTRFS_LEAF_DATA_OFFSET);
509-
510-
read_start = start - BTRFS_LEAF_DATA_OFFSET;
511-
read_end = read_start + name_len;
512-
item_start = btrfs_item_offset_nr(leaf, slot);
513-
item_end = btrfs_item_end_nr(leaf, slot);
514-
515-
btrfs_item_key_to_cpu(leaf, &key, slot);
516-
517-
switch (key.type) {
518-
case BTRFS_DIR_ITEM_KEY:
519-
case BTRFS_XATTR_ITEM_KEY:
520-
case BTRFS_DIR_INDEX_KEY:
521-
size = sizeof(struct btrfs_dir_item);
522-
break;
523-
case BTRFS_INODE_REF_KEY:
524-
size = sizeof(struct btrfs_inode_ref);
525-
break;
526-
case BTRFS_INODE_EXTREF_KEY:
527-
size = sizeof(struct btrfs_inode_extref);
528-
break;
529-
case BTRFS_ROOT_REF_KEY:
530-
case BTRFS_ROOT_BACKREF_KEY:
531-
size = sizeof(struct btrfs_root_ref);
532-
break;
533-
default:
534-
ret = false;
535-
goto out;
536-
}
537-
538-
if (read_start < item_start) {
539-
ret = false;
540-
goto out;
541-
}
542-
if (read_end > item_end) {
543-
ret = false;
544-
goto out;
545-
}
546-
547-
/* there shall be item(s) before name */
548-
if (read_start - item_start < size) {
549-
ret = false;
550-
goto out;
551-
}
552-
553-
out:
554-
if (!ret)
555-
btrfs_crit(fs_info, "invalid dir item name len: %u",
556-
(unsigned int)name_len);
557-
return ret;
558-
}

fs/btrfs/export.c

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -283,11 +283,6 @@ static int btrfs_get_name(struct dentry *parent, char *name,
283283
name_len = btrfs_inode_ref_name_len(leaf, iref);
284284
}
285285

286-
ret = btrfs_is_name_len_valid(leaf, path->slots[0], name_ptr, name_len);
287-
if (!ret) {
288-
btrfs_free_path(path);
289-
return -EIO;
290-
}
291286
read_extent_buffer(leaf, name, name_ptr, name_len);
292287
btrfs_free_path(path);
293288

fs/btrfs/inode.c

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5705,7 +5705,6 @@ static int btrfs_filldir(void *addr, int entries, struct dir_context *ctx)
57055705
static int btrfs_real_readdir(struct file *file, struct dir_context *ctx)
57065706
{
57075707
struct inode *inode = file_inode(file);
5708-
struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb);
57095708
struct btrfs_root *root = BTRFS_I(inode)->root;
57105709
struct btrfs_file_private *private = file->private_data;
57115710
struct btrfs_dir_item *di;
@@ -5773,9 +5772,6 @@ static int btrfs_real_readdir(struct file *file, struct dir_context *ctx)
57735772
if (btrfs_should_delete_dir_index(&del_list, found_key.offset))
57745773
goto next;
57755774
di = btrfs_item_ptr(leaf, slot, struct btrfs_dir_item);
5776-
if (verify_dir_item(fs_info, leaf, slot, di))
5777-
goto next;
5778-
57795775
name_len = btrfs_dir_name_len(leaf, di);
57805776
if ((total_len + sizeof(struct dir_entry) + name_len) >=
57815777
PAGE_SIZE) {

fs/btrfs/props.c

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,6 @@ static int iterate_object_props(struct btrfs_root *root,
164164
size_t),
165165
void *ctx)
166166
{
167-
struct btrfs_fs_info *fs_info = root->fs_info;
168167
int ret;
169168
char *name_buf = NULL;
170169
char *value_buf = NULL;
@@ -215,12 +214,6 @@ static int iterate_object_props(struct btrfs_root *root,
215214
name_ptr = (unsigned long)(di + 1);
216215
data_ptr = name_ptr + name_len;
217216

218-
if (verify_dir_item(fs_info, leaf,
219-
path->slots[0], di)) {
220-
ret = -EIO;
221-
goto out;
222-
}
223-
224217
if (name_len <= XATTR_BTRFS_PREFIX_LEN ||
225218
memcmp_extent_buffer(leaf, XATTR_BTRFS_PREFIX,
226219
name_ptr,

fs/btrfs/root-tree.c

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -391,13 +391,6 @@ int btrfs_del_root_ref(struct btrfs_trans_handle *trans,
391391
WARN_ON(btrfs_root_ref_dirid(leaf, ref) != dirid);
392392
WARN_ON(btrfs_root_ref_name_len(leaf, ref) != name_len);
393393
ptr = (unsigned long)(ref + 1);
394-
ret = btrfs_is_name_len_valid(leaf, path->slots[0], ptr,
395-
name_len);
396-
if (!ret) {
397-
err = -EIO;
398-
goto out;
399-
}
400-
401394
WARN_ON(memcmp_extent_buffer(leaf, name, ptr, name_len));
402395
*sequence = btrfs_root_ref_sequence(leaf, ref);
403396

fs/btrfs/send.c

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1060,12 +1060,6 @@ static int iterate_dir_item(struct btrfs_root *root, struct btrfs_path *path,
10601060
}
10611061
}
10621062

1063-
ret = btrfs_is_name_len_valid(eb, path->slots[0],
1064-
(unsigned long)(di + 1), name_len + data_len);
1065-
if (!ret) {
1066-
ret = -EIO;
1067-
goto out;
1068-
}
10691063
if (name_len + data_len > buf_len) {
10701064
buf_len = name_len + data_len;
10711065
if (is_vmalloc_addr(buf)) {

fs/btrfs/tree-log.c

Lines changed: 9 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1176,19 +1176,15 @@ static inline int __add_inode_ref(struct btrfs_trans_handle *trans,
11761176
return 0;
11771177
}
11781178

1179-
static int extref_get_fields(struct extent_buffer *eb, int slot,
1180-
unsigned long ref_ptr, u32 *namelen, char **name,
1181-
u64 *index, u64 *parent_objectid)
1179+
static int extref_get_fields(struct extent_buffer *eb, unsigned long ref_ptr,
1180+
u32 *namelen, char **name, u64 *index,
1181+
u64 *parent_objectid)
11821182
{
11831183
struct btrfs_inode_extref *extref;
11841184

11851185
extref = (struct btrfs_inode_extref *)ref_ptr;
11861186

11871187
*namelen = btrfs_inode_extref_name_len(eb, extref);
1188-
if (!btrfs_is_name_len_valid(eb, slot, (unsigned long)&extref->name,
1189-
*namelen))
1190-
return -EIO;
1191-
11921188
*name = kmalloc(*namelen, GFP_NOFS);
11931189
if (*name == NULL)
11941190
return -ENOMEM;
@@ -1204,19 +1200,14 @@ static int extref_get_fields(struct extent_buffer *eb, int slot,
12041200
return 0;
12051201
}
12061202

1207-
static int ref_get_fields(struct extent_buffer *eb, int slot,
1208-
unsigned long ref_ptr, u32 *namelen, char **name,
1209-
u64 *index)
1203+
static int ref_get_fields(struct extent_buffer *eb, unsigned long ref_ptr,
1204+
u32 *namelen, char **name, u64 *index)
12101205
{
12111206
struct btrfs_inode_ref *ref;
12121207

12131208
ref = (struct btrfs_inode_ref *)ref_ptr;
12141209

12151210
*namelen = btrfs_inode_ref_name_len(eb, ref);
1216-
if (!btrfs_is_name_len_valid(eb, slot, (unsigned long)(ref + 1),
1217-
*namelen))
1218-
return -EIO;
1219-
12201211
*name = kmalloc(*namelen, GFP_NOFS);
12211212
if (*name == NULL)
12221213
return -ENOMEM;
@@ -1424,8 +1415,8 @@ static noinline int add_inode_ref(struct btrfs_trans_handle *trans,
14241415

14251416
while (ref_ptr < ref_end) {
14261417
if (log_ref_ver) {
1427-
ret = extref_get_fields(eb, slot, ref_ptr, &namelen,
1428-
&name, &ref_index, &parent_objectid);
1418+
ret = extref_get_fields(eb, ref_ptr, &namelen, &name,
1419+
&ref_index, &parent_objectid);
14291420
/*
14301421
* parent object can change from one array
14311422
* item to another.
@@ -1437,8 +1428,8 @@ static noinline int add_inode_ref(struct btrfs_trans_handle *trans,
14371428
goto out;
14381429
}
14391430
} else {
1440-
ret = ref_get_fields(eb, slot, ref_ptr, &namelen,
1441-
&name, &ref_index);
1431+
ret = ref_get_fields(eb, ref_ptr, &namelen, &name,
1432+
&ref_index);
14421433
}
14431434
if (ret)
14441435
goto out;
@@ -2011,7 +2002,6 @@ static noinline int replay_one_dir_item(struct btrfs_trans_handle *trans,
20112002
struct extent_buffer *eb, int slot,
20122003
struct btrfs_key *key)
20132004
{
2014-
struct btrfs_fs_info *fs_info = root->fs_info;
20152005
int ret = 0;
20162006
u32 item_size = btrfs_item_size_nr(eb, slot);
20172007
struct btrfs_dir_item *di;
@@ -2024,8 +2014,6 @@ static noinline int replay_one_dir_item(struct btrfs_trans_handle *trans,
20242014
ptr_end = ptr + item_size;
20252015
while (ptr < ptr_end) {
20262016
di = (struct btrfs_dir_item *)ptr;
2027-
if (verify_dir_item(fs_info, eb, slot, di))
2028-
return -EIO;
20292017
name_len = btrfs_dir_name_len(eb, di);
20302018
ret = replay_one_name(trans, root, path, eb, di, key);
20312019
if (ret < 0)
@@ -2200,11 +2188,6 @@ static noinline int check_item_in_log(struct btrfs_trans_handle *trans,
22002188
ptr_end = ptr + item_size;
22012189
while (ptr < ptr_end) {
22022190
di = (struct btrfs_dir_item *)ptr;
2203-
if (verify_dir_item(fs_info, eb, slot, di)) {
2204-
ret = -EIO;
2205-
goto out;
2206-
}
2207-
22082191
name_len = btrfs_dir_name_len(eb, di);
22092192
name = kmalloc(name_len, GFP_NOFS);
22102193
if (!name) {
@@ -2285,7 +2268,6 @@ static int replay_xattr_deletes(struct btrfs_trans_handle *trans,
22852268
struct btrfs_path *path,
22862269
const u64 ino)
22872270
{
2288-
struct btrfs_fs_info *fs_info = root->fs_info;
22892271
struct btrfs_key search_key;
22902272
struct btrfs_path *log_path;
22912273
int i;
@@ -2327,11 +2309,6 @@ static int replay_xattr_deletes(struct btrfs_trans_handle *trans,
23272309
u32 this_len = sizeof(*di) + name_len + data_len;
23282310
char *name;
23292311

2330-
ret = verify_dir_item(fs_info, path->nodes[0], i, di);
2331-
if (ret) {
2332-
ret = -EIO;
2333-
goto out;
2334-
}
23352312
name = kmalloc(name_len, GFP_NOFS);
23362313
if (!name) {
23372314
ret = -ENOMEM;
@@ -4938,12 +4915,6 @@ static int btrfs_check_ref_name_override(struct extent_buffer *eb,
49384915
this_len = sizeof(*extref) + this_name_len;
49394916
}
49404917

4941-
ret = btrfs_is_name_len_valid(eb, slot, name_ptr,
4942-
this_name_len);
4943-
if (!ret) {
4944-
ret = -EIO;
4945-
goto out;
4946-
}
49474918
if (this_name_len > name_len) {
49484919
char *new_name;
49494920

fs/btrfs/xattr.c

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,6 @@ ssize_t btrfs_listxattr(struct dentry *dentry, char *buffer, size_t size)
267267
{
268268
struct btrfs_key key;
269269
struct inode *inode = d_inode(dentry);
270-
struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb);
271270
struct btrfs_root *root = BTRFS_I(inode)->root;
272271
struct btrfs_path *path;
273272
int ret = 0;
@@ -336,11 +335,6 @@ ssize_t btrfs_listxattr(struct dentry *dentry, char *buffer, size_t size)
336335
u32 this_len = sizeof(*di) + name_len + data_len;
337336
unsigned long name_ptr = (unsigned long)(di + 1);
338337

339-
if (verify_dir_item(fs_info, leaf, slot, di)) {
340-
ret = -EIO;
341-
goto err;
342-
}
343-
344338
total_size += name_len + 1;
345339
/*
346340
* We are just looking for how big our buffer needs to

0 commit comments

Comments
 (0)