sbin/hammer - Add 'header' option for mirror-dump directive.
authorAntonio Huete Jimenez <tuxillo@quantumachine.net>
Thu, 13 Mar 2014 11:49:33 +0000 (12:49 +0100)
committerAntonio Huete Jimenez <tuxillo@quantumachine.net>
Thu, 13 Mar 2014 12:03:13 +0000 (13:03 +0100)
- Provide means to dump PFS information only via 'mirror-dump'
  directive.
- Snapshots directory is not shown at the moment.

Submitted-by: YONETANI Tomokazu <y0netan1@dragonflybsd.org>
DragonFly-bug: <http://bugs.dragonflybsd.org/issues/1497>

This commit closes #1497

sbin/hammer/cmd_mirror.c
sbin/hammer/cmd_pseudofs.c
sbin/hammer/hammer.8
sbin/hammer/hammer.c
sbin/hammer/hammer.h

index 4ccbb1d..b1292a6 100644 (file)
@@ -943,7 +943,7 @@ again:
 }
 
 void
-hammer_cmd_mirror_dump(void)
+hammer_cmd_mirror_dump(char **av, int ac)
 {
        char *buf = malloc(SERIALBUF_SIZE);
        struct hammer_ioc_mrecord_head pickup;
@@ -952,6 +952,12 @@ hammer_cmd_mirror_dump(void)
        int size;
        int offset;
        int bytes;
+       int header_only = 0;
+
+       if (ac == 1 && strcmp(*av, "header") == 0)
+               header_only = 1;
+       else if (ac != 0)
+               mirror_usage(1);
 
        /*
         * Read and process the PFS header
@@ -961,6 +967,16 @@ hammer_cmd_mirror_dump(void)
 
        mrec = read_mrecord(0, &error, &pickup);
 
+       /*
+        * Dump the PFS header. mirror-dump takes its input from the output
+        * of a mirror-read so getpfs() can't be used to get a fd to be passed
+        * to dump_pfsd().
+        */
+       if (header_only && mrec != NULL) {
+               dump_pfsd(&mrec->pfs.pfsd, -1);
+               return;
+       }
+
 again:
        /*
         * Read and process bulk records
@@ -1698,7 +1714,7 @@ mirror_usage(int code)
                "hammer mirror-read <filesystem> [begin-tid]\n"
                "hammer mirror-read-stream <filesystem> [begin-tid]\n"
                "hammer mirror-write <filesystem>\n"
-               "hammer mirror-dump\n"
+               "hammer mirror-dump [header]\n"
                "hammer mirror-copy [[user@]host:]<filesystem>"
                                  " [[user@]host:]<filesystem>\n"
                "hammer mirror-stream [[user@]host:]<filesystem>"
index 7efc5e5..ab618c6 100644 (file)
@@ -38,7 +38,6 @@
 
 static void parse_pfsd_options(char **av, int ac, hammer_pseudofs_data_t pfsd);
 static void init_pfsd(hammer_pseudofs_data_t pfsd, int is_slave);
-static void dump_pfsd(hammer_pseudofs_data_t pfsd, int fd);
 static void pseudofs_usage(int code);
 static int getyn(void);
 static int timetosecs(char *str);
@@ -477,7 +476,6 @@ init_pfsd(hammer_pseudofs_data_t pfsd, int is_slave)
                pfsd->mirror_flags |= HAMMER_PFSD_SLAVE;
 }
 
-static
 void
 dump_pfsd(hammer_pseudofs_data_t pfsd, int fd)
 {
@@ -518,7 +516,13 @@ dump_pfsd(hammer_pseudofs_data_t pfsd, int fd)
                printf("    operating as a MASTER\n");
        }
 
-       if (pfsd->snapshots[0] == 0) {
+       /*
+        * Snapshots directory cannot be shown when there is no fd since
+        * hammer version can't be retrieved. mirror-dump passes -1 because
+        * its input came from mirror-read output thus no path is available
+        * to open(2).
+        */
+       if (fd >= 0 && pfsd->snapshots[0] == 0) {
                bzero(&version, sizeof(version));
                if (ioctl(fd, HAMMERIOC_GET_VERSION, &version) < 0)
                        return;
index bb2839e..2b66f41 100644 (file)
@@ -30,7 +30,7 @@
 .\" OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 .\" SUCH DAMAGE.
 .\"
-.Dd September 9, 2013
+.Dd March 13, 2014
 .Dt HAMMER 8
 .Os
 .Sh NAME
@@ -1342,12 +1342,15 @@ command for more details.
 If the target PFS does not exist this command will ask you whether
 you want to create a compatible PFS slave for the target or not.
 .\" ==== mirror-dump ====
-.It Cm mirror-dump
+.It Ar mirror-dump Ar [header]
 A
 .Cm mirror-read
 can be piped into a
 .Cm mirror-dump
 to dump an ASCII representation of the mirroring stream.
+If the keyword
+.Ar header
+is specified, only the header information is shown.
 .\" ==== mirror-copy ====
 .\".It Cm mirror-copy Ar [[user@]host:]filesystem [[user@]host:]filesystem
 .It Cm mirror-copy \
index ccbb43b..2db8f96 100644 (file)
@@ -480,7 +480,7 @@ main(int ac, char **av)
                else if (strcmp(av[0], "mirror-stream") == 0)
                        hammer_cmd_mirror_copy(av + 1, ac - 1, 1);
                else if (strcmp(av[0], "mirror-dump") == 0)
-                       hammer_cmd_mirror_dump();
+                       hammer_cmd_mirror_dump(av + 1, ac - 1);
                else
                        usage(1);
                exit(0);
@@ -641,7 +641,7 @@ usage(int exit_code)
                "hammer mirror-read <filesystem> [begin-tid]\n"
                "hammer mirror-read-stream <filesystem> [begin-tid]\n"
                "hammer mirror-write <filesystem>\n"
-               "hammer mirror-dump\n"
+               "hammer mirror-dump [header]\n"
                "hammer mirror-copy [[user@]host:]<filesystem>"
                                  " [[user@]host:]<filesystem>\n"
                "hammer mirror-stream [[user@]host:]<filesystem>"
index 946554f..d66fd4b 100644 (file)
@@ -106,7 +106,7 @@ void hammer_cmd_synctid(char **av, int ac);
 void hammer_cmd_mirror_read(char **av, int ac, int streaming);
 void hammer_cmd_mirror_write(char **av, int ac);
 void hammer_cmd_mirror_copy(char **av, int ac, int streaming);
-void hammer_cmd_mirror_dump(void);
+void hammer_cmd_mirror_dump(char **av, int ac);
 void hammer_cmd_history(const char *offset_str, char **av, int ac);
 void hammer_cmd_blockmap(void);
 void hammer_cmd_reblock(char **av, int ac, int flags);
@@ -139,6 +139,7 @@ void hammer_reset_cycle(void);
 
 int getpfs(struct hammer_ioc_pseudofs_rw *pfs, char *path);
 void relpfs(int fd, struct hammer_ioc_pseudofs_rw *pfs);
+void dump_pfsd(hammer_pseudofs_data_t, int);
 void hammer_check_restrict(const char *path);
 void hammer_softprune_scandir(struct softprune **basep,
                          struct hammer_ioc_prune *template,