Print this page
NEX-13374 NDMP should be able to backup unmounted ZFS filesystems
Reviewed by: Yuri Pankov <yuri.pankov@nexenta.com>
Reviewed by: Evan Layton <evan.layton@nexenta.com>
NEX-5801 Snapshots left over after failed backups
Reviewed by: Rick Mesta <rick.mesta@nexenta.com>
Reviewed by: Evan Layton <evan.layton@nexenta.com>
Reviewed by: Sanjay Nadkarni <sanjay.nadkarni@nexenta.com>
Reviewed by: Yuri Pankov <yuri.pankov@nexenta.com>
Revert "NEX-5801 Snapshots left over after failed backups"
This reverts commit f182fb95f09036db71fbfc6f0a6b90469b761f21.
NEX-5801 Snapshots left over after failed backups
Reviewed by: Rick Mesta <rick.mesta@nexenta.com>
Reviewed by: Evan Layton <evan.layton@nexenta.com>
Reviewed by: Sanjay Nadkarni <sanjay.nadkarni@nexenta.com>
NEX-2911 NDMP logging should use syslog and is too chatty

@@ -34,11 +34,14 @@
  * 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.
  */
+/* Copyright 2017 Nexenta Systems, Inc. All rights reserved. */
+
 #include <sys/errno.h>
+#include <syslog.h>
 #include <ctype.h>
 #include <stdlib.h>
 #include <time.h>
 #include <sys/types.h>
 #include <unistd.h>

@@ -316,11 +319,11 @@
         for (i = 0; i < RECORDSIZE; i++) {
                 sum += p[i] & 0xFF;
         }
 
         if (sum == 0) {
-                NDMP_LOG(LOG_DEBUG,
+                syslog(LOG_DEBUG,
                     "should be %d, is 0", chksum);
                 /* a zero record ==> end of tar file */
                 return (0);
         }
 

@@ -336,13 +339,14 @@
         /*
          * replace the old checksum field with blanks
          */
         sum += ' ' * 8;
 
-        if (sum != chksum)
-                NDMP_LOG(LOG_DEBUG,
+        if (sum != chksum) {
+                syslog(LOG_DEBUG,
                     "should be %d, is %d", chksum, sum);
+        }
 
         return ((sum == chksum) ? 1 : -1);
 }
 
 /*

@@ -357,15 +361,15 @@
         tlm_drive_t *dp;
 
         entry = -1;
         dp = tlm_drive(lib, drv);
         if (!dp) {
-                NDMP_LOG(LOG_DEBUG, "NULL dp for (%d.%d)", lib, drv);
+                syslog(LOG_DEBUG, "NULL dp for (%d.%d)", lib, drv);
         } else if (!dp->td_slink) {
-                NDMP_LOG(LOG_DEBUG, "NULL dp->td_slink for (%d.%d)", lib, drv);
+                syslog(LOG_DEBUG, "NULL dp->td_slink for (%d.%d)", lib, drv);
         } else if (!dp->td_slink->sl_sa) {
-                NDMP_LOG(LOG_DEBUG, "NULL dp->td_slink->sl_sa for (%d.%d)",
+                syslog(LOG_DEBUG, "NULL dp->td_slink->sl_sa for (%d.%d)",
                     lib, drv);
         } else {
                 /* search through the SASD table */
                 n = sasd_dev_count();
                 for (i = 0; i < n; i++) {

@@ -494,20 +498,20 @@
         int rv;
         lbr_fhlog_call_backs_t *cbp; /* callbacks pointer */
 
         rv = 0;
         if (job_stats == NULL) {
-                NDMP_LOG(LOG_DEBUG, "log_fhdir: jstat is NULL");
+                syslog(LOG_DEBUG, "log_fhdir: jstat is NULL");
         } else if (dir == NULL) {
-                NDMP_LOG(LOG_DEBUG, "log_fhdir: dir is NULL");
+                syslog(LOG_DEBUG, "log_fhdir: dir is NULL");
         } else if (stp == NULL) {
-                NDMP_LOG(LOG_DEBUG, "log_fhdir: stp is NULL");
+                syslog(LOG_DEBUG, "log_fhdir: stp is NULL");
         } else if ((cbp = (lbr_fhlog_call_backs_t *)job_stats->js_callbacks)
             == NULL) {
-                NDMP_LOG(LOG_DEBUG, "log_fhdir: cbp is NULL");
+                syslog(LOG_DEBUG, "log_fhdir: cbp is NULL");
         } else if (cbp->fh_log_dir == NULL) {
-                NDMP_LOG(LOG_DEBUG, "log_fhdir: callback is NULL");
+                syslog(LOG_DEBUG, "log_fhdir: callback is NULL");
         } else
                 rv = (*cbp->fh_log_dir)(cbp, dir, stp, fhp);
 
         return (rv);
 }

@@ -522,22 +526,22 @@
         int rv;
         lbr_fhlog_call_backs_t *cbp; /* callbacks pointer */
 
         rv = 0;
         if (job_stats == NULL) {
-                NDMP_LOG(LOG_DEBUG, "log_fhnode: jstat is NULL");
+                syslog(LOG_DEBUG, "log_fhnode: jstat is NULL");
         } else if (dir == NULL) {
-                NDMP_LOG(LOG_DEBUG, "log_fhnode: dir is NULL");
+                syslog(LOG_DEBUG, "log_fhnode: dir is NULL");
         } else if (file == NULL) {
-                NDMP_LOG(LOG_DEBUG, "log_fhnode: file is NULL");
+                syslog(LOG_DEBUG, "log_fhnode: file is NULL");
         } else if (stp == NULL) {
-                NDMP_LOG(LOG_DEBUG, "log_fhnode: stp is NULL");
+                syslog(LOG_DEBUG, "log_fhnode: stp is NULL");
         } else if ((cbp = (lbr_fhlog_call_backs_t *)job_stats->js_callbacks)
             == NULL) {
-                NDMP_LOG(LOG_DEBUG, "log_fhnode: cbp is NULL");
+                syslog(LOG_DEBUG, "log_fhnode: cbp is NULL");
         } else if (cbp->fh_log_node == NULL) {
-                NDMP_LOG(LOG_DEBUG, "log_fhnode: callback is NULL");
+                syslog(LOG_DEBUG, "log_fhnode: callback is NULL");
         } else
                 rv = (*cbp->fh_log_node)(cbp, dir, file, stp, off);
 
         return (rv);
 }

