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,44 **** --- 34,47 ---- * 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,326 **** for (i = 0; i < RECORDSIZE; i++) { sum += p[i] & 0xFF; } if (sum == 0) { ! NDMP_LOG(LOG_DEBUG, "should be %d, is 0", chksum); /* a zero record ==> end of tar file */ return (0); } --- 319,329 ---- for (i = 0; i < RECORDSIZE; i++) { sum += p[i] & 0xFF; } if (sum == 0) { ! syslog(LOG_DEBUG, "should be %d, is 0", chksum); /* a zero record ==> end of tar file */ return (0); }
*** 336,348 **** /* * replace the old checksum field with blanks */ sum += ' ' * 8; ! if (sum != chksum) ! NDMP_LOG(LOG_DEBUG, "should be %d, is %d", chksum, sum); return ((sum == chksum) ? 1 : -1); } /* --- 339,352 ---- /* * replace the old checksum field with blanks */ sum += ' ' * 8; ! if (sum != chksum) { ! syslog(LOG_DEBUG, "should be %d, is %d", chksum, sum); + } return ((sum == chksum) ? 1 : -1); } /*
*** 357,371 **** tlm_drive_t *dp; entry = -1; dp = tlm_drive(lib, drv); if (!dp) { ! NDMP_LOG(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); } else if (!dp->td_slink->sl_sa) { ! NDMP_LOG(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++) { --- 361,375 ---- tlm_drive_t *dp; entry = -1; dp = tlm_drive(lib, drv); if (!dp) { ! syslog(LOG_DEBUG, "NULL dp for (%d.%d)", lib, drv); } else if (!dp->td_slink) { ! syslog(LOG_DEBUG, "NULL dp->td_slink for (%d.%d)", lib, drv); } else if (!dp->td_slink->sl_sa) { ! 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,513 **** 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"); } else if (dir == NULL) { ! NDMP_LOG(LOG_DEBUG, "log_fhdir: dir is NULL"); } else if (stp == NULL) { ! NDMP_LOG(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"); } else if (cbp->fh_log_dir == NULL) { ! NDMP_LOG(LOG_DEBUG, "log_fhdir: callback is NULL"); } else rv = (*cbp->fh_log_dir)(cbp, dir, stp, fhp); return (rv); } --- 498,517 ---- int rv; lbr_fhlog_call_backs_t *cbp; /* callbacks pointer */ rv = 0; if (job_stats == NULL) { ! syslog(LOG_DEBUG, "log_fhdir: jstat is NULL"); } else if (dir == NULL) { ! syslog(LOG_DEBUG, "log_fhdir: dir is NULL"); } else if (stp == NULL) { ! syslog(LOG_DEBUG, "log_fhdir: stp is NULL"); } else if ((cbp = (lbr_fhlog_call_backs_t *)job_stats->js_callbacks) == NULL) { ! syslog(LOG_DEBUG, "log_fhdir: cbp is NULL"); } else if (cbp->fh_log_dir == NULL) { ! syslog(LOG_DEBUG, "log_fhdir: callback is NULL"); } else rv = (*cbp->fh_log_dir)(cbp, dir, stp, fhp); return (rv); }
*** 522,543 **** 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"); } else if (dir == NULL) { ! NDMP_LOG(LOG_DEBUG, "log_fhnode: dir is NULL"); } else if (file == NULL) { ! NDMP_LOG(LOG_DEBUG, "log_fhnode: file is NULL"); } else if (stp == NULL) { ! NDMP_LOG(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"); } else if (cbp->fh_log_node == NULL) { ! NDMP_LOG(LOG_DEBUG, "log_fhnode: callback is NULL"); } else rv = (*cbp->fh_log_node)(cbp, dir, file, stp, off); return (rv); } --- 526,547 ---- int rv; lbr_fhlog_call_backs_t *cbp; /* callbacks pointer */ rv = 0; if (job_stats == NULL) { ! syslog(LOG_DEBUG, "log_fhnode: jstat is NULL"); } else if (dir == NULL) { ! syslog(LOG_DEBUG, "log_fhnode: dir is NULL"); } else if (file == NULL) { ! syslog(LOG_DEBUG, "log_fhnode: file is NULL"); } else if (stp == NULL) { ! syslog(LOG_DEBUG, "log_fhnode: stp is NULL"); } else if ((cbp = (lbr_fhlog_call_backs_t *)job_stats->js_callbacks) == NULL) { ! syslog(LOG_DEBUG, "log_fhnode: cbp is NULL"); } else if (cbp->fh_log_node == NULL) { ! syslog(LOG_DEBUG, "log_fhnode: callback is NULL"); } else rv = (*cbp->fh_log_node)(cbp, dir, file, stp, off); return (rv); }
*** 552,571 **** 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"); } else if (!pathname) { ! NDMP_LOG(LOG_DEBUG, "log_fhpath_name: pathname is NULL"); } else if (!stp) { ! NDMP_LOG(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"); } else if (!cbp->fh_logpname) { ! NDMP_LOG(LOG_DEBUG, "log_fhpath_name: callback is NULL"); } else rv = (*cbp->fh_logpname)(cbp, pathname, stp, off); return (rv); } --- 556,575 ---- int rv; lbr_fhlog_call_backs_t *cbp; /* callbacks pointer */ rv = 0; if (!job_stats) { ! syslog(LOG_DEBUG, "log_fhpath_name: jstat is NULL"); } else if (!pathname) { ! syslog(LOG_DEBUG, "log_fhpath_name: pathname is NULL"); } else if (!stp) { ! syslog(LOG_DEBUG, "log_fhpath_name: stp is NULL"); } else if ((cbp = (lbr_fhlog_call_backs_t *)job_stats->js_callbacks) == 0) { ! syslog(LOG_DEBUG, "log_fhpath_name: cbp is NULL"); } else if (!cbp->fh_logpname) { ! syslog(LOG_DEBUG, "log_fhpath_name: callback is NULL"); } else rv = (*cbp->fh_logpname)(cbp, pathname, stp, off); return (rv); }
*** 577,595 **** 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"); return (0); } cbp = (lbr_fhlog_call_backs_t *)job_stats->js_callbacks; if (cbp == NULL) { ! NDMP_LOG(LOG_DEBUG, "entry_restored is NULL"); return (0); } return (*cbp->fh_logpname)(cbp, name, 0, (longlong_t)pos); } /* --- 581,597 ---- int tlm_entry_restored(tlm_job_stats_t *job_stats, char *name, int pos) { lbr_fhlog_call_backs_t *cbp; /* callbacks pointer */ if (job_stats == NULL) { ! syslog(LOG_DEBUG, "entry_restored: jstat is NULL"); return (0); } cbp = (lbr_fhlog_call_backs_t *)job_stats->js_callbacks; if (cbp == NULL) { ! syslog(LOG_DEBUG, "entry_restored is NULL"); return (0); } return (*cbp->fh_logpname)(cbp, name, 0, (longlong_t)pos); } /*
*** 644,678 **** /* * 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) { ! char volname[TLM_VOLNAME_MAX_LENGTH]; ! char chk_name[PATH_MAX]; ! char *cp_nm; ! NDMP_LOG(LOG_DEBUG, "path [%s] auto_checkpoint: %d", ! path, auto_checkpoint); ! ! if (path == NULL || *path == '\0' || tp == NULL) return (-1); ! if (get_zfsvolname(volname, TLM_VOLNAME_MAX_LENGTH, ! path) == -1) 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)); } /* * Release an array of pointers and the pointers themselves. */ --- 646,678 ---- /* * Get the checkpoint (snapshot) creation time. * This is necessary to check for checkpoints not being stale. */ int ! tlm_get_chkpnt_time(char *path, time_t *tp) { ! zfs_handle_t *zhp; ! if (path == NULL || *path == '\0' || tp == NULL) { ! syslog(LOG_ERR, "tlm_get_chkpnt_time: bad params"); return (-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); } ! *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,712 **** int i; if (!lpp) return; ! NDMP_LOG(LOG_DEBUG, "%s:", title); for (i = 0; *lpp; lpp++, i++) ! NDMP_LOG(LOG_DEBUG, "%d: [%s]", i, *lpp); } /* * Insert the backup snapshot name into the path. * --- 699,712 ---- int i; if (!lpp) return; ! syslog(LOG_DEBUG, "%s:", title); for (i = 0; *lpp; lpp++, i++) ! syslog(LOG_DEBUG, "%d: [%s]", i, *lpp); } /* * Insert the backup snapshot name into the path. *
*** 721,733 **** */ 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]; if (get_zfsvolname(volname, ZFS_MAX_DATASET_NAME_LEN, name) == -1) goto notzfs; (void) mutex_lock(&zlib_mtx); --- 721,734 ---- */ char * tlm_build_snapshot_name(char *name, char *sname, char *jname) { zfs_handle_t *zhp; ! 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,757 **** } zfs_close(zhp); (void) mutex_unlock(&zlib_mtx); rest = name + strlen(mountpoint); ! (void) snprintf(sname, TLM_MAX_PATH_NAME, "%s/%s/%s%s", mountpoint, ! TLM_SNAPSHOT_DIR, jname, rest); return (sname); notzfs: (void) strlcpy(sname, name, TLM_MAX_PATH_NAME); --- 746,764 ---- } 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", zpoolname, jname, rest); return (sname); notzfs: (void) strlcpy(sname, name, TLM_MAX_PATH_NAME);
*** 824,834 **** if (!dir || !name || !excl_files) return (FALSE); if (!tlm_cat_path(full_name, dir, name)) { ! NDMP_LOG(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)) { --- 831,841 ---- if (!dir || !name || !excl_files) return (FALSE); if (!tlm_cat_path(full_name, dir, name)) { ! 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,888 **** { tlm_library_t *lp; if ((lp = tlm_library(l))) { lp->tl_capability_barcodes = TRUE; ! NDMP_LOG(LOG_DEBUG, "Barcode capability on library %d enabled.", l); } } /* --- 885,895 ---- { tlm_library_t *lp; if ((lp = tlm_library(l))) { lp->tl_capability_barcodes = TRUE; ! syslog(LOG_DEBUG, "Barcode capability on library %d enabled.", l); } } /*
*** 1023,1033 **** 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, "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)) --- 1030,1040 ---- sa->sa_link_head.sl_next = &sa->sa_link_head; /* Scan for the changer */ dirp = opendir(SCSI_CHANGER_DIR); if (dirp == NULL) { ! 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,1065 **** } /* Scan for tape drives */ dirp = opendir(SCSI_TAPE_DIR); if (dirp == NULL) { ! NDMP_LOG(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. " "Valid values are 'sysv' and 'bsd'."); return (-1); } while ((dp = readdir(dirp)) != NULL) { --- 1055,1072 ---- } /* Scan for tape drives */ dirp = opendir(SCSI_TAPE_DIR); if (dirp == NULL) { ! 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)) { ! syslog(LOG_ERR, "Invalid ndmpd/drive-type value. " "Valid values are 'sysv' and 'bsd'."); return (-1); } while ((dp = readdir(dirp)) != NULL) {
*** 1163,1184 **** int tlm_ioctl(int fd, int cmd, void *data) { int retries = 0; ! NDMP_LOG(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, "Failed to send command to device: %m."); ! NDMP_LOG(LOG_DEBUG, "IOCTL error %d", errno); return (errno); } (void) sleep(1); } while (retries++ < MAXIORETRY); --- 1170,1191 ---- int tlm_ioctl(int fd, int cmd, void *data) { int retries = 0; ! 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) { ! syslog(LOG_ERR, "Failed to send command to device: %m."); ! syslog(LOG_DEBUG, "IOCTL error %d", errno); return (errno); } (void) sleep(1); } while (retries++ < MAXIORETRY);
*** 1213,1223 **** (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", chk_name); (void) mutex_unlock(&zlib_mtx); return (-1); } --- 1220,1230 ---- (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) { ! syslog(LOG_DEBUG, "chkpnt_creationtime: open %s failed", chk_name); (void) mutex_unlock(&zlib_mtx); return (-1); }
*** 1236,1267 **** get_zfsvolname(char *volname, int len, char *path) { struct stat64 stbuf; struct extmnttab ent; FILE *mntfp; ! int rv; *volname = '\0'; if (stat64(path, &stbuf) != 0) { return (-1); } if ((mntfp = fopen(MNTTAB, "r")) == NULL) { 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) (void) strlcpy(volname, ent.mnt_special, len); ! else rv = -1; ! (void) fclose(mntfp); return (rv); } --- 1243,1277 ---- get_zfsvolname(char *volname, int len, char *path) { struct stat64 stbuf; struct extmnttab ent; FILE *mntfp; ! 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) { (void) strlcpy(volname, ent.mnt_special, len); ! } else { rv = -1; ! } (void) fclose(mntfp); return (rv); }