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);
}