Btrfs-progs: add a dummy backref if our location is wrong
authorJosef Bacik <jbacik@fb.com>
Fri, 10 Oct 2014 20:57:14 +0000 (16:57 -0400)
committerDavid Sterba <dsterba@suse.cz>
Tue, 14 Oct 2014 08:45:25 +0000 (10:45 +0200)
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>
cmds-check.c

index 2219e75..8150203 100644 (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;