6941924 need stats for zfs-based ndmp backup
6957238 ndmpd-zfs: one-entry file history (i.e. file history phase 1)
6960384 fd leak in ndmpd_config_get_fs_info_v3
--- a/usr/src/cmd/ndmpd/ndmp/ndmpd_config.c Mon Jun 21 17:58:51 2010 -0400
+++ b/usr/src/cmd/ndmpd/ndmp/ndmpd_config.c Mon Jun 21 19:08:24 2010 -0400
@@ -495,6 +495,7 @@
zfs_attrs = NDMP_BUTYPE_BACKUP_UTF8 |
NDMP_BUTYPE_RECOVER_UTF8 |
+ NDMP_BUTYPE_BACKUP_DIRECT |
NDMP_BUTYPE_BACKUP_INCREMENTAL;
/* zfs backup type */
@@ -553,8 +554,10 @@
NDMP_LOG(LOG_ERR, "No file system found.");
ndmp_send_reply(connection, (void *)&reply,
"sending ndmp_config_get_fs_info reply");
+ (void) close(fd);
return;
}
+ (void) close(fd);
fp = fopen(MNTTAB, "r");
if (!fp) {
@@ -1007,6 +1010,7 @@
zfs_attrs = NDMP_BUTYPE_BACKUP_UTF8 |
NDMP_BUTYPE_RECOVER_UTF8 |
+ NDMP_BUTYPE_BACKUP_DIRECT |
NDMP_BUTYPE_BACKUP_INCREMENTAL;
/* zfs backup type */
--- a/usr/src/cmd/ndmpd/ndmp/ndmpd_zfs.c Mon Jun 21 17:58:51 2010 -0400
+++ b/usr/src/cmd/ndmpd/ndmp/ndmpd_zfs.c Mon Jun 21 19:08:24 2010 -0400
@@ -100,6 +100,7 @@
static int ndmpd_zfs_getenv_dmp_name(ndmpd_zfs_args_t *);
static boolean_t ndmpd_zfs_dmp_name_valid(ndmpd_zfs_args_t *, char *);
static boolean_t ndmpd_zfs_is_incremental(ndmpd_zfs_args_t *);
+static int ndmpd_zfs_send_fhist(ndmpd_zfs_args_t *);
static int ndmpd_zfs_snapshot_prepare(ndmpd_zfs_args_t *);
static int ndmpd_zfs_snapshot_cleanup(ndmpd_zfs_args_t *, int);
@@ -483,7 +484,8 @@
"data bytes_total(including header):%llu",
session->ns_data.dd_module.dm_stats.ms_bytes_processed);
- err |= cleanup_err;
+ if (err == 0)
+ err = ndmpd_zfs_send_fhist(ndmpd_zfs_args);
_done:
NS_DEC(nbk);
@@ -495,6 +497,49 @@
}
static int
+ndmpd_zfs_send_fhist(ndmpd_zfs_args_t *ndmpd_zfs_args)
+{
+ ndmpd_session_t *session = (ndmpd_session_t *)
+ (ndmpd_zfs_params->mp_daemon_cookie);
+ struct stat64 st;
+ char *envp;
+ zfs_handle_t *zhp;
+ char mountpoint[PATH_MAX];
+
+ envp = MOD_GETENV(ndmpd_zfs_params, "HIST");
+ if (!envp)
+ return (0);
+
+ if (!(strchr("YT", toupper(*envp)))) {
+ ndmpd_zfs_dma_log(ndmpd_zfs_args, NDMP_LOG_WARNING,
+ "HIST is not set. No file history will be "
+ "generated.\n");
+ return (0);
+ }
+
+ if ((zhp = zfs_open(ndmpd_zfs_args->nz_zlibh,
+ ndmpd_zfs_args->nz_dataset, ndmpd_zfs_args->nz_type)) == NULL ||
+ zfs_prop_get(zhp, ZFS_PROP_MOUNTPOINT, mountpoint, PATH_MAX, NULL,
+ NULL, 0, B_FALSE) != 0 ||
+ stat64(mountpoint, &st) != 0)
+ (void) memset(&st, 0, sizeof (struct stat64));
+ if (zhp)
+ zfs_close(zhp);
+
+ if (ndmpd_api_file_history_dir_v3(session, ".", ROOT_INODE,
+ ROOT_INODE) != 0)
+ return (-1);
+ if (ndmpd_api_file_history_dir_v3(session, "..", ROOT_INODE,
+ ROOT_INODE) != 0)
+ return (-1);
+ if (ndmpd_api_file_history_node_v3(session, ROOT_INODE, &st, 0) != 0)
+ return (-1);
+
+ ndmpd_file_history_cleanup(session, TRUE);
+ return (0);
+}
+
+static int
ndmpd_zfs_backup(ndmpd_zfs_args_t *ndmpd_zfs_args)
{
ndmpd_session_t *session = (ndmpd_session_t *)
@@ -670,6 +715,7 @@
free(buf);
return (-1);
}
+ NS_ADD(rdisk, count);
if (MOD_WRITE(ndmpd_zfs_params, buf, count) != 0) {
(void) ndmpd_zfs_abort((void *) ndmpd_zfs_args);
@@ -787,6 +833,7 @@
*bytes_totalp);
(void) write(ndmpd_zfs_args->nz_pipe_fd[PIPE_TAPE],
buf, bufsize);
+ NS_ADD(wdisk, bufsize);
break;
}
@@ -811,6 +858,7 @@
return (-1);
}
+ NS_ADD(wdisk, count);
*bytes_totalp += count;