sbin/hammer: Add clrpfs()
authorTomohiro Kusumi <kusumi.tomohiro@gmail.com>
Fri, 9 Sep 2016 16:00:24 +0000 (01:00 +0900)
committerTomohiro Kusumi <kusumi.tomohiro@gmail.com>
Fri, 9 Sep 2016 17:10:18 +0000 (02:10 +0900)
The one in getpfs() is okay to clear pfs_id with -1,
because scanpfsid() will overwrite pfs_id without using it.

It's also okay to clear the whole &pfs before init_pfsd().
This is actually better than not clearing header part.

sbin/hammer/cmd_cleanup.c
sbin/hammer/cmd_mirror.c
sbin/hammer/cmd_pfs.c
sbin/hammer/cmd_snapshot.c
sbin/hammer/cmd_softprune.c
sbin/hammer/hammer.h

index bb03644..a4968ef 100644 (file)
@@ -172,11 +172,8 @@ do_cleanup(const char *path)
        int r;
        int found_rebal = 0;
 
-       bzero(&pfs, sizeof(pfs));
        bzero(&mrec_tmp, sizeof(mrec_tmp));
-       pfs.ondisk = &mrec_tmp.pfs.pfsd;
-       pfs.bytes = sizeof(mrec_tmp.pfs.pfsd);
-       pfs.pfs_id = -1;
+       clrpfs(&pfs, &mrec_tmp.pfs.pfsd, -1);
 
        printf("cleanup %-20s -", path);
        fd = open(path, O_RDONLY);
