changeset 13035:7a57e737278a

6902374 NDMP : Backup/restore fails with error 'Undetermined network port', if DNS is not proper 6888462 NDMP: ndmp bytes to/from disk and ndmpstat in error when seeking on tape 6973946 snapname needs to be filled in for "recursive" case
author Reza Sabdar <Reza.Sabdar@Sun.COM>
date Thu, 05 Aug 2010 14:45:06 -0400
parents 03fd5152c466
children 9c1800b4023e
files usr/src/cmd/ndmpd/Makefile usr/src/cmd/ndmpd/ndmp/ndmpd.h usr/src/cmd/ndmpd/ndmp/ndmpd_chkpnt.c usr/src/cmd/ndmpd/ndmp/ndmpd_comm.c usr/src/cmd/ndmpd/ndmp/ndmpd_util.c usr/src/cmd/ndmpd/tlm/tlm_restore_writer.c
diffstat 6 files changed, 46 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/usr/src/cmd/ndmpd/Makefile	Thu Aug 05 11:13:43 2010 -0700
+++ b/usr/src/cmd/ndmpd/Makefile	Thu Aug 05 14:45:06 2010 -0400
@@ -65,7 +65,7 @@
 # argument used inconsistently
 LINTFLAGS += -xerroff=E_INCONS_ARG_USED2 
 
-LDLIBS   += -lsocket -lnsl -lzfs -lsec -lndmp -lmd5 -lnvpair -lumem -lbsm -lgen -lcmdutils
+LDLIBS   += -lsocket -lnsl -lzfs -lsec -lndmp -lmd5 -lnvpair -lumem -lbsm -lgen -lcmdutils -linetutil
 
 OBJS= \
 	$(NDMP_DIR)/ndmp_xdr.o \
--- a/usr/src/cmd/ndmpd/ndmp/ndmpd.h	Thu Aug 05 11:13:43 2010 -0700
+++ b/usr/src/cmd/ndmpd/ndmp/ndmpd.h	Thu Aug 05 14:45:06 2010 -0400
@@ -1032,6 +1032,7 @@
 extern int tcp_get_peer(int, unsigned int *, int *);
 
 extern char *gethostaddr(void);
+extern char *get_default_nic_addr(void);
 extern int tlm_init(void);
 
 extern int snapshot_create(char *, char *, boolean_t, boolean_t);
--- a/usr/src/cmd/ndmpd/ndmp/ndmpd_chkpnt.c	Thu Aug 05 11:13:43 2010 -0700
+++ b/usr/src/cmd/ndmpd/ndmp/ndmpd_chkpnt.c	Thu Aug 05 14:45:06 2010 -0400
@@ -288,6 +288,7 @@
 	char snapname[ZFS_MAXNAMELEN];
 	zfs_handle_t *zhp;
 	zfs_type_t ztype;
+	char *namep;
 	int err;
 
 	if (zfs_err)
@@ -298,25 +299,27 @@
 
 	if (recursive) {
 		ztype = ZFS_TYPE_VOLUME | ZFS_TYPE_FILESYSTEM;
+		namep = volname;
 	} else {
 		(void) snprintf(snapname, ZFS_MAXNAMELEN, "%s@%s", volname,
 		    jname);
+		namep = snapname;
 		ztype = ZFS_TYPE_SNAPSHOT;
 	}
 
 	(void) mutex_lock(&zlib_mtx);
 	if (hold &&
-	    snapshot_release(volname, snapname, jname, recursive) != 0) {
+	    snapshot_release(volname, namep, jname, recursive) != 0) {
 		NDMP_LOG(LOG_DEBUG,
 		    "snapshot_destroy: %s release failed (err=%d): %s",
-		    snapname, errno, libzfs_error_description(zlibh));
+		    namep, errno, libzfs_error_description(zlibh));
 		(void) mutex_unlock(&zlib_mtx);
 		return (-1);
 	}
 
-	if ((zhp = zfs_open(zlibh, snapname, ztype)) == NULL) {
+	if ((zhp = zfs_open(zlibh, namep, ztype)) == NULL) {
 		NDMP_LOG(LOG_DEBUG, "snapshot_destroy: open %s failed",
-		    snapname);
+		    namep);
 		(void) mutex_unlock(&zlib_mtx);
 		return (-1);
 	}
@@ -329,7 +332,7 @@
 
 	if (err) {
 		NDMP_LOG(LOG_ERR, "%s (recursive destroy: %d): %d; %s; %s",
-		    snapname,
+		    namep,
 		    recursive,
 		    libzfs_errno(zlibh),
 		    libzfs_error_action(zlibh),
--- a/usr/src/cmd/ndmpd/ndmp/ndmpd_comm.c	Thu Aug 05 11:13:43 2010 -0700
+++ b/usr/src/cmd/ndmpd/ndmp/ndmpd_comm.c	Thu Aug 05 14:45:06 2010 -0400
@@ -49,6 +49,7 @@
 #include <netdb.h>
 #include <netinet/in.h>
 #include <arpa/inet.h>
+#include <libinetutil.h>
 #include "ndmpd.h"
 #include "ndmpd_common.h"
 
@@ -1503,6 +1504,32 @@
 	return (inet_ntoa(in));
 }
 
+
+/*
+ * get_default_nic_addr
+ *
+ * Get the IP address of the default NIC
+ */
+char *
+get_default_nic_addr(void)
+{
+	struct ifaddrlist *al = NULL;
+	char errmsg[ERRBUFSIZE];
+	struct in_addr addr;
+	int nifs;
+
+	nifs = ifaddrlist(&al, AF_INET, LIFC_EXTERNAL_SOURCE, errmsg);
+	if (nifs <= 0)
+		return (NULL);
+
+	/* pick the first interface's address */
+	addr = al[0].addr.addr;
+	free(al);
+
+	return (inet_ntoa(IN_ADDR(addr.s_addr)));
+}
+
+
 /*
  * ndmpd_audit_backup
  *
--- a/usr/src/cmd/ndmpd/ndmp/ndmpd_util.c	Thu Aug 05 11:13:43 2010 -0700
+++ b/usr/src/cmd/ndmpd/ndmp/ndmpd_util.c	Thu Aug 05 14:45:06 2010 -0400
@@ -2125,11 +2125,18 @@
 	int sd;
 	struct sockaddr_in sin;
 
+	/* Try the user's prefered NIC IP address */
 	p = ndmpd_get_prop(NDMP_MOVER_NIC);
 
+	/* Try host's IP address */
 	if (!p || *p == 0)
 		p = gethostaddr();
 
+	/* Try default NIC's IP address (if DNS failed) */
+	if (!p)
+		p = get_default_nic_addr();
+
+	/* Fail if no IP can be obtained */
 	if (!p) {
 		NDMP_LOG(LOG_ERR, "Undetermined network port.");
 		return (-1);
--- a/usr/src/cmd/ndmpd/tlm/tlm_restore_writer.c	Thu Aug 05 11:13:43 2010 -0700
+++ b/usr/src/cmd/ndmpd/tlm/tlm_restore_writer.c	Thu Aug 05 14:45:06 2010 -0400
@@ -1254,9 +1254,9 @@
 			write_size = min(size, actual_size);
 			if (want_this_file) {
 				write_size = write(*fp, rec, write_size);
+				NS_ADD(wdisk, write_size);
+				NS_INC(wfile);
 			}
-			NS_ADD(wdisk, write_size);
-			NS_INC(wfile);
 			size -= write_size;
 		}
 	}