Btrfs-progs: add a dummy backref if our location is wrong
If our location is bogus in our dir item we were just skipping the thing. However in this case we want to just delete the dir index, so create a dummy inode rec using BTRFS_MULTIPLE_OBJECTIDS and just add every backref we find to the list so we know to straight up delete all of these items. Thanks, Signed-off-by: Josef Bacik <jbacik@fb.com> Signed-off-by: David Sterba <dsterba@suse.cz>
This commit is contained in:
parent
b25a40651d
commit
bb561f5485
|
@ -563,6 +563,8 @@ static struct inode_backref *get_inode_backref(struct inode_record *rec,
|
|||
struct inode_backref *backref;
|
||||
|
||||
list_for_each_entry(backref, &rec->backrefs, list) {
|
||||
if (rec->ino == BTRFS_MULTIPLE_OBJECTIDS)
|
||||
break;
|
||||
if (backref->dir != dir || backref->namelen != namelen)
|
||||
continue;
|
||||
if (memcmp(name, backref->name, namelen))
|
||||
|
@ -1004,7 +1006,11 @@ static int process_dir_item(struct btrfs_root *root,
|
|||
namebuf, len, filetype,
|
||||
key->type, error);
|
||||
} else {
|
||||
fprintf(stderr, "warning line %d\n", __LINE__);
|
||||
fprintf(stderr, "invalid location in dir item %u\n",
|
||||
location.type);
|
||||
add_inode_backref(inode_cache, BTRFS_MULTIPLE_OBJECTIDS,
|
||||
key->objectid, key->offset, namebuf,
|
||||
len, filetype, key->type, error);
|
||||
}
|
||||
|
||||
len = sizeof(*di) + name_len + data_len;
|
||||
|
|
Loading…
Reference in New Issue