@@ -552,20 +556,20 @@
         int rv;
         lbr_fhlog_call_backs_t *cbp; /* callbacks pointer */
 
         rv = 0;
         if (!job_stats) {
-                NDMP_LOG(LOG_DEBUG, "log_fhpath_name: jstat is NULL");
+                syslog(LOG_DEBUG, "log_fhpath_name: jstat is NULL");
         } else if (!pathname) {
-                NDMP_LOG(LOG_DEBUG, "log_fhpath_name: pathname is NULL");
+                syslog(LOG_DEBUG, "log_fhpath_name: pathname is NULL");
         } else if (!stp) {
-                NDMP_LOG(LOG_DEBUG, "log_fhpath_name: stp is NULL");
+                syslog(LOG_DEBUG, "log_fhpath_name: stp is NULL");
         } else if ((cbp = (lbr_fhlog_call_backs_t *)job_stats->js_callbacks)
             == 0) {
-                NDMP_LOG(LOG_DEBUG, "log_fhpath_name: cbp is NULL");
+                syslog(LOG_DEBUG, "log_fhpath_name: cbp is NULL");
         } else if (!cbp->fh_logpname) {
-                NDMP_LOG(LOG_DEBUG, "log_fhpath_name: callback is NULL");
+                syslog(LOG_DEBUG, "log_fhpath_name: callback is NULL");
         } else
                 rv = (*cbp->fh_logpname)(cbp, pathname, stp, off);
 
         return (rv);
 }

@@ -577,19 +581,17 @@
 int
 tlm_entry_restored(tlm_job_stats_t *job_stats, char *name, int pos)
 {
         lbr_fhlog_call_backs_t *cbp; /* callbacks pointer */
 
-        NDMP_LOG(LOG_DEBUG, "name: \"%s\", pos: %d", name, pos);
-
         if (job_stats == NULL) {
-                NDMP_LOG(LOG_DEBUG, "entry_restored: jstat is NULL");
+                syslog(LOG_DEBUG, "entry_restored: jstat is NULL");
                 return (0);
         }
         cbp = (lbr_fhlog_call_backs_t *)job_stats->js_callbacks;
         if (cbp == NULL) {
-                NDMP_LOG(LOG_DEBUG, "entry_restored is NULL");
+                syslog(LOG_DEBUG, "entry_restored is NULL");
                 return (0);
         }
         return (*cbp->fh_logpname)(cbp, name, 0, (longlong_t)pos);
 }
 /*

@@ -644,35 +646,33 @@
 /*
  * Get the checkpoint (snapshot) creation time.
  * This is necessary to check for checkpoints not being stale.
  */
 int
