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:
Josef Bacik 2014-10-10 16:57:14 -04:00 committed by David Sterba
parent b25a40651d
commit bb561f5485
1 changed files with 7 additions and 1 deletions

View File

@ -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;