hammer2 - Add 'cleanup' command, retool h2 build for conf/files inclusion
authorMatthew Dillon <dillon@apollo.backplane.com>
Tue, 12 Sep 2017 00:53:41 +0000 (17:53 -0700)
committerMatthew Dillon <dillon@apollo.backplane.com>
Tue, 12 Sep 2017 00:53:41 +0000 (17:53 -0700)
* Add a preliminary 'hammer2 cleanup' command that works similar to
  hammer1.

* Retool xxhash and zlib prefixing to avoid kernel conflicts and to
  allow hammer2 to be included in conf/files.

sbin/hammer2/Makefile
sbin/hammer2/cmd_cleanup.c [new file with mode: 0644]
sbin/hammer2/hammer2.h
sbin/hammer2/main.c
sys/vfs/hammer2/Makefile
sys/vfs/hammer2/xxhash/xxhash.h
sys/vfs/hammer2/zlib/hammer2_zlib_zconf.h

index d613ac5..8fcb418 100644 (file)
@@ -3,7 +3,7 @@ SRCS=   main.c subs.c icrc.c
 SRCS+= cmd_remote.c cmd_snapshot.c cmd_pfs.c
 SRCS+= cmd_service.c cmd_leaf.c cmd_debug.c
 SRCS+= cmd_rsa.c cmd_stat.c cmd_setcomp.c cmd_setcheck.c
-SRCS+= cmd_bulkfree.c cmd_info.c
+SRCS+= cmd_bulkfree.c cmd_cleanup.c cmd_info.c
 SRCS+= print_inode.c
 MAN=   hammer2.8
 #NOMAN=        TRUE
diff --git a/sbin/hammer2/cmd_cleanup.c b/sbin/hammer2/cmd_cleanup.c
new file mode 100644 (file)
index 0000000..35f0d18
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+ * Copyright (c) 2017 The DragonFly Project.  All rights reserved.
+ *
+ * This code is derived from software contributed to The DragonFly Project
+ * by Matthew Dillon <dillon@dragonflybsd.org>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include "hammer2.h"
+
+static int docleanup(const char *path);
+
+int
+cmd_cleanup(const char *sel_path)
+{
+       struct statfs *fsary;
+       char *fstype;
+       char *path;
+       int i;
+       int n;
+       int r;
+       int rc;
+
+       if (sel_path)
+               return (docleanup(sel_path));
+
+       n = getmntinfo(&fsary, MNT_NOWAIT);
+       if (n <= 0) {
+               fprintf(stderr, "hammer2 cleanup: no HAMMER2 mounts\n");
+               return 0;
+       }
+       rc = 0;
+       for (i = 0; i < n; ++i) {
+               fstype = fsary[i].f_fstypename;
+               path = fsary[i].f_mntonname;
+
+               if (strcmp(fstype, "hammer2") == 0) {
+                       r = docleanup(path);
+                       if (r)
+                               rc = r;
+               }
+       }
+       return rc;
+}
+
+static
+int
+docleanup(const char *path)
+{
+       int rc;
+
+       printf("hammer2 cleanup \"%s\"\n", path);
+       rc = cmd_bulkfree(path);
+
+       return rc;
+}
index 3d05b57..3938483 100644 (file)
@@ -150,6 +150,7 @@ int cmd_rsadec(const char **keys, int nkeys);
 int cmd_setcomp(const char *comp_str, char **paths);
 int cmd_setcheck(const char *comp_str, char **paths);
 int cmd_bulkfree(const char *dir_path);
+int cmd_cleanup(const char *dir_path);
 #if 0
 int cmd_bulkfree_async(const char *dir_path);
 #endif
index 8ee5030..27cfc7c 100644 (file)
@@ -432,6 +432,8 @@ main(int ac, char **av)
                        ecode = cmd_bulkfree_async(av[1]);
                }
 #endif
+       } else if (strcmp(av[0], "cleanup") == 0) {
+               ecode = cmd_cleanup(av[1]);     /* can be NULL */
        } else {
                fprintf(stderr, "Unrecognized command: %s\n", av[0]);
                usage(1);
index c17d731..3d5288d 100644 (file)
@@ -1,10 +1,18 @@
 # Makefile for hammer2 vfs
 #
 #
+# NOTE! hammer2 is intended to be as self-contained and self-compatible as
+#      possible in terms of core compression support, so we prefix that
+#      code to avoid conflicts with the kernel proper.
+#
 .PATH: ${.CURDIR} ${.CURDIR}/zlib ${.CURDIR}/xxhash
 
+# NOTE: We have to define Z_PREFIX and XXH_NAMESPACE in xxhash.h and
+#      hammer2_zlib_zconf.h directly in order to allow hammer2 to be
+#      specified in conf/files.
+#
 KCFLAGS+= -DINVARIANTS -DSMP
-KCFLAGS+= -DXXH_NAMESPACE=h2_
+#KCFLAGS+= -DZ_PREFIX -DXXH_NAMESPACE=h2_
 KMOD=  hammer2
 SRCS=  hammer2_vfsops.c hammer2_vnops.c hammer2_xops.c hammer2_inode.c
 SRCS+= hammer2_strategy.c
index 9e11a8f..b8f54c6 100644 (file)
@@ -32,6 +32,9 @@
    - xxHash source repository : https://github.com/Cyan4973/xxHash
 */
 
+/* DRAGONFLY ADDITION - allows inclusion in conf/files */
+#define XXH_NAMESPACE h2_
+
 /* Notice extracted from xxHash homepage :
 
 xxHash is an extremely fast Hash algorithm, running at RAM speed limits.
index db19968..5ea19d2 100644 (file)
@@ -8,6 +8,9 @@
 #ifndef ZCONF_H
 #define ZCONF_H
 
+/* DRAGONFLY ADDITION - Allows inclusion in conf/files */
+#define Z_PREFIX
+
 /*
  * If you *really* need a unique prefix for all types and library functions,
  * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it.