-tlm_get_chkpnt_time(char *path, int auto_checkpoint, time_t *tp, char *jname)
+tlm_get_chkpnt_time(char *path, time_t *tp)
 {
-        char volname[TLM_VOLNAME_MAX_LENGTH];
-        char chk_name[PATH_MAX];
-        char *cp_nm;
+        zfs_handle_t *zhp;
 
-        NDMP_LOG(LOG_DEBUG, "path [%s] auto_checkpoint: %d",
-            path, auto_checkpoint);
-
-        if (path == NULL || *path == '\0' || tp == NULL)
+        if (path == NULL || *path == '\0' || tp == NULL) {
+                syslog(LOG_ERR, "tlm_get_chkpnt_time: bad params");
                 return (-1);
+        }
 
-        if (get_zfsvolname(volname, TLM_VOLNAME_MAX_LENGTH,
-            path) == -1)
+        (void) mutex_lock(&zlib_mtx);
+        if ((zhp = zfs_open(zlibh, path, ZFS_TYPE_DATASET)) == NULL) {
+                syslog(LOG_DEBUG, "tlm_get_chkpnt_time: open %s failed",
+                    path);
+                (void) mutex_unlock(&zlib_mtx);
                 return (-1);
-
-        if (auto_checkpoint) {
-                NDMP_LOG(LOG_DEBUG, "volname [%s]", volname);
-                (void) snprintf(chk_name, PATH_MAX, "%s", jname);
-                return (chkpnt_creationtime_bypattern(volname, chk_name, tp));
         }
-        cp_nm = strchr(volname, '@');
-        NDMP_LOG(LOG_DEBUG, "volname [%s] cp_nm [%s]", volname, cp_nm);
 
-        return (chkpnt_creationtime_bypattern(volname, cp_nm, tp));
+        *tp = zfs_prop_get_int(zhp, ZFS_PROP_CREATION);
+
+        zfs_close(zhp);
+        (void) mutex_unlock(&zlib_mtx);
+
+        return (0);
 }
 
 /*
  * Release an array of pointers and the pointers themselves.
  */

@@ -699,14 +699,14 @@
         int i;
 
         if (!lpp)
                 return;
 
-        NDMP_LOG(LOG_DEBUG, "%s:", title);
+        syslog(LOG_DEBUG, "%s:", title);
 
         for (i = 0; *lpp; lpp++, i++)
-                NDMP_LOG(LOG_DEBUG, "%d: [%s]", i, *lpp);
+                syslog(LOG_DEBUG, "%d: [%s]", i, *lpp);
 }
 
 /*
  * Insert the backup snapshot name into the path.
  *

@@ -721,13 +721,14 @@
  */
 char *
 tlm_build_snapshot_name(char *name, char *sname, char *jname)
 {
         zfs_handle_t *zhp;
-        char *rest;
-        char volname[ZFS_MAX_DATASET_NAME_LEN];
-        char mountpoint[PATH_MAX];
+        char volname[ZFS_MAX_DATASET_NAME_LEN] = {'\0'};
+        char mountpoint[PATH_MAX] = {'\0'};
+        char zpoolname[ZFS_MAX_DATASET_NAME_LEN] = {'\0'};
+        char *slash, *rest;
 
         if (get_zfsvolname(volname, ZFS_MAX_DATASET_NAME_LEN, name) == -1)
                 goto notzfs;
 
         (void) mutex_lock(&zlib_mtx);

@@ -745,13 +746,19 @@
         }
 
         zfs_close(zhp);
         (void) mutex_unlock(&zlib_mtx);
 
+        (void) strlcpy(zpoolname, volname, ZFS_MAX_DATASET_NAME_LEN);
+        slash = strchr(zpoolname, '/');
+        if (slash != 0) {
+                *slash = '\0';
+        }
+
         rest = name + strlen(mountpoint);
-        (void) snprintf(sname, TLM_MAX_PATH_NAME, "%s/%s/%s%s", mountpoint,
-            TLM_SNAPSHOT_DIR, jname, rest);
+        (void) snprintf(sname,
+            TLM_MAX_PATH_NAME, "/%s/%s%s", zpoolname, jname, rest);
 
         return (sname);
 
 notzfs:
         (void) strlcpy(sname, name, TLM_MAX_PATH_NAME);

