Btrfs-progs: add ability to replace missing dir item/dir indexes
authorJosef Bacik <jbacik@fb.com>
Fri, 31 Oct 2014 18:01:26 +0000 (14:01 -0400)
committerDavid Sterba <dsterba@suse.cz>
Fri, 14 Nov 2014 10:00:43 +0000 (11:00 +0100)
If we have everything except the dir item and dir index we can easily replace
them, so add this ability to btrfsck.  Thanks,

Signed-off-by: Josef Bacik <jbacik@fb.com>
Signed-off-by: David Sterba <dsterba@suse.cz>
cmds-check.c

index 923fb10c0a1503529879a80c2a1c924e7c518022..f42e3c5ce2734c5b49df9b7c8461e40adfe09453 100644 (file)
@@ -1772,6 +1772,33 @@ static int repair_inode_backrefs(struct btrfs_root *root,
                        }
                }
 
+               if (!delete && (!backref->found_dir_index &&
+                               !backref->found_dir_item &&
+                               backref->found_inode_ref)) {
+                       struct btrfs_trans_handle *trans;
+                       struct btrfs_key location;
+
+                       location.objectid = rec->ino;
+                       location.type = BTRFS_INODE_ITEM_KEY;
+                       location.offset = 0;
+
+                       trans = btrfs_start_transaction(root, 1);
+                       if (IS_ERR(trans)) {
+                               ret = PTR_ERR(trans);
+                               break;
+                       }
+                       fprintf(stderr, "adding missing dir index/item pair "
+                               "for inode %llu\n",
+                               (unsigned long long)rec->ino);
+                       ret = btrfs_insert_dir_item(trans, root, backref->name,
+                                                   backref->namelen,
+                                                   backref->dir, &location,
+                                                   imode_to_type(rec->imode),
+                                                   backref->index);
+                       BUG_ON(ret);
+                       btrfs_commit_transaction(trans, root);
+                       repaired++;
+               }
        }
        return ret ? ret : repaired;
 }