6941924 need stats for zfs-based ndmp backup
authorReza Sabdar <Reza.Sabdar@Sun.COM>
Mon, 21 Jun 2010 19:08:24 -0400
changeset 12669 d6e297b04d5d
parent 12668 12abda5fe158
child 12670 0ac66a96529d
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
usr/src/cmd/ndmpd/ndmp/ndmpd_config.c
usr/src/cmd/ndmpd/ndmp/ndmpd_zfs.c
--- 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;