@@ -824,11 +831,11 @@
 
         if (!dir || !name || !excl_files)
                 return (FALSE);
 
         if (!tlm_cat_path(full_name, dir, name)) {
-                NDMP_LOG(LOG_DEBUG, "Path too long [%s][%s]",
+                syslog(LOG_DEBUG, "Path too long [%s][%s]",
                     dir, name);
                 return (FALSE);
         }
         for (i = 0; excl_files[i] != 0; i++) {
                 if (match(excl_files[i], full_name)) {

@@ -878,11 +885,11 @@
 {
         tlm_library_t *lp;
 
         if ((lp = tlm_library(l))) {
                 lp->tl_capability_barcodes = TRUE;
-                NDMP_LOG(LOG_DEBUG,
+                syslog(LOG_DEBUG,
                     "Barcode capability on library %d enabled.", l);
         }
 }
 
 /*

@@ -1023,11 +1030,11 @@
         sa->sa_link_head.sl_next = &sa->sa_link_head;
 
         /* Scan for the changer */
         dirp = opendir(SCSI_CHANGER_DIR);
         if (dirp == NULL) {
-                NDMP_LOG(LOG_DEBUG,
+                syslog(LOG_DEBUG,
                     "Changer directory read error %s", SCSI_CHANGER_DIR);
         } else {
                 while ((dp = readdir(dirp)) != NULL) {
                         if ((strcmp(dp->d_name, ".") == 0) ||
                             (strcmp(dp->d_name, "..") == 0))

@@ -1048,18 +1055,18 @@
         }
 
         /* Scan for tape drives */
         dirp = opendir(SCSI_TAPE_DIR);
         if (dirp == NULL) {
-                NDMP_LOG(LOG_DEBUG,
+                syslog(LOG_DEBUG,
                     "Tape directory read error %s", SCSI_TAPE_DIR);
         } else {
                 drive_type = ndmpd_get_prop(NDMP_DRIVE_TYPE);
 
                 if ((strcasecmp(drive_type, "sysv") != 0) &&
                     (strcasecmp(drive_type, "bsd") != 0)) {
-                        NDMP_LOG(LOG_ERR, "Invalid ndmpd/drive-type value. "
+                        syslog(LOG_ERR, "Invalid ndmpd/drive-type value. "
                             "Valid values are 'sysv' and 'bsd'.");
                         return (-1);
                 }
 
                 while ((dp = readdir(dirp)) != NULL) {

@@ -1163,22 +1170,22 @@
 int
 tlm_ioctl(int fd, int cmd, void *data)
 {
         int retries = 0;
 
-        NDMP_LOG(LOG_DEBUG, "tlm_ioctl fd %d cmd %d", fd, cmd);
+        syslog(LOG_DEBUG, "tlm_ioctl fd %d cmd %d", fd, cmd);
         if (fd == 0 || data == NULL)
                 return (EINVAL);
 
         do {
                 if (ioctl(fd, cmd, data) == 0)
                         break;
 
                 if (errno != EIO && errno != 0) {
-                        NDMP_LOG(LOG_ERR,
+                        syslog(LOG_ERR,
                             "Failed to send command to device: %m.");
-                        NDMP_LOG(LOG_DEBUG, "IOCTL error %d", errno);
+                        syslog(LOG_DEBUG, "IOCTL error %d", errno);
                         return (errno);
                 }
                 (void) sleep(1);
         } while (retries++ < MAXIORETRY);
 

@@ -1213,11 +1220,11 @@
         (void) strlcat(chk_name, "@", PATH_MAX);
         (void) strlcat(chk_name, pattern, PATH_MAX);
 
         (void) mutex_lock(&zlib_mtx);
         if ((zhp = zfs_open(zlibh, chk_name, ZFS_TYPE_DATASET)) == NULL) {
-                NDMP_LOG(LOG_DEBUG, "chkpnt_creationtime: open %s failed",
+                syslog(LOG_DEBUG, "chkpnt_creationtime: open %s failed",
                     chk_name);
                 (void) mutex_unlock(&zlib_mtx);
                 return (-1);
         }
 

@@ -1236,32 +1243,35 @@
 get_zfsvolname(char *volname, int len, char *path)
 {
         struct stat64 stbuf;
         struct extmnttab ent;
         FILE *mntfp;
-        int rv;
+        int rv = 0;
 
         *volname = '\0';
         if (stat64(path, &stbuf) != 0) {
+                syslog(LOG_DEBUG, "stat64 failed open %s - %s",
+                    volname, path);
                 return (-1);
         }
 
         if ((mntfp = fopen(MNTTAB, "r")) == NULL) {
+                syslog(LOG_DEBUG, "failed open mnttab");
                 return (-1);
         }
         while ((rv = getextmntent(mntfp, &ent, 0)) == 0) {
                 if (makedevice(ent.mnt_major, ent.mnt_minor) ==
                     stbuf.st_dev)
                         break;
         }
 
         if (rv == 0 &&
-            strcmp(ent.mnt_fstype, MNTTYPE_ZFS) == 0)
+            strcmp(ent.mnt_fstype, MNTTYPE_ZFS) == 0) {
                 (void) strlcpy(volname, ent.mnt_special, len);
-        else
+        } else {
                 rv = -1;
-
+        }
         (void) fclose(mntfp);
         return (rv);
 }