index 4951529..9077188 100644 (file)
@@ -1515,11 +1515,9 @@ generate_mrec_header(int fd, int pfs_id,
 {
        struct hammer_ioc_pseudofs_rw pfs;
 
-       bzero(&pfs, sizeof(pfs));
        bzero(mrec_tmp, sizeof(*mrec_tmp));
-       pfs.pfs_id = pfs_id;
-       pfs.ondisk = &mrec_tmp->pfs.pfsd;
-       pfs.bytes = sizeof(mrec_tmp->pfs.pfsd);
+       clrpfs(&pfs, &mrec_tmp->pfs.pfsd, pfs_id);
+
        if (ioctl(fd, HAMMERIOC_GET_PSEUDOFS, &pfs) != 0) {
                fprintf(stderr, "Mirror-read: not a HAMMER fs/pseudofs!\n");
                exit(1);
@@ -1550,11 +1548,7 @@ validate_mrec_header(int fd, int fdin, int is_target, int pfs_id,
        /*
         * Get the PFSD info from the target filesystem.
         */
-       bzero(&pfs, sizeof(pfs));
-       bzero(&pfsd, sizeof(pfsd));
-       pfs.pfs_id = pfs_id;
-       pfs.ondisk = &pfsd;
-       pfs.bytes = sizeof(pfsd);
+       clrpfs(&pfs, &pfsd, pfs_id);
        if (ioctl(fd, HAMMERIOC_GET_PSEUDOFS, &pfs) != 0) {
                fprintf(stderr, "mirror-write: not a HAMMER fs/pseudofs!\n");
                exit(1);
@@ -1618,11 +1612,7 @@ update_pfs_snapshot(int fd, hammer_tid_t snapshot_tid, int pfs_id)
        struct hammer_ioc_pseudofs_rw pfs;
        struct hammer_pseudofs_data pfsd;
 
-       bzero(&pfs, sizeof(pfs));
-       bzero(&pfsd, sizeof(pfsd));
-       pfs.pfs_id = pfs_id;
-       pfs.ondisk = &pfsd;
-       pfs.bytes = sizeof(pfsd);
+       clrpfs(&pfs, &pfsd, pfs_id);
        if (ioctl(fd, HAMMERIOC_GET_PSEUDOFS, &pfs) != 0) {
                perror("update_pfs_snapshot (read)");
                exit(1);
index 28d0fdf..160c8b8 100644 (file)
@@ -44,6 +44,23 @@ static void init_pfsd(hammer_pseudofs_data_t pfsd, int is_slave);
 static void pseudofs_usage(int code);
 static int timetosecs(char *str);
 
+void
+clrpfs(struct hammer_ioc_pseudofs_rw *pfs, hammer_pseudofs_data_t pfsd,
+       int pfs_id)
+{
+       bzero(pfs, sizeof(*pfs));
+
+       if (pfsd)
+               pfs->ondisk = pfsd;
+       else
+               pfs->ondisk = malloc(sizeof(*pfs->ondisk));
+       bzero(pfs->ondisk, sizeof(*pfs->ondisk));
+
+       pfs->pfs_id = pfs_id;
+       pfs->bytes = sizeof(*pfs->ondisk);
+       pfs->version = HAMMER_IOC_PSEUDOFS_VERSION;
+}
+
 /*
  * Return a directory that contains path.
  * If '/' is not found in the path then '.' is returned.
@@ -79,10 +96,7 @@ getpfs(struct hammer_ioc_pseudofs_rw *pfs, char *path)
        int fd;
        char *p;
 
-       bzero(pfs, sizeof(*pfs));
-       pfs->ondisk = malloc(sizeof(*pfs->ondisk));
-       bzero(pfs->ondisk, sizeof(*pfs->ondisk));
-       pfs->bytes = sizeof(*pfs->ondisk);
+       clrpfs(pfs, NULL, -1);
 
        /*
         * Trailing '/' must be removed so that upon pfs-destroy
@@ -281,11 +295,7 @@ hammer_cmd_pseudofs_create(char **av, int ac, int is_slave)
         * via the master filesystem.  Checking it here ensures
         * other PFS commands access PFS under the master filesystem.
         */
-       bzero(&pfs, sizeof(pfs));
-       bzero(&pfsd, sizeof(pfsd));
-       pfs.pfs_id = -1;
-       pfs.ondisk = &pfsd;
-       pfs.bytes = sizeof(pfsd);
+       clrpfs(&pfs, &pfsd, -1);
 
        ioctl(fd, HAMMERIOC_GET_PSEUDOFS, &pfs);
        if (pfs.pfs_id != HAMMER_ROOT_PFSID) {
@@ -300,12 +310,7 @@ hammer_cmd_pseudofs_create(char **av, int ac, int is_slave)
 
        error = 0;
        for (pfs_id = 0; pfs_id < HAMMER_MAX_PFS; ++pfs_id) {
-               bzero(&pfs, sizeof(pfs));
-               bzero(&pfsd, sizeof(pfsd));
-               pfs.pfs_id = pfs_id;
-               pfs.ondisk = &pfsd;
-               pfs.bytes = sizeof(pfsd);
-               pfs.version = HAMMER_IOC_PSEUDOFS_VERSION;
+               clrpfs(&pfs, &pfsd, pfs_id);
                if (ioctl(fd, HAMMERIOC_GET_PSEUDOFS, &pfs) < 0) {
                        error = errno;
                        break;
@@ -330,11 +335,8 @@ hammer_cmd_pseudofs_create(char **av, int ac, int is_slave)
         * Create the new PFS
         */
        printf("Creating PFS #%d\t", pfs_id);
+       clrpfs(&pfs, &pfsd, pfs_id);
        init_pfsd(&pfsd, is_slave);
-       pfs.pfs_id = pfs_id;
-       pfs.ondisk = &pfsd;
-       pfs.bytes = sizeof(pfsd);
-       pfs.version = HAMMER_IOC_PSEUDOFS_VERSION;
 
        if (ioctl(fd, HAMMERIOC_SET_PSEUDOFS, &pfs) < 0) {
                printf("failed: %s\n", strerror(errno));
index 978eca0..e07d32e 100644 (file)
@@ -495,11 +495,7 @@ snapshot_ls(const char *path)
                /* not reached */
        }
 
-       bzero(&pfs, sizeof(pfs));
-       bzero(&pfs_od, sizeof(pfs_od));
-       pfs.pfs_id = -1;
-       pfs.ondisk = &pfs_od;
-       pfs.bytes = sizeof(struct hammer_pseudofs_data);
+       clrpfs(&pfs, &pfs_od, -1);
        if (ioctl(fd, HAMMERIOC_GET_PSEUDOFS, &pfs) < 0) {
                err(2, "hammer snapls: cannot retrieve PFS info on %s", path);
                /* not reached */
index cb1fe25..a1f77bd 100644 (file)
@@ -79,11 +79,7 @@ hammer_cmd_softprune(char **av, int ac, int everything_opt)
        if (TimeoutOpt > 0)
                alarm(TimeoutOpt);
 
-       bzero(&pfs, sizeof(pfs));
-       pfs.bytes = sizeof(*pfs.ondisk);
-       pfs.ondisk = malloc(pfs.bytes);
-       bzero(pfs.ondisk, pfs.bytes);
-       pfs.pfs_id = -1;
+       clrpfs(&pfs, NULL, -1);
 
        /*
         * NOTE: To restrict to a single file XXX we have to set
index a39ae35..ef4ce77 100644 (file)
@@ -142,6 +142,8 @@ void hammer_get_cycle(hammer_base_elm_t base, hammer_tid_t *tidp);
 void hammer_set_cycle(hammer_base_elm_t base, hammer_tid_t tid);
 void hammer_reset_cycle(void);
 
+void clrpfs(struct hammer_ioc_pseudofs_rw *pfs, hammer_pseudofs_data_t pfsd,
+       int pfs_id);
 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);