hammer2 - Add debugging directive for calculating dirent crcs
authorMatthew Dillon <dillon@apollo.backplane.com>
Fri, 12 Apr 2019 03:08:43 +0000 (20:08 -0700)
committerMatthew Dillon <dillon@apollo.backplane.com>
Fri, 12 Apr 2019 03:08:43 +0000 (20:08 -0700)
* Add a debugging directive 'dhash' that can calculate the
  crc for extended directory entries (ones that overflow into
  a data block).

sbin/hammer2/cmd_debug.c
sbin/hammer2/hammer2.h
sbin/hammer2/main.c

index 8c7a836..68e41f2 100644 (file)
@@ -859,6 +859,22 @@ cmd_hash(int ac, const char **av)
        return(0);
 }
 
+int
+cmd_dhash(int ac, const char **av)
+{
+       char buf[1024];         /* 1K extended directory record */
+       uint64_t hash;
+       int i;
+
+       for (i = 0; i < ac; ++i) {
+               bzero(buf, sizeof(buf));
+               snprintf(buf, sizeof(buf), "%s", av[i]);
+               hash = XXH64(buf, sizeof(buf), XXH_HAMMER2_SEED);
+               printf("%016jx %s\n", hash, av[i]);
+       }
+       return(0);
+}
+
 int
 cmd_dumpchain(const char *path, u_int flags)
 {
index 42b2715..5991259 100644 (file)
@@ -139,6 +139,7 @@ int cmd_pfs_snapshot(const char *sel_path, const char *name, const char *label,
 
 int cmd_service(void);
 int cmd_hash(int ac, const char **av);
+int cmd_dhash(int ac, const char **av);
 int cmd_info(int ac, const char **av);
 int cmd_mountall(int ac, const char **av);
 int cmd_stat(int ac, const char **av);
index 0a1ccbb..ac73530 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011-2012 The DragonFly Project.  All rights reserved.
+ * Copyright (c) 2011-2019 The DragonFly Project.  All rights reserved.
  *
  * This code is derived from software contributed to The DragonFly Project
  * by Matthew Dillon <dillon@dragonflybsd.org>
@@ -215,6 +215,8 @@ main(int ac, char **av)
                ecode = cmd_destroy_inum(sel_path, ac - 1, (const char **)(void *)&av[1]);
        } else if (strcmp(av[0], "hash") == 0) {
                ecode = cmd_hash(ac - 1, (const char **)(void *)&av[1]);
+       } else if (strcmp(av[0], "dhash") == 0) {
+               ecode = cmd_dhash(ac - 1, (const char **)(void *)&av[1]);
        } else if (strcmp(av[0], "info") == 0) {
                ecode = cmd_info(ac - 1, (const char **)(void *)&av[1]);
        } else if (strcmp(av[0], "mountall") == 0) {
@@ -525,7 +527,9 @@ usage(int code)
                "    disconnect <target>          "
                        "Del cluster link\n"
                "    hash filename*               "
-                       "Print directory hash\n"
+                       "Print directory hash (key) for name\n"
+               "    dhash filename*               "
+                       "Print data hash for long directory entry"
                "    info [devpath...]            "
                        "Info on all offline or online H2 partitions\n"
                "    mountall [devpath...]        "