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-2990 ndmpd dumping core when used with ndmpcopy
NEX-2911 NDMP logging should use syslog and is too chatty
NEX-2911 NDMP logging should use syslog and is too chatty
NEX-1512 NDMP fails in Restore files with Symantec Netbackup
NEX-1263 socket buffer sizes in NDMP are set to very low value
Reviewed by: sarah.jelinek@nexenta.com
Reviewed by: marcel.telka@nexenta.com
Reviewed by: albert.lee@nexenta.com
Reviewed by: hans.rosenfeld@nexenta.com
NEX-727 Netbackup Catalog verification hangs waiting for NDMP server
NEX-559 NDMP cannot backup/restore a file which spans multiple tapes

*** 35,47 **** * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* Copyright (c) 2007, The Storage Networking Industry Association. */ /* Copyright (c) 1996, 1997 PDC, Network Appliance. All Rights Reserved */ ! /* Copyright 2014 Nexenta Systems, Inc. All rights reserved. */ #include <sys/types.h> #include <assert.h> #include <ctype.h> #include <errno.h> #include <stdio.h> #include <stdlib.h> --- 35,48 ---- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* Copyright (c) 2007, The Storage Networking Industry Association. */ /* Copyright (c) 1996, 1997 PDC, Network Appliance. All Rights Reserved */ ! /* Copyright 2017 Nexenta Systems, Inc. All rights reserved. */ #include <sys/types.h> + #include <syslog.h> #include <assert.h> #include <ctype.h> #include <errno.h> #include <stdio.h> #include <stdlib.h>
*** 151,168 **** EXCL_TMP, NULL, /* reserved for a copy of the "backup.directory" */ NULL }; - /* ! * The counter for creating unique names with "ndmp.%d" format. */ - #define NDMP_RCF_BASENAME "ndmp." static int ndmp_job_cnt = 0; static int scsi_test_unit_ready(int dev_id); /* * ndmpd_add_file_handler * * Adds a file handler to the file handler list. --- 152,168 ---- EXCL_TMP, NULL, /* reserved for a copy of the "backup.directory" */ NULL }; /* ! * The counter for creating unique names with "NDMP_RCF_BASENAME.%d" format. */ static int ndmp_job_cnt = 0; static int scsi_test_unit_ready(int dev_id); + static int ndmpd_mkdir(const char *); /* * ndmpd_add_file_handler * * Adds a file handler to the file handler list.
*** 306,320 **** closed = ndmp_connection_closed(moverfd); if (closed) { /* Connection closed or internal error */ if (closed > 0) { ! NDMP_LOG(LOG_DEBUG, "ndmp mover: connection closed by peer"); reason = NDMP_MOVER_HALT_CONNECT_CLOSED; } else { ! NDMP_LOG(LOG_DEBUG, "ndmp mover: Internal error"); reason = NDMP_MOVER_HALT_INTERNAL_ERROR; } ndmpd_mover_error(session, reason); --- 306,320 ---- closed = ndmp_connection_closed(moverfd); if (closed) { /* Connection closed or internal error */ if (closed > 0) { ! syslog(LOG_DEBUG, "ndmp mover: connection closed by peer"); reason = NDMP_MOVER_HALT_CONNECT_CLOSED; } else { ! syslog(LOG_DEBUG, "ndmp mover: Internal error"); reason = NDMP_MOVER_HALT_INTERNAL_ERROR; } ndmpd_mover_error(session, reason);
*** 401,412 **** int connection_fd = ndmp_get_fd(session->ns_connection); if (errno == EINTR) return (0); - NDMP_LOG(LOG_DEBUG, "Select error: %m"); - nlp = ndmp_get_nlp(session); (void) mutex_lock(&nlp->nlp_mtx); for (handler = session->ns_file_handler_list; handler != 0; handler = handler->fh_next) { if ((handler->fh_class & class_mask) == 0) --- 401,410 ----
*** 520,530 **** if (valbuf == 0) { free(namebuf); return (NDMP_NO_MEM_ERR); } ! NDMP_LOG(LOG_DEBUG, "env(%s): \"%s\"", namebuf, valbuf); (void) mutex_lock(&session->ns_lock); session->ns_data.dd_env[i].name = namebuf; session->ns_data.dd_env[i].value = valbuf; --- 518,528 ---- if (valbuf == 0) { free(namebuf); return (NDMP_NO_MEM_ERR); } ! syslog(LOG_DEBUG, "env(%s): \"%s\"", namebuf, valbuf); (void) mutex_lock(&session->ns_lock); session->ns_data.dd_env[i].name = namebuf; session->ns_data.dd_env[i].value = valbuf;
*** 592,602 **** if (nlistlen == 0) return (NDMP_NO_ERR); session->ns_data.dd_nlist_len = 0; ! session->ns_data.dd_nlist = ndmp_malloc(sizeof (ndmp_name)*nlistlen); if (session->ns_data.dd_nlist == 0) return (NDMP_NO_MEM_ERR); for (i = 0; i < nlistlen; i++) { namebuf = ndmp_malloc(strlen(nlist[i].name) + 1); --- 590,601 ---- if (nlistlen == 0) return (NDMP_NO_ERR); session->ns_data.dd_nlist_len = 0; ! session->ns_data.dd_nlist = ! ndmp_malloc(sizeof (ndmp_name)*(nlistlen + 1)); if (session->ns_data.dd_nlist == 0) return (NDMP_NO_MEM_ERR); for (i = 0; i < nlistlen; i++) { namebuf = ndmp_malloc(strlen(nlist[i].name) + 1);
*** 744,758 **** tp->nm3_node = quad_to_long_long(sp->node); tp->nm3_fh_info = quad_to_long_long(sp->fh_info); tp->nm3_err = NDMP_NO_ERR; session->ns_data.dd_nlist_len++; - NDMP_LOG(LOG_DEBUG, "orig \"%s\"", tp->nm3_opath); - NDMP_LOG(LOG_DEBUG, "dest \"%s\"", NDMP_SVAL(tp->nm3_dpath)); - NDMP_LOG(LOG_DEBUG, "name \"%s\"", NDMP_SVAL(tp->nm3_newnm)); - NDMP_LOG(LOG_DEBUG, "node %lld", tp->nm3_node); - NDMP_LOG(LOG_DEBUG, "fh_info %lld", tp->nm3_fh_info); } if (rv != NDMP_NO_ERR) ndmpd_free_nlist_v3(session); --- 743,752 ----
*** 783,793 **** case 4: ndmpd_free_nlist_v3(session); break; default: ! NDMP_LOG(LOG_DEBUG, "Unknown version %d", session->ns_protocol_version); } } --- 777,787 ---- case 4: ndmpd_free_nlist_v3(session); break; default: ! syslog(LOG_DEBUG, "Unknown version %d", session->ns_protocol_version); } }
*** 861,871 **** */ void ndmp_send_reply(ndmp_connection_t *connection, void *reply, char *msg) { if (ndmp_send_response(connection, NDMP_NO_ERR, reply) < 0) ! NDMP_LOG(LOG_DEBUG, "%s", msg); } /* * ndmp_mtioctl --- 855,865 ---- */ void ndmp_send_reply(ndmp_connection_t *connection, void *reply, char *msg) { if (ndmp_send_response(connection, NDMP_NO_ERR, reply) < 0) ! syslog(LOG_DEBUG, "%s", msg); } /* * ndmp_mtioctl
*** 883,893 **** struct mtop mp; mp.mt_op = cmd; mp.mt_count = count; if (ioctl(fd, MTIOCTOP, &mp) < 0) { ! NDMP_LOG(LOG_ERR, "Failed to send command to tape: %m."); return (-1); } return (0); } --- 877,887 ---- struct mtop mp; mp.mt_op = cmd; mp.mt_count = count; if (ioctl(fd, MTIOCTOP, &mp) < 0) { ! syslog(LOG_ERR, "Failed to send command to tape: %m."); return (-1); } return (0); }
*** 932,960 **** val = atoi((const char *)ndmpd_get_prop_default(NDMP_SOCKET_CSS, "60")); if (val <= 0) val = 60; val <<= 10; /* convert the value from kilobytes to bytes */ if (setsockopt(sock, SOL_SOCKET, SO_SNDBUF, &val, sizeof (val)) < 0) ! NDMP_LOG(LOG_ERR, "SO_SNDBUF failed: %m"); /* set receive buffer size */ val = atoi((const char *)ndmpd_get_prop_default(NDMP_SOCKET_CRS, "60")); if (val <= 0) val = 60; val <<= 10; /* convert the value from kilobytes to bytes */ if (setsockopt(sock, SOL_SOCKET, SO_RCVBUF, &val, sizeof (val)) < 0) ! NDMP_LOG(LOG_ERR, "SO_RCVBUF failed: %m"); /* don't wait to group tcp data */ val = 1; if (setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, &val, sizeof (val)) != 0) ! NDMP_LOG(LOG_ERR, "TCP_NODELAY failed: %m"); /* tcp keep-alive */ val = 1; if (setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, &val, sizeof (val)) != 0) ! NDMP_LOG(LOG_ERR, "SO_KEEPALIVE failed: %m"); } /* * ndmp_get_max_tok_seq * --- 926,954 ---- val = atoi((const char *)ndmpd_get_prop_default(NDMP_SOCKET_CSS, "60")); if (val <= 0) val = 60; val <<= 10; /* convert the value from kilobytes to bytes */ if (setsockopt(sock, SOL_SOCKET, SO_SNDBUF, &val, sizeof (val)) < 0) ! syslog(LOG_ERR, "SO_SNDBUF failed: %m"); /* set receive buffer size */ val = atoi((const char *)ndmpd_get_prop_default(NDMP_SOCKET_CRS, "60")); if (val <= 0) val = 60; val <<= 10; /* convert the value from kilobytes to bytes */ if (setsockopt(sock, SOL_SOCKET, SO_RCVBUF, &val, sizeof (val)) < 0) ! syslog(LOG_ERR, "SO_RCVBUF failed: %m"); /* don't wait to group tcp data */ val = 1; if (setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, &val, sizeof (val)) != 0) ! syslog(LOG_ERR, "TCP_NODELAY failed: %m"); /* tcp keep-alive */ val = 1; if (setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, &val, sizeof (val)) != 0) ! syslog(LOG_ERR, "SO_KEEPALIVE failed: %m"); } /* * ndmp_get_max_tok_seq *
*** 997,1015 **** "60")); if (xfer_size > 0) xfer_size *= KILOBYTE; else xfer_size = REMOTE_RECORD_SIZE; ! NDMP_LOG(LOG_DEBUG, "Remote operation: %d", xfer_size); } else { ! NDMP_LOG(LOG_DEBUG, "Local operation: %lu", session->ns_mover.md_record_size); if ((xfer_size = session->ns_mover.md_record_size) == 0) xfer_size = MAX_RECORD_SIZE; } ! NDMP_LOG(LOG_DEBUG, "xfer_size: %d", xfer_size); return (xfer_size); } /* --- 991,1009 ---- "60")); if (xfer_size > 0) xfer_size *= KILOBYTE; else xfer_size = REMOTE_RECORD_SIZE; ! syslog(LOG_DEBUG, "Remote operation: %d", xfer_size); } else { ! syslog(LOG_DEBUG, "Local operation: %lu", session->ns_mover.md_record_size); if ((xfer_size = session->ns_mover.md_record_size) == 0) xfer_size = MAX_RECORD_SIZE; } ! syslog(LOG_DEBUG, "xfer_size: %d", xfer_size); return (xfer_size); } /*
*** 1026,1036 **** */ int ndmp_lbr_init(ndmpd_session_t *session) { if (session->ns_ndmp_lbr_params != NULL) { ! NDMP_LOG(LOG_DEBUG, "ndmp_lbr_params already allocated."); return (0); } session->ns_ndmp_lbr_params = ndmp_malloc(sizeof (ndmp_lbr_params_t)); if (session->ns_ndmp_lbr_params == NULL) --- 1020,1030 ---- */ int ndmp_lbr_init(ndmpd_session_t *session) { if (session->ns_ndmp_lbr_params != NULL) { ! syslog(LOG_DEBUG, "ndmp_lbr_params already allocated."); return (0); } session->ns_ndmp_lbr_params = ndmp_malloc(sizeof (ndmp_lbr_params_t)); if (session->ns_ndmp_lbr_params == NULL)
*** 1099,1120 **** return (-1); (void) mutex_lock(&nlp->nlp_mtx); while (session->ns_mover.md_state == NDMP_MOVER_STATE_PAUSED) { if (session->ns_eof) { ! NDMP_LOG(LOG_ERR, "EOF detected"); break; } if (session->ns_data.dd_abort) { ! NDMP_LOG(LOG_DEBUG, "Received data abort"); break; } if (session->ns_data.dd_mover.addr_type == NDMP_ADDR_TCP) { /* remote backup/restore error */ if (session->ns_mover.md_sock == -1 && session->ns_mover.md_listen_sock == -1) { ! NDMP_LOG(LOG_ERR, "Remote data connection terminated"); break; } } else { /* local backup/restore error */ --- 1093,1114 ---- return (-1); (void) mutex_lock(&nlp->nlp_mtx); while (session->ns_mover.md_state == NDMP_MOVER_STATE_PAUSED) { if (session->ns_eof) { ! syslog(LOG_ERR, "EOF detected"); break; } if (session->ns_data.dd_abort) { ! syslog(LOG_DEBUG, "Received data abort"); break; } if (session->ns_data.dd_mover.addr_type == NDMP_ADDR_TCP) { /* remote backup/restore error */ if (session->ns_mover.md_sock == -1 && session->ns_mover.md_listen_sock == -1) { ! syslog(LOG_ERR, "Remote data connection terminated"); break; } } else { /* local backup/restore error */
*** 1121,1131 **** if ((lcmd = nlp->nlp_cmds.tcs_command) != NULL) { if (lcmd->tc_reader == TLM_STOP || lcmd->tc_reader == TLM_ABORT || lcmd->tc_writer == TLM_STOP || lcmd->tc_writer == TLM_ABORT) { ! NDMP_LOG(LOG_ERR, "Local data connection terminated"); break; } } } --- 1115,1125 ---- if ((lcmd = nlp->nlp_cmds.tcs_command) != NULL) { if (lcmd->tc_reader == TLM_STOP || lcmd->tc_reader == TLM_ABORT || lcmd->tc_writer == TLM_STOP || lcmd->tc_writer == TLM_ABORT) { ! syslog(LOG_ERR, "Local data connection terminated"); break; } } }
*** 1154,1166 **** rv = (buf == NULL || buf->tb_eot || buf->tb_eof || buf->tb_errno != 0); if (rv) { if (buf == NULL) { ! NDMP_LOG(LOG_DEBUG, "buf == NULL"); } else { ! NDMP_LOG(LOG_DEBUG, "eot: %u, eof: %u, errno: %d", buf->tb_eot, buf->tb_eof, buf->tb_errno); } } return (rv); --- 1148,1160 ---- rv = (buf == NULL || buf->tb_eot || buf->tb_eof || buf->tb_errno != 0); if (rv) { if (buf == NULL) { ! syslog(LOG_DEBUG, "buf == NULL"); } else { ! syslog(LOG_DEBUG, "eot: %u, eof: %u, errno: %d", buf->tb_eot, buf->tb_eof, buf->tb_errno); } } return (rv);
*** 1208,1218 **** if ((cmd.uscsi_bufaddr = ndmp_malloc(request->datain_len)) == 0) { reply.error = NDMP_NO_MEM_ERR; if (ndmp_send_response(session->ns_connection, NDMP_NO_ERR, (void *)&reply) < 0) ! NDMP_LOG(LOG_DEBUG, "error sending" " scsi_execute_cdb reply."); return; } cmd.uscsi_buflen = request->datain_len; --- 1202,1212 ---- if ((cmd.uscsi_bufaddr = ndmp_malloc(request->datain_len)) == 0) { reply.error = NDMP_NO_MEM_ERR; if (ndmp_send_response(session->ns_connection, NDMP_NO_ERR, (void *)&reply) < 0) ! syslog(LOG_DEBUG, "error sending" " scsi_execute_cdb reply."); return; } cmd.uscsi_buflen = request->datain_len;
*** 1232,1247 **** 1 : (request->timeout / 1000); cmd.uscsi_cdb = (caddr_t)request->cdb.cdb_val; cmd.uscsi_cdblen = request->cdb.cdb_len; - NDMP_LOG(LOG_DEBUG, "cmd: 0x%x, len: %d, flags: %d, datain_len: %d", - request->cdb.cdb_val[0] & 0xff, request->cdb.cdb_len, - request->flags, request->datain_len); - NDMP_LOG(LOG_DEBUG, "dataout_len: %d, timeout: %d", - request->dataout.dataout_len, request->timeout); - if (request->cdb.cdb_len > 12) { reply.error = NDMP_ILLEGAL_ARGS_ERR; ndmp_send_reply(session->ns_connection, (void *) &reply, "sending execute_cdb reply"); if (request->flags == NDMP_SCSI_DATA_IN) --- 1226,1235 ----
*** 1261,1274 **** free(cmd.uscsi_bufaddr); return; } if (ioctl(fd, USCSICMD, &cmd) < 0) { ! if (errno != EIO && errno != 0) ! NDMP_LOG(LOG_ERR, "Failed to send command to device: %m"); ! NDMP_LOG(LOG_DEBUG, "ioctl(USCSICMD) error: %m"); if (cmd.uscsi_status == 0) reply.error = NDMP_IO_ERR; } reply.status = cmd.uscsi_status; --- 1249,1262 ---- free(cmd.uscsi_bufaddr); return; } if (ioctl(fd, USCSICMD, &cmd) < 0) { ! if (errno != EIO && errno != 0) { ! syslog(LOG_ERR, "Failed to send command to device: %m"); ! } if (cmd.uscsi_status == 0) reply.error = NDMP_IO_ERR; } reply.status = cmd.uscsi_status;
*** 1283,1293 **** reply.ext_sense.ext_sense_len = cmd.uscsi_rqlen - cmd.uscsi_rqresid; reply.ext_sense.ext_sense_val = rq_buf; if (ndmp_send_response(session->ns_connection, NDMP_NO_ERR, (void *)&reply) < 0) ! NDMP_LOG(LOG_DEBUG, "Error sending scsi_execute_cdb reply."); if (request->flags == NDMP_SCSI_DATA_IN) free(cmd.uscsi_bufaddr); } --- 1271,1281 ---- reply.ext_sense.ext_sense_len = cmd.uscsi_rqlen - cmd.uscsi_rqresid; reply.ext_sense.ext_sense_val = rq_buf; if (ndmp_send_response(session->ns_connection, NDMP_NO_ERR, (void *)&reply) < 0) ! syslog(LOG_DEBUG, "Error sending scsi_execute_cdb reply."); if (request->flags == NDMP_SCSI_DATA_IN) free(cmd.uscsi_bufaddr); }
*** 1307,1318 **** void ndmp_stop_local_reader(ndmpd_session_t *session, tlm_commands_t *cmds) { ndmp_lbr_params_t *nlp; ! if (session != NULL && session->ns_data.dd_sock == -1) { ! /* 2-way restore */ if (cmds != NULL && cmds->tcs_reader_count > 0) { if ((nlp = ndmp_get_nlp(session)) != NULL) { (void) mutex_lock(&nlp->nlp_mtx); cmds->tcs_command->tc_reader = TLM_STOP; (void) cond_broadcast(&nlp->nlp_cv); --- 1295,1305 ---- void ndmp_stop_local_reader(ndmpd_session_t *session, tlm_commands_t *cmds) { ndmp_lbr_params_t *nlp; ! if (session != NULL) { if (cmds != NULL && cmds->tcs_reader_count > 0) { if ((nlp = ndmp_get_nlp(session)) != NULL) { (void) mutex_lock(&nlp->nlp_mtx); cmds->tcs_command->tc_reader = TLM_STOP; (void) cond_broadcast(&nlp->nlp_cv);
*** 1339,1349 **** if (session != NULL) { if (session->ns_data.dd_sock >= 0) { /* * 3-way restore. */ ! NDMP_LOG(LOG_DEBUG, "data.sock: %d", session->ns_data.dd_sock); (void) close(session->ns_data.dd_sock); session->ns_data.dd_sock = -1; } } --- 1326,1336 ---- if (session != NULL) { if (session->ns_data.dd_sock >= 0) { /* * 3-way restore. */ ! syslog(LOG_DEBUG, "data.sock: %d", session->ns_data.dd_sock); (void) close(session->ns_data.dd_sock); session->ns_data.dd_sock = -1; } }
*** 1356,1371 **** * Wait for a reader until get done (busy wait) */ void ndmp_wait_for_reader(tlm_commands_t *cmds) { ! if (cmds == NULL) { ! NDMP_LOG(LOG_DEBUG, "cmds == NULL"); ! } else { ! NDMP_LOG(LOG_DEBUG, ! "reader_count: %d", cmds->tcs_reader_count); ! while (cmds->tcs_reader_count > 0) (void) sleep(1); } } --- 1343,1353 ---- * Wait for a reader until get done (busy wait) */ void ndmp_wait_for_reader(tlm_commands_t *cmds) { ! if (cmds != NULL) { while (cmds->tcs_reader_count > 0) (void) sleep(1); } }
*** 1388,1398 **** { struct ol_head *olhp; struct open_list *olp; if (dev == NULL || *dev == '\0') { - NDMP_LOG(LOG_DEBUG, "Invalid argument"); return (NULL); } (void) mutex_lock(&ol_mutex); olhp = &ol_head; --- 1370,1379 ----
*** 1429,1449 **** int err; struct ol_head *olhp; struct open_list *olp; if (dev == NULL || *dev == '\0') { - NDMP_LOG(LOG_DEBUG, "Invalid argument"); return (EINVAL); } - NDMP_LOG(LOG_DEBUG, - "conn: 0x%08x, dev: %s, sid: %d, lun: %d", conn, dev, sid, lun); err = 0; olhp = &ol_head; if ((olp = ndmp_open_list_find(dev, sid, lun)) != NULL) { - NDMP_LOG(LOG_DEBUG, "already in list"); /* * The adapter handle can be opened many times by the clients. * Only when the target is set, we must check and reject the * open request if the device is already being used by another * session. --- 1410,1426 ----
*** 1453,1463 **** else err = EBUSY; } else if ((olp = ndmp_malloc(sizeof (struct open_list))) == NULL) { err = ENOMEM; } else if ((olp->ol_devnm = strdup(dev)) == NULL) { ! NDMP_LOG(LOG_ERR, "Out of memory."); free(olp); err = ENOMEM; } else { olp->cl_conn = conn; olp->ol_nref = 1; --- 1430,1440 ---- else err = EBUSY; } else if ((olp = ndmp_malloc(sizeof (struct open_list))) == NULL) { err = ENOMEM; } else if ((olp->ol_devnm = strdup(dev)) == NULL) { ! syslog(LOG_ERR, "Out of memory."); free(olp); err = ENOMEM; } else { olp->cl_conn = conn; olp->ol_nref = 1;
*** 1493,1514 **** ndmp_open_list_del(char *dev, int sid, int lun) { struct open_list *olp; if (dev == NULL || *dev == '\0') { ! NDMP_LOG(LOG_DEBUG, "Invalid argument"); return (EINVAL); } if ((olp = ndmp_open_list_find(dev, sid, lun)) == NULL) { ! NDMP_LOG(LOG_DEBUG, "%s not found", dev); return (ENOENT); } (void) mutex_lock(&ol_mutex); if (--olp->ol_nref <= 0) { - NDMP_LOG(LOG_DEBUG, - "Removed dev: %s, sid: %d, lun: %d", dev, sid, lun); LIST_REMOVE(olp, ol_q); free(olp->ol_devnm); free(olp); } (void) mutex_unlock(&ol_mutex); --- 1470,1489 ---- ndmp_open_list_del(char *dev, int sid, int lun) { struct open_list *olp; if (dev == NULL || *dev == '\0') { ! syslog(LOG_DEBUG, "Invalid argument"); return (EINVAL); } if ((olp = ndmp_open_list_find(dev, sid, lun)) == NULL) { ! syslog(LOG_DEBUG, "%s not found", dev); return (ENOENT); } (void) mutex_lock(&ol_mutex); if (--olp->ol_nref <= 0) { LIST_REMOVE(olp, ol_q); free(olp->ol_devnm); free(olp); } (void) mutex_unlock(&ol_mutex);
*** 1537,1551 **** (void) mutex_lock(&ol_mutex); olp = LIST_FIRST(olhp); while (olp != NULL) { next = LIST_NEXT(olp, ol_q); - NDMP_LOG(LOG_DEBUG, "olp->conn 0x%08x", olp->cl_conn); if (olp->cl_conn == conn) { - NDMP_LOG(LOG_DEBUG, - "Removed dev: %s, sid: %d, lun: %d", - olp->ol_devnm, olp->ol_sid, olp->ol_lun); LIST_REMOVE(olp, ol_q); if (olp->ol_fd > 0) (void) close(olp->ol_fd); free(olp->ol_devnm); free(olp); --- 1512,1522 ----
*** 1573,1594 **** ndmp_lbr_params_t *nlp; tlm_commands_t *cmds; session->ns_tape.td_pos = 0; if ((nlp = ndmp_get_nlp(session)) == NULL) { ! NDMP_LOG(LOG_DEBUG, "nlp == NULL"); } else { cmds = &nlp->nlp_cmds; ! if (cmds->tcs_command == NULL) { ! NDMP_LOG(LOG_DEBUG, "cmds->tcs_command == NULL"); ! } else { cmds->tcs_reader = cmds->tcs_writer = TLM_ABORT; cmds->tcs_command->tc_reader = TLM_ABORT; cmds->tcs_command->tc_writer = TLM_ABORT; while (cmds->tcs_reader_count > 0 || cmds->tcs_writer_count > 0) { ! NDMP_LOG(LOG_DEBUG, "trying to stop buffer worker"); (void) sleep(1); } } } --- 1544,1563 ---- ndmp_lbr_params_t *nlp; tlm_commands_t *cmds; session->ns_tape.td_pos = 0; if ((nlp = ndmp_get_nlp(session)) == NULL) { ! syslog(LOG_DEBUG, "nlp == NULL"); } else { cmds = &nlp->nlp_cmds; ! if (cmds->tcs_command != NULL) { cmds->tcs_reader = cmds->tcs_writer = TLM_ABORT; cmds->tcs_command->tc_reader = TLM_ABORT; cmds->tcs_command->tc_writer = TLM_ABORT; while (cmds->tcs_reader_count > 0 || cmds->tcs_writer_count > 0) { ! syslog(LOG_DEBUG, "trying to stop buffer worker"); (void) sleep(1); } } }
*** 1611,1630 **** { ndmp_lbr_params_t *nlp; tlm_commands_t *cmds; if ((nlp = ndmp_get_nlp(session)) == NULL) { ! NDMP_LOG(LOG_DEBUG, "nlp == NULL"); } else { cmds = &nlp->nlp_cmds; ! if (cmds->tcs_command == NULL) { ! NDMP_LOG(LOG_DEBUG, "cmds->tcs_command == NULL"); ! } else { cmds->tcs_reader = TLM_ABORT; cmds->tcs_command->tc_reader = TLM_ABORT; while (cmds->tcs_reader_count > 0) { ! NDMP_LOG(LOG_DEBUG, "trying to stop reader thread"); (void) sleep(1); } } } --- 1580,1597 ---- { ndmp_lbr_params_t *nlp; tlm_commands_t *cmds; if ((nlp = ndmp_get_nlp(session)) == NULL) { ! syslog(LOG_DEBUG, "nlp == NULL"); } else { cmds = &nlp->nlp_cmds; ! if (cmds->tcs_command != NULL) { cmds->tcs_reader = TLM_ABORT; cmds->tcs_command->tc_reader = TLM_ABORT; while (cmds->tcs_reader_count > 0) { ! syslog(LOG_DEBUG, "trying to stop reader thread"); (void) sleep(1); } } }
*** 1647,1669 **** { ndmp_lbr_params_t *nlp; tlm_commands_t *cmds; if ((nlp = ndmp_get_nlp(session)) == NULL) { ! NDMP_LOG(LOG_DEBUG, "nlp == NULL"); } else { cmds = &nlp->nlp_cmds; ! if (cmds->tcs_command == NULL) { ! NDMP_LOG(LOG_DEBUG, "cmds->tcs_command == NULL"); ! } else { (void) mutex_lock(&nlp->nlp_mtx); cmds->tcs_writer = TLM_ABORT; cmds->tcs_command->tc_writer = TLM_ABORT; (void) cond_broadcast(&nlp->nlp_cv); (void) mutex_unlock(&nlp->nlp_mtx); while (cmds->tcs_writer_count > 0) { ! NDMP_LOG(LOG_DEBUG, "trying to stop writer thread"); (void) sleep(1); } } } --- 1614,1634 ---- { ndmp_lbr_params_t *nlp; tlm_commands_t *cmds; if ((nlp = ndmp_get_nlp(session)) == NULL) { ! syslog(LOG_DEBUG, "nlp == NULL"); } else { cmds = &nlp->nlp_cmds; ! if (cmds->tcs_command != NULL) { (void) mutex_lock(&nlp->nlp_mtx); cmds->tcs_writer = TLM_ABORT; cmds->tcs_command->tc_writer = TLM_ABORT; (void) cond_broadcast(&nlp->nlp_cv); (void) mutex_unlock(&nlp->nlp_mtx); while (cmds->tcs_writer_count > 0) { ! syslog(LOG_DEBUG, "trying to stop writer thread"); (void) sleep(1); } } }
*** 1689,1699 **** tlm_commands_t *cmds; if ((nlp = ndmp_get_nlp(session)) != NULL) { cmds = &nlp->nlp_cmds; if (cmds->tcs_command != NULL) { ! NDMP_LOG(LOG_DEBUG, "cmds->tcs_command->tc_ref: %d", cmds->tcs_command->tc_ref); tlm_release_reader_writer_ipc(cmds->tcs_command); } } } --- 1654,1664 ---- tlm_commands_t *cmds; if ((nlp = ndmp_get_nlp(session)) != NULL) { cmds = &nlp->nlp_cmds; if (cmds->tcs_command != NULL) { ! syslog(LOG_DEBUG, "cmds->tcs_command->tc_ref: %d", cmds->tcs_command->tc_ref); tlm_release_reader_writer_ipc(cmds->tcs_command); } } }
*** 1714,1725 **** ndmp_waitfor_op(ndmpd_session_t *session) { if (session != NULL) { while (session->ns_nref > 0) { (void) sleep(1); - NDMP_LOG(LOG_DEBUG, - "waiting for session nref: %d", session->ns_nref); } } } --- 1679,1688 ----
*** 1927,1956 **** ndmp_connect_sock_v3(ulong_t addr, ushort_t port) { int sock; struct sockaddr_in sin; - NDMP_LOG(LOG_DEBUG, "addr %s:%d", inet_ntoa(IN_ADDR(addr)), port); sock = socket(AF_INET, SOCK_STREAM, 0); if (sock < 0) { ! NDMP_LOG(LOG_DEBUG, "Socket error: %m"); return (-1); } (void) memset((void *) &sin, 0, sizeof (sin)); sin.sin_family = AF_INET; sin.sin_addr.s_addr = htonl(addr); sin.sin_port = htons(port); if (connect(sock, (struct sockaddr *)&sin, sizeof (sin)) < 0) { ! NDMP_LOG(LOG_DEBUG, "Connect error: %m"); (void) close(sock); return (-1); } set_socket_options(sock); - NDMP_LOG(LOG_DEBUG, "sock %d", sock); return (sock); } /* --- 1890,1919 ---- ndmp_connect_sock_v3(ulong_t addr, ushort_t port) { int sock; struct sockaddr_in sin; sock = socket(AF_INET, SOCK_STREAM, 0); if (sock < 0) { ! syslog(LOG_DEBUG, "Socket error: %m"); return (-1); } (void) memset((void *) &sin, 0, sizeof (sin)); sin.sin_family = AF_INET; sin.sin_addr.s_addr = htonl(addr); sin.sin_port = htons(port); if (connect(sock, (struct sockaddr *)&sin, sizeof (sin)) < 0) { ! syslog(LOG_DEBUG, "Connect error: %m"); (void) close(sock); return (-1); } + syslog(LOG_DEBUG, "Remote addr %s:%d", inet_ntoa(IN_ADDR(addr)), port); + set_socket_options(sock); return (sock); } /*
*** 1986,2021 **** 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); } *addr = inet_addr(p); sd = socket(AF_INET, SOCK_STREAM, 0); if (sd < 0) { ! NDMP_LOG(LOG_DEBUG, "Socket error: %m"); return (-1); } sin.sin_family = AF_INET; sin.sin_addr.s_addr = INADDR_ANY; sin.sin_port = 0; length = sizeof (sin); if (bind(sd, (struct sockaddr *)&sin, sizeof (sin)) < 0) { ! NDMP_LOG(LOG_DEBUG, "Bind error: %m"); (void) close(sd); sd = -1; } else if (getsockname(sd, (struct sockaddr *)&sin, &length) < 0) { ! NDMP_LOG(LOG_DEBUG, "getsockname error: %m"); (void) close(sd); sd = -1; } else if (listen(sd, 5) < 0) { ! NDMP_LOG(LOG_DEBUG, "Listen error: %m"); (void) close(sd); sd = -1; } else *port = sin.sin_port; --- 1949,1984 ---- if (!p) p = get_default_nic_addr(); /* Fail if no IP can be obtained */ if (!p) { ! syslog(LOG_ERR, "Undetermined network port."); return (-1); } *addr = inet_addr(p); sd = socket(AF_INET, SOCK_STREAM, 0); if (sd < 0) { ! syslog(LOG_DEBUG, "Socket error: %m"); return (-1); } sin.sin_family = AF_INET; sin.sin_addr.s_addr = INADDR_ANY; sin.sin_port = 0; length = sizeof (sin); if (bind(sd, (struct sockaddr *)&sin, sizeof (sin)) < 0) { ! syslog(LOG_DEBUG, "Bind error: %m"); (void) close(sd); sd = -1; } else if (getsockname(sd, (struct sockaddr *)&sin, &length) < 0) { ! syslog(LOG_DEBUG, "getsockname error: %m"); (void) close(sd); sd = -1; } else if (listen(sd, 5) < 0) { ! syslog(LOG_DEBUG, "Listen error: %m"); (void) close(sd); sd = -1; } else *port = sin.sin_port;
*** 2060,2090 **** /* * ndmp_new_job_name * ! * Create a job name for each backup/restore to keep track * * Parameters: - * jname (output) - job name * * Returns: ! * jname */ - char * - ndmp_new_job_name(char *jname) - { - if (jname != NULL) { - (void) snprintf(jname, TLM_MAX_BACKUP_JOB_NAME, "%s%d", - NDMP_RCF_BASENAME, ndmp_job_cnt++); - NDMP_LOG(LOG_DEBUG, "jname: \"%s\"", jname); - } ! return (jname); } /* * fs_is_valid_logvol * * Check if the log path exists * --- 2023,2099 ---- /* * ndmp_new_job_name * ! * Copy, at most, 'n' characters of the current backup ! * job name to the buffer in parameter 's1'. * * Parameters: * + * s1 (input) - pointer to a user supplied buffer + * n (input) - number of bytes to copy + * * Returns: ! * count of bytes in name */ ! int ! ndmp_new_job_name(char *s1, size_t n) { ! ! if (n >= TLM_MAX_BACKUP_JOB_NAME) { ! /* ! * TLM_MAX_BACKUP_JOB_NAME is the fixed length of ! * the encoded job name in the format `NdmpBackup.nnnn\0`, ! * where nnnn is a job sequence number. A null byte ! * is included. It is okay if the buffer is bigger than that. ! */ ! return (snprintf(s1, n, "%10s.%04d", ! NDMP_RCF_BASENAME, ndmp_job_cnt++%1000)); ! } ! return (0); } + /* + * Check if the volume is already checkpointed. Assume it is not + * by setting nlp_snapname to '\0' at first. It will be filled + * in with the checkpoint (snapshot name) if one is found. + */ + boolean_t + fs_is_checkpointed(ndmp_lbr_params_t *nlp) + { + zfs_handle_t *zhp; + snap_data_t si; + (void) mutex_lock(&zlib_mtx); + if ((zhp = zfs_open(zlibh, nlp->nlp_vol, ZFS_TYPE_DATASET)) != NULL) { + nlp->nlp_snapname[0] = '\0'; + si.creation_time = (time_t)0; + si.last_snapshot = nlp->nlp_snapname; + if (ndmp_find_latest_autosync(zhp, (void *) &si) != 0) { + syslog(LOG_ERR, + "Find AutoSync failed (err=%d): %s", + errno, libzfs_error_description(zlibh)); + zfs_close(zhp); + (void) mutex_unlock(&zlib_mtx); + return (B_FALSE); + } + zfs_close(zhp); + if (strlen(nlp->nlp_snapname) == 0) { + syslog(LOG_DEBUG, "Apparently not an " + "Auto-Sync - continue as normal backup"); + (void) mutex_unlock(&zlib_mtx); + return (B_FALSE); + } + } + (void) mutex_unlock(&zlib_mtx); + syslog(LOG_DEBUG, "It is an autosync:"); + syslog(LOG_DEBUG, "nlp->nlp_vol = [%s]", nlp->nlp_vol); + syslog(LOG_DEBUG, "nlp->nlp_snapname = [%s]", nlp->nlp_snapname); + return (B_TRUE); + } + /* * fs_is_valid_logvol * * Check if the log path exists *
*** 2099,2111 **** fs_is_valid_logvol(char *path) { struct stat64 st; if (stat64(path, &st) < 0) ! return (FALSE); ! return (TRUE); } /* * ndmpd_mk_temp --- 2108,2120 ---- fs_is_valid_logvol(char *path) { struct stat64 st; if (stat64(path, &st) < 0) ! return (B_FALSE); ! return (B_TRUE); } /* * ndmpd_mk_temp
*** 2118,2162 **** * * Returns: * buf */ char * ! ndmpd_mk_temp(char *buf) { - char fname[TLM_MAX_BACKUP_JOB_NAME]; const char *dir; char *rv; if (!buf) return (NULL); dir = ndmpd_get_prop(NDMP_DEBUG_PATH); if (dir == 0 || *dir == '\0') { ! NDMP_LOG(LOG_DEBUG, "NDMP work path not specified"); return (0); } if (!fs_is_valid_logvol((char *)dir)) { ! NDMP_LOG(LOG_ERR, ! "Log file path cannot be on system volumes."); return (0); } dir += strspn(dir, " \t"); if (!*dir) { ! NDMP_LOG(LOG_DEBUG, "NDMP work path not specified"); return (0); } rv = buf; ! (void) ndmp_new_job_name(fname); (void) tlm_cat_path(buf, (char *)dir, fname); return (rv); } /* * ndmpd_make_bk_dir_path * * Make a directory path for temporary files under the NDMP * working directory. --- 2127,2227 ---- * * Returns: * buf */ char * ! ndmpd_mk_temp(char * fname, char *buf) { const char *dir; char *rv; if (!buf) return (NULL); dir = ndmpd_get_prop(NDMP_DEBUG_PATH); if (dir == 0 || *dir == '\0') { ! syslog(LOG_DEBUG, "NDMP work path not specified"); return (0); } + /* + * Make sure the NDMP work directory exists. + */ + if (ndmpd_mkdir(dir) < 0) { + syslog(LOG_DEBUG, + "Could not create NDMP work path %s", dir); + return (0); + } + if (!fs_is_valid_logvol((char *)dir)) { ! syslog(LOG_ERR, ! "Log file path cannot be on system volumes"); return (0); } dir += strspn(dir, " \t"); if (!*dir) { ! syslog(LOG_DEBUG, "NDMP work path not specified"); return (0); } rv = buf; ! (void) tlm_cat_path(buf, (char *)dir, fname); return (rv); } + /* + * ndmp_mkdir + * + * If the temporary bitmap database directory doesn't exist + * create it. This keep from having to create directory + * by hand when it is changed with svcadm. + * + * Parameters: + * dir (input) - the path to create + * + * Returns: + * 0 - success. + * -1 - error. + */ + static int + ndmpd_mkdir(const char *dir) + { + char tmp[PATH_MAX]; + char *p = NULL; + size_t len; + (void) snprintf(tmp, sizeof (tmp), "%s", dir); + len = strlen(tmp); + if (tmp[len - 1] == '/') + tmp[len - 1] = '\0'; + for (p = tmp + 1; *p; p++) { + if (*p == '/') { + *p = '\0'; + if (mkdir(tmp, S_IRWXU) < 0) { + if (errno != EEXIST) { + syslog(LOG_ERR, + "failed to create intermediate path %s\n", + tmp); + return (-1); + } + } + *p = '/'; + } + } + if (mkdir(tmp, S_IRWXU) < 0) { + if (errno != EEXIST) { + syslog(LOG_ERR, + "failed to create full path %s\n", tmp); + return (-1); + } + } + return (0); + } + /* * ndmpd_make_bk_dir_path * * Make a directory path for temporary files under the NDMP * working directory.
*** 2191,2202 **** --- 2256,2327 ---- (void) tlm_cat_path(buf, path, name); return (buf); } + static int + ndmp_match_checkpoint_name(zfs_handle_t *zhp, void *arg) + { + snap_data_t *sd = (snap_data_t *)arg; + time_t snap_creation; + nvlist_t *userprops = NULL; + if (zfs_get_type(zhp) == ZFS_TYPE_SNAPSHOT) { + if ((userprops = zfs_get_user_props(zhp)) != NULL) { + /* + * Destination AutoSync snap-shots have + * 'nms:autosyncmark' property whereas the + * source dataset snap-shot has has + * 'nms:service' property. This finds either + * for use as backup. + */ + if (nvlist_exists(userprops, "nms:autosyncmark") || + nvlist_exists(userprops, + "com.nexenta.nef:hprsvcid") || + nvlist_exists(userprops, "nms:service")) { + snap_creation = (time_t)zfs_prop_get_int(zhp, + ZFS_PROP_CREATION); + if (snap_creation > sd->creation_time) { + (void) strncpy( + (char *) sd->last_snapshot, + zfs_get_name(zhp), + ZFS_MAX_DATASET_NAME_LEN); + sd->creation_time = snap_creation; + } + } + } + } + zfs_close(zhp); + return (0); + } + /* + * ndmp_find_latest_autosync + * + * Given a dataset zfs_handlt_t find the latest "AutoSync" snapshot + */ + int + ndmp_find_latest_autosync(zfs_handle_t *zhp, void *arg) + { + int err; + snap_data_t *si = (snap_data_t *)arg; + + err = zfs_iter_dependents(zhp, B_FALSE, + ndmp_match_checkpoint_name, (void *)si); + if (err) { + syslog(LOG_DEBUG, + "Trying to find AutoSync zfs_iter_snapshots: %d", err); + si->last_snapshot = '\0'; + return (-1); + } else { + syslog(LOG_DEBUG, "Found most recent AutoSync -> [%s]\n", + si->last_snapshot); + } + return (0); + } + + /* * ndmp_is_chkpnt_root * * Is this a root checkpoint (snapshot) directory. * Note: a temporary function */
*** 2204,2214 **** ndmp_is_chkpnt_root(char *path) { struct stat64 st; if (stat64(path, &st) != 0) { ! NDMP_LOG(LOG_DEBUG, "Couldn't stat path \"%s\"", path); return (TRUE); } return (FALSE); } --- 2329,2339 ---- ndmp_is_chkpnt_root(char *path) { struct stat64 st; if (stat64(path, &st) != 0) { ! syslog(LOG_DEBUG, "Couldn't stat path \"%s\"", path); return (TRUE); } return (FALSE); }
*** 2258,2274 **** int rv; struct stat64 st; if (stat64(nlp->nlp_backup_path, &st) != 0) { rv = -1; ! NDMP_LOG(LOG_DEBUG, "Getting inode # of \"%s\"", nlp->nlp_backup_path); } else { rv = 0; nlp->nlp_bkdirino = st.st_ino; - NDMP_LOG(LOG_DEBUG, "nlp_bkdirino: %lu", - (uint_t)nlp->nlp_bkdirino); } return (rv); } --- 2383,2397 ---- int rv; struct stat64 st; if (stat64(nlp->nlp_backup_path, &st) != 0) { rv = -1; ! syslog(LOG_ERR, "Failed to get inode # of \"%s\"", nlp->nlp_backup_path); } else { rv = 0; nlp->nlp_bkdirino = st.st_ino; } return (rv); }
*** 2287,2301 **** { char *cp; int err, len, actual_size; if (cmd == NULL) { ! NDMP_LOG(LOG_DEBUG, "cmd == NULL"); return (FALSE); } if (cmd->tc_buffers == NULL) { ! NDMP_LOG(LOG_DEBUG, "cmd->tc_buffers == NULL"); return (FALSE); } /* wait until the first buffer gets full. */ tlm_buffer_in_buf_wait(cmd->tc_buffers); --- 2410,2424 ---- { char *cp; int err, len, actual_size; if (cmd == NULL) { ! syslog(LOG_DEBUG, "cmd == NULL"); return (FALSE); } if (cmd->tc_buffers == NULL) { ! syslog(LOG_DEBUG, "cmd->tc_buffers == NULL"); return (FALSE); } /* wait until the first buffer gets full. */ tlm_buffer_in_buf_wait(cmd->tc_buffers);
*** 2302,2317 **** err = actual_size = 0; cp = tlm_get_read_buffer(RECORDSIZE, &err, cmd->tc_buffers, &actual_size); if (cp == NULL) { ! NDMP_LOG(LOG_DEBUG, "Can't read from buffers, err: %d", err); return (FALSE); } len = strlen(NDMPUTF8MAGIC); if (actual_size < len) { ! NDMP_LOG(LOG_DEBUG, "Not enough data in the buffers"); return (FALSE); } return ((strncmp(cp, NDMPUTF8MAGIC, len) == 0) ? TRUE : FALSE); } --- 2425,2440 ---- err = actual_size = 0; cp = tlm_get_read_buffer(RECORDSIZE, &err, cmd->tc_buffers, &actual_size); if (cp == NULL) { ! syslog(LOG_DEBUG, "Can't read from buffers, err: %d", err); return (FALSE); } len = strlen(NDMPUTF8MAGIC); if (actual_size < len) { ! syslog(LOG_DEBUG, "Not enough data in the buffers"); return (FALSE); } return ((strncmp(cp, NDMPUTF8MAGIC, len) == 0) ? TRUE : FALSE); }
*** 2321,2352 **** * ndmp_get_cur_bk_time * * Get the backup checkpoint time. */ int ! ndmp_get_cur_bk_time(ndmp_lbr_params_t *nlp, time_t *tp, char *jname) { int err; ! if (!nlp || !nlp->nlp_backup_path || !tp) { ! NDMP_LOG(LOG_DEBUG, "Invalid argument"); return (-1); } ! if (!fs_is_chkpnt_enabled(nlp->nlp_backup_path)) { ! NDMP_LOG(LOG_DEBUG, "Not a chkpnt volume %s", ! nlp->nlp_backup_path); ! *tp = time(NULL); ! return (0); ! } ! ! err = tlm_get_chkpnt_time(nlp->nlp_backup_path, !NLP_ISCHKPNTED(nlp), ! tp, jname); if (err != 0) { ! NDMP_LOG(LOG_DEBUG, "Can't checkpoint time"); } else { ! NDMP_LOG(LOG_DEBUG, "%s", cctime(tp)); } return (err); } --- 2444,2469 ---- * ndmp_get_cur_bk_time * * Get the backup checkpoint time. */ int ! ndmp_get_cur_bk_time(ndmp_lbr_params_t *nlp, time_t *tp) { int err; ! if (!nlp || !tp) { ! syslog(LOG_ERR, "Invalid argument"); return (-1); } ! err = tlm_get_chkpnt_time(nlp->nlp_snapname, tp); if (err != 0) { ! syslog(LOG_ERR, "Can't checkpoint time from [%s]", ! nlp->nlp_snapname); } else { ! syslog(LOG_DEBUG, "Checkpoint time of [%s] is [%s]", ! nlp->nlp_snapname, cctime(tp)); } return (err); }
*** 2414,2440 **** } else { fd = dev_id; } do { if (scsi_test_unit_ready(fd) >= 0) { ! NDMP_LOG(LOG_DEBUG, "Unit is ready"); if (dev_id <= 0) (void) close(fd); return (TRUE); } ! NDMP_LOG(LOG_DEBUG, "Unit not ready"); (void) usleep(TUR_WAIT); } while (--try > 0); if (dev_id <= 0) (void) close(fd); ! NDMP_LOG(LOG_DEBUG, "Unit didn't get ready"); return (FALSE); } /* --- 2531,2557 ---- } else { fd = dev_id; } do { if (scsi_test_unit_ready(fd) >= 0) { ! syslog(LOG_DEBUG, "Unit is ready"); if (dev_id <= 0) (void) close(fd); return (TRUE); } ! syslog(LOG_DEBUG, "Unit not ready"); (void) usleep(TUR_WAIT); } while (--try > 0); if (dev_id <= 0) (void) close(fd); ! syslog(LOG_DEBUG, "Unit didn't get ready"); return (FALSE); } /*
*** 2460,2472 **** ucmd.uscsi_timeout = 60; /* Allow maximum 1 min */ retval = ioctl(dev_id, USCSICMD, &ucmd); if (retval != 0 && errno != EIO) { ! NDMP_LOG(LOG_ERR, "Failed to send inquiry request to device: %m."); ! NDMP_LOG(LOG_DEBUG, "Inquiry request failed for" " dev_id:%d err=%d -%m", dev_id, errno); retval = -errno; } else retval = -(ucmd.uscsi_status); --- 2577,2589 ---- ucmd.uscsi_timeout = 60; /* Allow maximum 1 min */ retval = ioctl(dev_id, USCSICMD, &ucmd); if (retval != 0 && errno != EIO) { ! syslog(LOG_ERR, "Failed to send inquiry request to device: %m."); ! syslog(LOG_DEBUG, "Inquiry request failed for" " dev_id:%d err=%d -%m", dev_id, errno); retval = -errno; } else retval = -(ucmd.uscsi_status);
*** 2504,2513 **** --- 2621,2647 ---- ndmp_fhinode = ndmpd_get_prop_yorn(NDMP_FHIST_INCR_ENV) ? TRUE : FALSE; /* Get the value from ndmp SMF property. */ ndmp_dar_support = ndmpd_get_prop_yorn(NDMP_DAR_SUPPORT); + ndmp_autosync_support = ndmpd_get_prop_yorn(NDMP_AUTOSYNC_SUPPORT); + ndmp_hpr_support = ndmpd_get_prop_yorn(NDMP_HPR_SUPPORT); + /* + * The HPR snapshot feature superscedes autosync and the two can't be + * active together on the same system. + */ + if (ndmp_hpr_support) { + ndmp_autosync_support = 0; + syslog(LOG_DEBUG, "NDMP_HPR_SUPPORT set to [%d]", + ndmp_hpr_support); + } + + if (ndmp_autosync_support) { + syslog(LOG_DEBUG, "NDMP_AUTOSYNC_SUPPORT set to [%d]", + ndmp_autosync_support); + } + if ((ndmp_ver = atoi(ndmpd_get_prop(NDMP_VERSION_ENV))) == 0) ndmp_ver = NDMPVER; } /*