btrfs-progs: check: verify dir item name and hash in lowmem mode
authorSu Yue <suy.fnst@cn.fujitsu.com>
Fri, 14 Jul 2017 07:47:45 +0000 (15:47 +0800)
committerDavid Sterba <dsterba@suse.com>
Thu, 24 Aug 2017 17:07:51 +0000 (19:07 +0200)
Although lowmem mode can detect name and hash mismatch in dir_item,
it's done by checking inode_ref to expose such problem.

This patch will enhance dir_item check, by also comparing name and
hash when checking dir_items.

Reported-by: Filippe LeMarchand <gasinvein@gmail.com>
Signed-off-by: Su Yue <suy.fnst@cn.fujitsu.com>
Signed-off-by: David Sterba <dsterba@suse.com>
cmds-check.c

index 48e9a07..acd22f0 100644 (file)
@@ -4680,6 +4680,15 @@ static int check_dir_item(struct btrfs_root *root, struct btrfs_key *key,
                read_extent_buffer(node, namebuf, (unsigned long)(di + 1), len);
                filetype = btrfs_dir_type(node, di);
 
+               if (key->type == BTRFS_DIR_ITEM_KEY &&
+                   key->offset != btrfs_name_hash(namebuf, len)) {
+                       err |= -EIO;
+                       error("root %llu DIR_ITEM[%llu %llu] name %s namelen %u filetype %u mismatch with its hash, wanted %llu have %llu",
+                               root->objectid, key->objectid, key->offset,
+                               namebuf, len, filetype, key->offset,
+                               btrfs_name_hash(namebuf, len));
+               }
+
                btrfs_init_path(&path);
                btrfs_dir_item_key_to_cpu(node, di, &location);