Print this page
NEX-15119 Commvault Certification fail incremental backup
Reviewed by: Yuri Pankov <yuri.pankov@nexenta.com>
Reviewed by: Roman Strashkin <roman.strashkin@nexenta.com>
NEX-15119 Commvault Certification fail incremental backup
Reviewed by: Yuri Pankov <yuri.pankov@nexenta.com>
Reviewed by: Roman Strashkin <roman.strashkin@nexenta.com>
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-9532 NDMP: readdir errors when file/directory has special characters
Reviewed by: Peer Dampmann <peer.dampmann@nexenta.com>
Reviewed by: Alexander Eremin <alexander.eremin@nexenta.com>
Reviewed by: Yuri Pankov <yuri.pankov@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
SUP-898 nscd is extremely slow when a local file is missing
Reviewed by: Alek Pinchuk <alek.pinchuk@nexenta.com>
Reviewed by: Josef Sipek <josef.sipek@nexenta.com>
NEX-2500 Conflict between NDMP backup job and 'zfs send' leads to NDMP job abort.
NEX-2492 mdb loops forever printing a stack backtrace
NEX-2430 ndmpd segfaults in get_backup_size+0x13b() lint fix
NEX-2430 ndmpd segfaults in get_backup_size+0x13b()
NEX-559 NDMP cannot backup/restore a file which spans multiple tapes

*** 35,49 **** * 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/stat.h> #include <sys/types.h> #include <sys/time.h> #include <ctype.h> #include <sys/socket.h> #include <sys/acl.h> #include <netinet/in.h> #include <arpa/inet.h> --- 35,50 ---- * 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/stat.h> #include <sys/types.h> #include <sys/time.h> + #include <syslog.h> #include <ctype.h> #include <sys/socket.h> #include <sys/acl.h> #include <netinet/in.h> #include <arpa/inet.h>
*** 112,121 **** --- 113,124 ---- /* * NDMP exclusion list */ char **ndmp_excl_list = NULL; + extern boolean_t fs_is_checkpointed(ndmp_lbr_params_t *); + /* * split_env * * Splits the string into list of sections separated by the * sep character.
*** 234,249 **** */ static void prl(char **lpp) { if (!lpp) { ! NDMP_LOG(LOG_DEBUG, "empty"); return; } while (*lpp) ! NDMP_LOG(LOG_DEBUG, "\"%s\"", *lpp++); } /* * inlist --- 237,252 ---- */ static void prl(char **lpp) { if (!lpp) { ! syslog(LOG_DEBUG, "empty"); return; } while (*lpp) ! syslog(LOG_DEBUG, "\"%s\"", *lpp++); } /* * inlist
*** 261,271 **** */ static boolean_t inlist(char **lpp, char *ent) { if (!lpp || !ent) { ! NDMP_LOG(LOG_DEBUG, "empty list"); return (FALSE); } while (*lpp) { /* --- 264,274 ---- */ static boolean_t inlist(char **lpp, char *ent) { if (!lpp || !ent) { ! syslog(LOG_DEBUG, "empty list"); return (FALSE); } while (*lpp) { /*
*** 274,293 **** */ char *pattern = *lpp; if (strncmp(pattern, "./", 2) == 0) pattern += 2; ! NDMP_LOG(LOG_DEBUG, "pattern %s, ent %s", pattern, ent); if (match(pattern, ent)) { ! NDMP_LOG(LOG_DEBUG, "match(%s,%s)", pattern, ent); return (TRUE); } lpp++; } ! NDMP_LOG(LOG_DEBUG, "no match"); return (FALSE); } /* --- 277,296 ---- */ char *pattern = *lpp; if (strncmp(pattern, "./", 2) == 0) pattern += 2; ! syslog(LOG_DEBUG, "pattern %s, ent %s", pattern, ent); if (match(pattern, ent)) { ! syslog(LOG_DEBUG, "match(%s,%s)", pattern, ent); return (TRUE); } lpp++; } ! syslog(LOG_DEBUG, "no match"); return (FALSE); } /*
*** 409,419 **** */ len = strlen(ep->nm3_opath); if (len > 1 && ep->nm3_opath[len-2] == '/' && ep->nm3_opath[len-1] == '.') { ep->nm3_opath[len-1] = '\0'; ! NDMP_LOG(LOG_DEBUG, "nm3_opath changed from %s. to %s", ep->nm3_opath, ep->nm3_opath); } *lpp++ = ep->nm3_opath; } --- 412,422 ---- */ len = strlen(ep->nm3_opath); if (len > 1 && ep->nm3_opath[len-2] == '/' && ep->nm3_opath[len-1] == '.') { ep->nm3_opath[len-1] = '\0'; ! syslog(LOG_DEBUG, "nm3_opath changed from %s. to %s", ep->nm3_opath, ep->nm3_opath); } *lpp++ = ep->nm3_opath; }
*** 484,494 **** np += strspn(np, "/"); else np = ""; if (!tlm_cat_path(bp, np, pp)) { ! NDMP_LOG(LOG_ERR, "Restore path too long %s/%s.", np, pp); return (NULL); } return (bp); } --- 487,497 ---- np += strspn(np, "/"); else np = ""; if (!tlm_cat_path(bp, np, pp)) { ! syslog(LOG_ERR, "Restore path too long %s/%s.", np, pp); return (NULL); } return (bp); }
*** 511,561 **** ndmp_lbr_params_t *nlp; mem_ndmp_name_v3_t *ep; rv = NULL; if (!buf) { ! NDMP_LOG(LOG_DEBUG, "buf is NULL"); } else if (!path) { ! NDMP_LOG(LOG_DEBUG, "path is NULL"); } else if ((nlp = rnp->rn_nlp) == 0) { ! NDMP_LOG(LOG_DEBUG, "rnp->rn_nlp is NULL"); } else if (!nlp->nlp_params) { ! NDMP_LOG(LOG_DEBUG, "nlp->nlp_params is NULL"); } else if (!ndmp_full_restore_path) { if (idx < 0 || idx >= (int)nlp->nlp_nfiles) { ! NDMP_LOG(LOG_DEBUG, "Invalid idx %d range (0, %d)", idx, nlp->nlp_nfiles); } else if (!(ep = (mem_ndmp_name_v3_t *)MOD_GETNAME( nlp->nlp_params, idx))) { ! NDMP_LOG(LOG_DEBUG, "nlist entry %d is NULL", idx); } else { rv = mkrsp(buf, path, ep->nm3_opath, ep->nm3_dpath); - - NDMP_LOG(LOG_DEBUG, - "idx %d org \"%s\" dst \"%s\"", - idx, ep->nm3_opath, ep->nm3_dpath); - if (rv) { - NDMP_LOG(LOG_DEBUG, - "path \"%s\": \"%s\"", path, rv); - } else { - NDMP_LOG(LOG_DEBUG, - "path \"%s\": NULL", path); } - } } else { if (!tlm_cat_path(buf, nlp->nlp_restore_path, path)) { ! NDMP_LOG(LOG_ERR, "Path too long %s/%s.", nlp->nlp_restore_path, path); rv = NULL; } else { rv = buf; - NDMP_LOG(LOG_DEBUG, - "path \"%s\": \"%s\"", path, rv); } } return (rv); } --- 514,551 ---- ndmp_lbr_params_t *nlp; mem_ndmp_name_v3_t *ep; rv = NULL; if (!buf) { ! syslog(LOG_DEBUG, "buf is NULL"); } else if (!path) { ! syslog(LOG_DEBUG, "path is NULL"); } else if ((nlp = rnp->rn_nlp) == 0) { ! syslog(LOG_DEBUG, "rnp->rn_nlp is NULL"); } else if (!nlp->nlp_params) { ! syslog(LOG_DEBUG, "nlp->nlp_params is NULL"); } else if (!ndmp_full_restore_path) { if (idx < 0 || idx >= (int)nlp->nlp_nfiles) { ! syslog(LOG_DEBUG, "Invalid idx %d range (0, %d)", idx, nlp->nlp_nfiles); } else if (!(ep = (mem_ndmp_name_v3_t *)MOD_GETNAME( nlp->nlp_params, idx))) { ! syslog(LOG_DEBUG, "nlist entry %d is NULL", idx); } else { rv = mkrsp(buf, path, ep->nm3_opath, ep->nm3_dpath); } } else { if (!tlm_cat_path(buf, nlp->nlp_restore_path, path)) { ! syslog(LOG_ERR, "Path too long %s/%s.", nlp->nlp_restore_path, path); rv = NULL; } else { rv = buf; } } return (rv); }
*** 619,629 **** if (!path) return (0); rv = !fs_is_rdonly(path) && !fs_is_chkpntvol(path); ! NDMP_LOG(LOG_DEBUG, "%d path \"%s\"", rv, path); return (rv); } --- 609,619 ---- if (!path) return (0); rv = !fs_is_rdonly(path) && !fs_is_chkpntvol(path); ! syslog(LOG_DEBUG, "%d path \"%s\"", rv, path); return (rv); }
*** 788,798 **** static void log_bk_params_v3(ndmpd_session_t *session, ndmpd_module_params_t *params, ndmp_lbr_params_t *nlp) { MOD_LOGV3(params, NDMP_LOG_NORMAL, "Backing up \"%s\".\n", ! nlp->nlp_backup_path); if (session->ns_mover.md_data_addr.addr_type == NDMP_ADDR_LOCAL) MOD_LOGV3(params, NDMP_LOG_NORMAL, "Tape record size: %d.\n", session->ns_mover.md_record_size); --- 778,788 ---- static void log_bk_params_v3(ndmpd_session_t *session, ndmpd_module_params_t *params, ndmp_lbr_params_t *nlp) { MOD_LOGV3(params, NDMP_LOG_NORMAL, "Backing up \"%s\".\n", ! NLP_ISCHKPNTED(nlp) ? nlp->nlp_mountpoint : nlp->nlp_backup_path); if (session->ns_mover.md_data_addr.addr_type == NDMP_ADDR_LOCAL) MOD_LOGV3(params, NDMP_LOG_NORMAL, "Tape record size: %d.\n", session->ns_mover.md_record_size);
*** 834,847 **** char *envp; envp = MOD_GETENV(params, "UPDATE"); if (!envp) { NLP_SET(nlp, NLPF_UPDATE); ! NDMP_LOG(LOG_DEBUG, "env(UPDATE) not defined, default to TRUE"); } else { ! NDMP_LOG(LOG_DEBUG, "env(UPDATE): \"%s\"", envp); if (IS_YORT(*envp)) NLP_SET(nlp, NLPF_UPDATE); else NLP_UNSET(nlp, NLPF_UPDATE); } --- 824,837 ---- char *envp; envp = MOD_GETENV(params, "UPDATE"); if (!envp) { NLP_SET(nlp, NLPF_UPDATE); ! syslog(LOG_DEBUG, "env(UPDATE) not defined, default to TRUE"); } else { ! syslog(LOG_DEBUG, "env(UPDATE): \"%s\"", envp); if (IS_YORT(*envp)) NLP_SET(nlp, NLPF_UPDATE); else NLP_UNSET(nlp, NLPF_UPDATE); }
*** 867,880 **** { char *envp; envp = MOD_GETENV(params, "HIST"); if (!envp) { ! NDMP_LOG(LOG_DEBUG, "env(HIST) not defined"); NLP_UNSET(nlp, NLPF_FH); } else { ! NDMP_LOG(LOG_DEBUG, "env(HIST): \"%s\"", envp); if (IS_YORT(*envp) || IS_F(*envp)) NLP_SET(nlp, NLPF_FH); else NLP_UNSET(nlp, NLPF_FH); --- 857,870 ---- { char *envp; envp = MOD_GETENV(params, "HIST"); if (!envp) { ! syslog(LOG_DEBUG, "env(HIST) not defined"); NLP_UNSET(nlp, NLPF_FH); } else { ! syslog(LOG_DEBUG, "env(HIST): \"%s\"", envp); if (IS_YORT(*envp) || IS_F(*envp)) NLP_SET(nlp, NLPF_FH); else NLP_UNSET(nlp, NLPF_FH);
*** 908,921 **** { char *envp; envp = MOD_GETENV(params, "EXCLUDE"); if (!envp) { ! NDMP_LOG(LOG_DEBUG, "env(EXCLUDE) not defined"); nlp->nlp_exl = NULL; } else { ! NDMP_LOG(LOG_DEBUG, "env(EXCLUDE): \"%s\"", envp); nlp->nlp_exl = split_env(envp, ','); prl(nlp->nlp_exl); } } --- 898,911 ---- { char *envp; envp = MOD_GETENV(params, "EXCLUDE"); if (!envp) { ! syslog(LOG_DEBUG, "env(EXCLUDE) not defined"); nlp->nlp_exl = NULL; } else { ! syslog(LOG_DEBUG, "env(EXCLUDE): \"%s\"", envp); nlp->nlp_exl = split_env(envp, ','); prl(nlp->nlp_exl); } }
*** 940,953 **** { char *envp; envp = MOD_GETENV(params, "FILES"); if (!envp) { ! NDMP_LOG(LOG_DEBUG, "env(FILES) not defined"); nlp->nlp_inc = NULL; } else { ! NDMP_LOG(LOG_DEBUG, "env(FILES): \"%s\"", envp); nlp->nlp_inc = split_env(envp, ' '); prl(nlp->nlp_inc); } } --- 930,943 ---- { char *envp; envp = MOD_GETENV(params, "FILES"); if (!envp) { ! syslog(LOG_DEBUG, "env(FILES) not defined"); nlp->nlp_inc = NULL; } else { ! syslog(LOG_DEBUG, "env(FILES): \"%s\"", envp); nlp->nlp_inc = split_env(envp, ' '); prl(nlp->nlp_inc); } }
*** 975,985 **** * in the request that we should not send fh_info. * At the moment we do not support DAR on directories, so if the user * needs to restore a directory they should disable the DAR. */ if (params->mp_operation == NDMP_DATA_OP_RECOVER && !ndmp_dar_support) { ! NDMP_LOG(LOG_DEBUG, "Direct Access Restore Disabled"); NLP_UNSET(nlp, NLPF_DIRECT); MOD_LOGV3(params, NDMP_LOG_NORMAL, "DAR is disabled. Running Restore without DAR"); return; } --- 965,975 ---- * in the request that we should not send fh_info. * At the moment we do not support DAR on directories, so if the user * needs to restore a directory they should disable the DAR. */ if (params->mp_operation == NDMP_DATA_OP_RECOVER && !ndmp_dar_support) { ! syslog(LOG_INFO, "Direct Access Restore Disabled"); NLP_UNSET(nlp, NLPF_DIRECT); MOD_LOGV3(params, NDMP_LOG_NORMAL, "DAR is disabled. Running Restore without DAR"); return; }
*** 989,1015 **** * back the fh_info, for some clients do not use get_backup_attrs. * If operation is restore we have to unset the DIRECT, for * some clients do not set the MOVER window. */ if (params->mp_operation == NDMP_DATA_OP_BACKUP) { ! NDMP_LOG(LOG_DEBUG, "backup default env(DIRECT): YES"); NLP_SET(nlp, NLPF_DIRECT); } else { envp = MOD_GETENV(params, "DIRECT"); if (!envp) { ! NDMP_LOG(LOG_DEBUG, "env(DIRECT) not defined"); NLP_UNSET(nlp, NLPF_DIRECT); } else { ! NDMP_LOG(LOG_DEBUG, "env(DIRECT): \"%s\"", envp); if (IS_YORT(*envp)) { NLP_SET(nlp, NLPF_DIRECT); ! NDMP_LOG(LOG_DEBUG, "Direct Access Restore Enabled"); } else { NLP_UNSET(nlp, NLPF_DIRECT); ! NDMP_LOG(LOG_DEBUG, "Direct Access Restore Disabled"); } } } --- 979,1005 ---- * back the fh_info, for some clients do not use get_backup_attrs. * If operation is restore we have to unset the DIRECT, for * some clients do not set the MOVER window. */ if (params->mp_operation == NDMP_DATA_OP_BACKUP) { ! syslog(LOG_DEBUG, "backup default env(DIRECT): YES"); NLP_SET(nlp, NLPF_DIRECT); } else { envp = MOD_GETENV(params, "DIRECT"); if (!envp) { ! syslog(LOG_DEBUG, "env(DIRECT) not defined"); NLP_UNSET(nlp, NLPF_DIRECT); } else { ! syslog(LOG_DEBUG, "env(DIRECT): \"%s\"", envp); if (IS_YORT(*envp)) { NLP_SET(nlp, NLPF_DIRECT); ! syslog(LOG_DEBUG, "Direct Access Restore Enabled"); } else { NLP_UNSET(nlp, NLPF_DIRECT); ! syslog(LOG_DEBUG, "Direct Access Restore Disabled"); } } }
*** 1085,1096 **** return (NDMP_ILLEGAL_ARGS_ERR); } tstamp = tok & 0xffffffff; seq = (tok >> 32) & 0xffffffff; - NDMP_LOG(LOG_DEBUG, "basedate \"%s\" %lld seq %u tstamp %u", - basedate, tok, seq, tstamp); if ((int)seq > ndmp_get_max_tok_seq()) { rv = NDMP_ILLEGAL_ARGS_ERR; MOD_LOGV3(params, NDMP_LOG_ERROR, "The sequence counter of the token exceeds the " --- 1075,1084 ----
*** 1226,1236 **** return (get_date_token_v3(params, nlp, envp)); envp = MOD_GETENV(params, "LEVEL"); if (!envp) { ! NDMP_LOG(LOG_DEBUG, "env(LEVEL) not defined, default to 0"); NLP_SET(nlp, NLPF_LEVELBK); NLP_UNSET(nlp, NLPF_LBRBK); NLP_UNSET(nlp, NLPF_TOKENBK); nlp->nlp_llevel = 0; nlp->nlp_ldate = 0; --- 1214,1224 ---- return (get_date_token_v3(params, nlp, envp)); envp = MOD_GETENV(params, "LEVEL"); if (!envp) { ! syslog(LOG_DEBUG, "env(LEVEL) not defined, default to 0"); NLP_SET(nlp, NLPF_LEVELBK); NLP_UNSET(nlp, NLPF_LBRBK); NLP_UNSET(nlp, NLPF_TOKENBK); nlp->nlp_llevel = 0; nlp->nlp_ldate = 0;
*** 1308,1324 **** nlp->nlp_tokseq++; tok = ((u_longlong_t)nlp->nlp_tokseq << 32) | nlp->nlp_cdate; (void) snprintf(val, sizeof (val), "%llu", tok); - NDMP_LOG(LOG_DEBUG, "tok: %lld %s", tok, val); - if (MOD_SETENV(params, "DUMP_DATE", val) != 0) { MOD_LOGV3(params, NDMP_LOG_ERROR, "Could not set DUMP_DATE to %s", val); } else if (!nlp->nlp_dmpnm) { ! NDMP_LOG(LOG_DEBUG, "No log file defined"); } else if (ndmpd_append_dumptime(nlp->nlp_dmpnm, nlp->nlp_backup_path, nlp->nlp_tokseq, nlp->nlp_tokdate) < 0) { MOD_LOGV3(params, NDMP_LOG_ERROR, "Saving backup date for \"%s\" in \"%s\".\n", nlp->nlp_backup_path, nlp->nlp_dmpnm); --- 1296,1310 ---- nlp->nlp_tokseq++; tok = ((u_longlong_t)nlp->nlp_tokseq << 32) | nlp->nlp_cdate; (void) snprintf(val, sizeof (val), "%llu", tok); if (MOD_SETENV(params, "DUMP_DATE", val) != 0) { MOD_LOGV3(params, NDMP_LOG_ERROR, "Could not set DUMP_DATE to %s", val); } else if (!nlp->nlp_dmpnm) { ! syslog(LOG_DEBUG, "No log file defined"); } else if (ndmpd_append_dumptime(nlp->nlp_dmpnm, nlp->nlp_backup_path, nlp->nlp_tokseq, nlp->nlp_tokdate) < 0) { MOD_LOGV3(params, NDMP_LOG_ERROR, "Saving backup date for \"%s\" in \"%s\".\n", nlp->nlp_backup_path, nlp->nlp_dmpnm);
*** 1344,1354 **** { if (!params || !nlp) return; if (!nlp->nlp_dmpnm) { ! NDMP_LOG(LOG_DEBUG, "No log file defined"); } else if (ndmpd_append_dumptime(nlp->nlp_dmpnm, nlp->nlp_backup_path, nlp->nlp_clevel, nlp->nlp_cdate) < 0) { MOD_LOGV3(params, NDMP_LOG_ERROR, "Saving backup date for \"%s\" in \"%s\".\n", nlp->nlp_backup_path, nlp->nlp_dmpnm); --- 1330,1340 ---- { if (!params || !nlp) return; if (!nlp->nlp_dmpnm) { ! syslog(LOG_DEBUG, "No log file defined"); } else if (ndmpd_append_dumptime(nlp->nlp_dmpnm, nlp->nlp_backup_path, nlp->nlp_clevel, nlp->nlp_cdate) < 0) { MOD_LOGV3(params, NDMP_LOG_ERROR, "Saving backup date for \"%s\" in \"%s\".\n", nlp->nlp_backup_path, nlp->nlp_dmpnm);
*** 1374,1384 **** { if (!params || !nlp) return; if (!NLP_SHOULD_UPDATE(nlp)) { ! NDMP_LOG(LOG_DEBUG, "update not requested"); } else if (ndmpd_put_dumptime(nlp->nlp_backup_path, nlp->nlp_clevel, nlp->nlp_cdate) < 0) { MOD_LOGV3(params, NDMP_LOG_ERROR, "Logging backup date.\n"); } } --- 1360,1370 ---- { if (!params || !nlp) return; if (!NLP_SHOULD_UPDATE(nlp)) { ! syslog(LOG_DEBUG, "update not requested"); } else if (ndmpd_put_dumptime(nlp->nlp_backup_path, nlp->nlp_clevel, nlp->nlp_cdate) < 0) { MOD_LOGV3(params, NDMP_LOG_ERROR, "Logging backup date.\n"); } }
*** 1425,1458 **** * Reader writer IPC * File history callback structure * * Parameters: * session (input) - pointer to the session - * jname (input) - name assigned to the current backup for - * job stats strucure * * Returns: * 0: on success * -1: otherwise */ static int ! backup_alloc_structs_v3(ndmpd_session_t *session, char *jname) { int n; long xfer_size; ndmp_lbr_params_t *nlp; tlm_commands_t *cmds; nlp = ndmp_get_nlp(session); if (!nlp) { ! NDMP_LOG(LOG_DEBUG, "nlp == NULL"); return (-1); } ! nlp->nlp_jstat = tlm_new_job_stats(jname); if (!nlp->nlp_jstat) { ! NDMP_LOG(LOG_DEBUG, "Creating job stats"); return (-1); } cmds = &nlp->nlp_cmds; (void) memset(cmds, 0, sizeof (*cmds)); --- 1411,1442 ---- * Reader writer IPC * File history callback structure * * Parameters: * session (input) - pointer to the session * * Returns: * 0: on success * -1: otherwise */ static int ! backup_alloc_structs_v3(ndmpd_session_t *session) { int n; long xfer_size; ndmp_lbr_params_t *nlp; tlm_commands_t *cmds; nlp = ndmp_get_nlp(session); if (!nlp) { ! syslog(LOG_ERR, "nlp == NULL"); return (-1); } ! nlp->nlp_jstat = tlm_new_job_stats(nlp->nlp_job_name); if (!nlp->nlp_jstat) { ! syslog(LOG_ERR, "Creating job stats failed"); return (-1); } cmds = &nlp->nlp_cmds; (void) memset(cmds, 0, sizeof (*cmds));
*** 1466,1490 **** */ n = 512 * KILOBYTE / xfer_size; if (n <= 0) n = 1; xfer_size *= n; ! NDMP_LOG(LOG_DEBUG, "Adjusted read size: %d", xfer_size); } cmds->tcs_command = tlm_create_reader_writer_ipc(TRUE, xfer_size); if (!cmds->tcs_command) { ! tlm_un_ref_job_stats(jname); return (-1); } nlp->nlp_logcallbacks = lbrlog_callbacks_init(session, ndmpd_fhpath_v3_cb, ndmpd_fhdir_v3_cb, ndmpd_fhnode_v3_cb); if (!nlp->nlp_logcallbacks) { tlm_release_reader_writer_ipc(cmds->tcs_command); ! tlm_un_ref_job_stats(jname); return (-1); } nlp->nlp_jstat->js_callbacks = (void *)(nlp->nlp_logcallbacks); nlp->nlp_restored = NULL; --- 1450,1474 ---- */ n = 512 * KILOBYTE / xfer_size; if (n <= 0) n = 1; xfer_size *= n; ! syslog(LOG_DEBUG, "Adjusted read size: %d", xfer_size); } cmds->tcs_command = tlm_create_reader_writer_ipc(TRUE, xfer_size); if (!cmds->tcs_command) { ! tlm_un_ref_job_stats(nlp->nlp_job_name); return (-1); } nlp->nlp_logcallbacks = lbrlog_callbacks_init(session, ndmpd_fhpath_v3_cb, ndmpd_fhdir_v3_cb, ndmpd_fhnode_v3_cb); if (!nlp->nlp_logcallbacks) { tlm_release_reader_writer_ipc(cmds->tcs_command); ! tlm_un_ref_job_stats(nlp->nlp_job_name); return (-1); } nlp->nlp_jstat->js_callbacks = (void *)(nlp->nlp_logcallbacks); nlp->nlp_restored = NULL;
*** 1500,1563 **** * Reader writer IPC * File recovery callback structure * * Parameters: * session (input) - pointer to the session - * jname (input) - name assigned to the current backup for - * job stats strucure * * Returns: * 0: on success * -1: otherwise */ int ! restore_alloc_structs_v3(ndmpd_session_t *session, char *jname) { long xfer_size; ndmp_lbr_params_t *nlp; tlm_commands_t *cmds; nlp = ndmp_get_nlp(session); if (!nlp) { ! NDMP_LOG(LOG_DEBUG, "nlp == NULL"); return (-1); } /* this is used in ndmpd_path_restored_v3() */ nlp->nlp_lastidx = -1; ! nlp->nlp_jstat = tlm_new_job_stats(jname); if (!nlp->nlp_jstat) { ! NDMP_LOG(LOG_DEBUG, "Creating job stats"); return (-1); } cmds = &nlp->nlp_cmds; (void) memset(cmds, 0, sizeof (*cmds)); xfer_size = ndmp_buffer_get_size(session); cmds->tcs_command = tlm_create_reader_writer_ipc(FALSE, xfer_size); if (!cmds->tcs_command) { ! tlm_un_ref_job_stats(jname); return (-1); } nlp->nlp_logcallbacks = lbrlog_callbacks_init(session, ndmpd_path_restored_v3, NULL, NULL); if (!nlp->nlp_logcallbacks) { tlm_release_reader_writer_ipc(cmds->tcs_command); ! tlm_un_ref_job_stats(jname); return (-1); } nlp->nlp_jstat->js_callbacks = (void *)(nlp->nlp_logcallbacks); nlp->nlp_rsbm = bm_alloc(nlp->nlp_nfiles, 0); if (nlp->nlp_rsbm < 0) { ! NDMP_LOG(LOG_ERR, "Out of memory."); lbrlog_callbacks_done(nlp->nlp_logcallbacks); tlm_release_reader_writer_ipc(cmds->tcs_command); ! tlm_un_ref_job_stats(jname); return (-1); } return (0); } --- 1484,1545 ---- * Reader writer IPC * File recovery callback structure * * Parameters: * session (input) - pointer to the session * * Returns: * 0: on success * -1: otherwise */ int ! restore_alloc_structs_v3(ndmpd_session_t *session) { long xfer_size; ndmp_lbr_params_t *nlp; tlm_commands_t *cmds; nlp = ndmp_get_nlp(session); if (!nlp) { ! syslog(LOG_ERR, "nlp == NULL"); return (-1); } /* this is used in ndmpd_path_restored_v3() */ nlp->nlp_lastidx = -1; ! nlp->nlp_jstat = tlm_new_job_stats(nlp->nlp_job_name); if (!nlp->nlp_jstat) { ! syslog(LOG_ERR, "Creating job stats failed"); return (-1); } cmds = &nlp->nlp_cmds; (void) memset(cmds, 0, sizeof (*cmds)); xfer_size = ndmp_buffer_get_size(session); cmds->tcs_command = tlm_create_reader_writer_ipc(FALSE, xfer_size); if (!cmds->tcs_command) { ! tlm_un_ref_job_stats(nlp->nlp_job_name); return (-1); } nlp->nlp_logcallbacks = lbrlog_callbacks_init(session, ndmpd_path_restored_v3, NULL, NULL); if (!nlp->nlp_logcallbacks) { tlm_release_reader_writer_ipc(cmds->tcs_command); ! tlm_un_ref_job_stats(nlp->nlp_job_name); return (-1); } nlp->nlp_jstat->js_callbacks = (void *)(nlp->nlp_logcallbacks); nlp->nlp_rsbm = bm_alloc(nlp->nlp_nfiles, 0); if (nlp->nlp_rsbm < 0) { ! syslog(LOG_ERR, "Out of memory."); lbrlog_callbacks_done(nlp->nlp_logcallbacks); tlm_release_reader_writer_ipc(cmds->tcs_command); ! tlm_un_ref_job_stats(nlp->nlp_job_name); return (-1); } return (0); }
*** 1569,1625 **** * Release the resources allocated by backup_alloc_structs_v3 * function. * * Parameters: * session (input) - pointer to the session - * jname (input) - name assigned to the current backup for - * job stats strucure * * Returns: * void */ - /*ARGSUSED*/ static void ! free_structs_v3(ndmpd_session_t *session, char *jname) { ndmp_lbr_params_t *nlp; tlm_commands_t *cmds; nlp = ndmp_get_nlp(session); if (!nlp) { ! NDMP_LOG(LOG_DEBUG, "nlp == NULL"); return; } cmds = &nlp->nlp_cmds; if (!cmds) { ! NDMP_LOG(LOG_DEBUG, "cmds == NULL"); return; } if (nlp->nlp_logcallbacks) { lbrlog_callbacks_done(nlp->nlp_logcallbacks); nlp->nlp_logcallbacks = NULL; } else ! NDMP_LOG(LOG_DEBUG, "FH CALLBACKS == NULL"); if (cmds->tcs_command) { if (cmds->tcs_command->tc_buffers != NULL) tlm_release_reader_writer_ipc(cmds->tcs_command); else ! NDMP_LOG(LOG_DEBUG, "BUFFERS == NULL"); cmds->tcs_command = NULL; } else ! NDMP_LOG(LOG_DEBUG, "COMMAND == NULL"); if (nlp->nlp_bkmap >= 0) { (void) dbm_free(nlp->nlp_bkmap); nlp->nlp_bkmap = -1; } if (session->ns_data.dd_operation == NDMP_DATA_OP_RECOVER) { if (nlp->nlp_rsbm < 0) { ! NDMP_LOG(LOG_DEBUG, "nlp_rsbm < 0 %d", nlp->nlp_rsbm); } else { (void) bm_free(nlp->nlp_rsbm); nlp->nlp_rsbm = -1; } } --- 1551,1604 ---- * Release the resources allocated by backup_alloc_structs_v3 * function. * * Parameters: * session (input) - pointer to the session * * Returns: * void */ static void ! free_structs_v3(ndmpd_session_t *session) { ndmp_lbr_params_t *nlp; tlm_commands_t *cmds; nlp = ndmp_get_nlp(session); if (!nlp) { ! syslog(LOG_DEBUG, "nlp == NULL"); return; } cmds = &nlp->nlp_cmds; if (!cmds) { ! syslog(LOG_DEBUG, "cmds == NULL"); return; } if (nlp->nlp_logcallbacks) { lbrlog_callbacks_done(nlp->nlp_logcallbacks); nlp->nlp_logcallbacks = NULL; } else ! syslog(LOG_DEBUG, "FH CALLBACKS == NULL"); if (cmds->tcs_command) { if (cmds->tcs_command->tc_buffers != NULL) tlm_release_reader_writer_ipc(cmds->tcs_command); else ! syslog(LOG_DEBUG, "BUFFERS == NULL"); cmds->tcs_command = NULL; } else ! syslog(LOG_DEBUG, "COMMAND == NULL"); if (nlp->nlp_bkmap >= 0) { (void) dbm_free(nlp->nlp_bkmap); nlp->nlp_bkmap = -1; } if (session->ns_data.dd_operation == NDMP_DATA_OP_RECOVER) { if (nlp->nlp_rsbm < 0) { ! syslog(LOG_DEBUG, "nlp_rsbm < 0 %d", nlp->nlp_rsbm); } else { (void) bm_free(nlp->nlp_rsbm); nlp->nlp_rsbm = -1; } }
*** 1651,1671 **** struct stat64 st; char fullpath[TLM_MAX_PATH_NAME]; char *p; if (!bpp || !pnp || !enp) { ! NDMP_LOG(LOG_DEBUG, "Invalid argument"); return (-1); } - NDMP_LOG(LOG_DEBUG, "d(%s)", bpp->bp_tmp); - if (lstat64(bpp->bp_tmp, &st) != 0) return (0); if (acl_get(bpp->bp_tmp, ACL_NO_TRIVIAL, &aclp) != 0) { ! NDMP_LOG(LOG_DEBUG, "acl_get error errno=%d", errno); return (-1); } if (aclp && (acltp = acl_totext(aclp, ACL_APPEND_ID | ACL_SID_FMT | ACL_COMPACT_FMT)) != NULL) { (void) strlcpy(bpp->bp_tlmacl->acl_info.attr_info, --- 1630,1648 ---- struct stat64 st; char fullpath[TLM_MAX_PATH_NAME]; char *p; if (!bpp || !pnp || !enp) { ! syslog(LOG_ERR, "Invalid argument in backup_dirv3"); return (-1); } if (lstat64(bpp->bp_tmp, &st) != 0) return (0); if (acl_get(bpp->bp_tmp, ACL_NO_TRIVIAL, &aclp) != 0) { ! syslog(LOG_DEBUG, "acl_get error errno=%d", errno); return (-1); } if (aclp && (acltp = acl_totext(aclp, ACL_APPEND_ID | ACL_SID_FMT | ACL_COMPACT_FMT)) != NULL) { (void) strlcpy(bpp->bp_tlmacl->acl_info.attr_info,
*** 1716,1746 **** static int backup_filev3(bk_param_v3_t *bpp, fst_node_t *pnp, fst_node_t *enp) { char *ent; ! longlong_t rv; longlong_t apos, bpos; acl_t *aclp = NULL; char *acltp; struct stat64 st; char fullpath[TLM_MAX_PATH_NAME]; char *p; if (!bpp || !pnp || !enp) { ! NDMP_LOG(LOG_DEBUG, "Invalid argument"); return (-1); } - NDMP_LOG(LOG_DEBUG, "f(%s)", bpp->bp_tmp); - if (lstat64(bpp->bp_tmp, &st) != 0) return (0); if (!S_ISLNK(bpp->bp_tlmacl->acl_attr.st_mode)) { if (acl_get(bpp->bp_tmp, ACL_NO_TRIVIAL, &aclp) != 0) { ! NDMP_LOG(LOG_DEBUG, "acl_get error"); return (-1); } if (aclp && (acltp = acl_totext(aclp, --- 1693,1721 ---- static int backup_filev3(bk_param_v3_t *bpp, fst_node_t *pnp, fst_node_t *enp) { char *ent; ! int rv = -1; longlong_t apos, bpos; acl_t *aclp = NULL; char *acltp; struct stat64 st; char fullpath[TLM_MAX_PATH_NAME]; char *p; if (!bpp || !pnp || !enp) { ! syslog(LOG_ERR, "Invalid argument in backup_filev3"); return (-1); } if (lstat64(bpp->bp_tmp, &st) != 0) return (0); if (!S_ISLNK(bpp->bp_tlmacl->acl_attr.st_mode)) { if (acl_get(bpp->bp_tmp, ACL_NO_TRIVIAL, &aclp) != 0) { ! syslog(LOG_DEBUG, "acl_get error"); return (-1); } if (aclp && (acltp = acl_totext(aclp,
*** 1801,1825 **** { int rv; if (!bpp) { rv = -1; ! NDMP_LOG(LOG_DEBUG, "Lost bpp"); } else if (!bpp->bp_session) { rv = -1; ! NDMP_LOG(LOG_DEBUG, "Session is NULL"); } else if (bpp->bp_session->ns_eof) { rv = -1; ! NDMP_LOG(LOG_INFO, "Connection client is closed for backup \"%s\"", bpp->bp_nlp->nlp_backup_path); } else if (!bpp->bp_nlp) { ! NDMP_LOG(LOG_DEBUG, "Lost nlp"); return (-1); } else if (bpp->bp_session->ns_data.dd_abort) { rv = -1; ! NDMP_LOG(LOG_INFO, "Backup aborted \"%s\"", bpp->bp_nlp->nlp_backup_path); } else rv = 0; return (rv); --- 1776,1800 ---- { int rv; if (!bpp) { rv = -1; ! syslog(LOG_DEBUG, "Lost bpp"); } else if (!bpp->bp_session) { rv = -1; ! syslog(LOG_DEBUG, "Session is NULL"); } else if (bpp->bp_session->ns_eof) { rv = -1; ! syslog(LOG_INFO, "Connection client is closed for backup \"%s\"", bpp->bp_nlp->nlp_backup_path); } else if (!bpp->bp_nlp) { ! syslog(LOG_DEBUG, "Lost nlp"); return (-1); } else if (bpp->bp_session->ns_data.dd_abort) { rv = -1; ! syslog(LOG_INFO, "Backup aborted \"%s\"", bpp->bp_nlp->nlp_backup_path); } else rv = 0; return (rv);
*** 1850,1860 **** char *ent; boolean_t rv; struct stat64 *estp; if (!bpp || !pnp || !enp || !errp) { ! NDMP_LOG(LOG_DEBUG, "Invalid argument"); return (TRUE); } if (!enp->tn_path) { ent = ""; --- 1825,1835 ---- char *ent; boolean_t rv; struct stat64 *estp; if (!bpp || !pnp || !enp || !errp) { ! syslog(LOG_DEBUG, "Invalid argument in shouldskip"); return (TRUE); } if (!enp->tn_path) { ent = "";
*** 1870,1896 **** * get other entries in the directory of this entry. */ if (!dbm_getone(bpp->bp_nlp->nlp_bkmap, (u_longlong_t)estp->st_ino)) { rv = TRUE; *errp = S_ISDIR(estp->st_mode) ? FST_SKIP : 0; - NDMP_LOG(LOG_DEBUG, "Skipping %d %s/%s", - *errp, pnp->tn_path, ent); } else if (tlm_is_excluded(pnp->tn_path, ent, bpp->bp_excls)) { rv = TRUE; *errp = S_ISDIR(estp->st_mode) ? FST_SKIP : 0; - NDMP_LOG(LOG_DEBUG, "excl %d \"%s/%s\"", - *errp, pnp->tn_path, ent); } else if (inexl(bpp->bp_nlp->nlp_exl, ent)) { rv = TRUE; *errp = S_ISDIR(estp->st_mode) ? FST_SKIP : 0; - NDMP_LOG(LOG_DEBUG, "out %d \"%s/%s\"", - *errp, pnp->tn_path, ent); } else if (!S_ISDIR(estp->st_mode) && !ininc(bpp->bp_nlp->nlp_inc, ent)) { rv = TRUE; *errp = 0; - NDMP_LOG(LOG_DEBUG, "!in \"%s/%s\"", pnp->tn_path, ent); } else rv = FALSE; return (rv); } --- 1845,1864 ----
*** 1921,1944 **** { boolean_t rv; if (!stp) { rv = FALSE; ! NDMP_LOG(LOG_DEBUG, "stp is NULL"); } else if (!nlp) { rv = FALSE; ! NDMP_LOG(LOG_DEBUG, "nlp is NULL"); } else if (t == 0) { /* * if we are doing base backup then we do not need to * check the time, for we should backup everything. */ rv = TRUE; - NDMP_LOG(LOG_DEBUG, "Base Backup"); } else if (S_ISDIR(stp->st_mode) && ndmp_force_bk_dirs) { rv = TRUE; - NDMP_LOG(LOG_DEBUG, "d(%lu)", (uint_t)stp->st_ino); } else if (S_ISDIR(stp->st_mode) && dbm_getone(nlp->nlp_bkmap, (u_longlong_t)stp->st_ino) && ((NLP_ISDUMP(nlp) && ndmp_dump_path_node) || (NLP_ISTAR(nlp) && ndmp_tar_path_node))) { /* --- 1889,1910 ---- { boolean_t rv; if (!stp) { rv = FALSE; ! syslog(LOG_DEBUG, "stp is NULL"); } else if (!nlp) { rv = FALSE; ! syslog(LOG_DEBUG, "nlp is NULL"); } else if (t == 0) { /* * if we are doing base backup then we do not need to * check the time, for we should backup everything. */ rv = TRUE; } else if (S_ISDIR(stp->st_mode) && ndmp_force_bk_dirs) { rv = TRUE; } else if (S_ISDIR(stp->st_mode) && dbm_getone(nlp->nlp_bkmap, (u_longlong_t)stp->st_ino) && ((NLP_ISDUMP(nlp) && ndmp_dump_path_node) || (NLP_ISTAR(nlp) && ndmp_tar_path_node))) { /*
*** 1955,1984 **** * but for 'tar' format, it does not. In provision to the * NDMP-v4 spec, for 'tar' format the intermediate directories * need not to be reported. */ rv = TRUE; - NDMP_LOG(LOG_DEBUG, "p(%lu)", (u_longlong_t)stp->st_ino); } else if (stp->st_mtime > t) { rv = TRUE; - NDMP_LOG(LOG_DEBUG, "m(%lu): %lu > %lu", - (uint_t)stp->st_ino, (uint_t)stp->st_mtime, (uint_t)t); } else if (stp->st_ctime > t) { if (NLP_IGNCTIME(nlp)) { rv = FALSE; ! NDMP_LOG(LOG_DEBUG, "ign c(%lu): %lu > %lu", (uint_t)stp->st_ino, (uint_t)stp->st_ctime, (uint_t)t); } else { rv = TRUE; ! NDMP_LOG(LOG_DEBUG, "c(%lu): %lu > %lu", (uint_t)stp->st_ino, (uint_t)stp->st_ctime, (uint_t)t); } } else { rv = FALSE; ! NDMP_LOG(LOG_DEBUG, "mc(%lu): (%lu,%lu) < %lu", (uint_t)stp->st_ino, (uint_t)stp->st_mtime, (uint_t)stp->st_ctime, (uint_t)t); } return (rv); --- 1921,1947 ---- * but for 'tar' format, it does not. In provision to the * NDMP-v4 spec, for 'tar' format the intermediate directories * need not to be reported. */ rv = TRUE; } else if (stp->st_mtime > t) { rv = TRUE; } else if (stp->st_ctime > t) { if (NLP_IGNCTIME(nlp)) { rv = FALSE; ! syslog(LOG_DEBUG, "ign c(%lu): %lu > %lu", (uint_t)stp->st_ino, (uint_t)stp->st_ctime, (uint_t)t); } else { rv = TRUE; ! syslog(LOG_DEBUG, "c(%lu): %lu > %lu", (uint_t)stp->st_ino, (uint_t)stp->st_ctime, (uint_t)t); } } else { rv = FALSE; ! syslog(LOG_DEBUG, "mc(%lu): (%lu,%lu) < %lu", (uint_t)stp->st_ino, (uint_t)stp->st_mtime, (uint_t)stp->st_ctime, (uint_t)t); } return (rv);
*** 1998,2014 **** { int ret; acl_t *aclp = NULL; char *acltp; ! NDMP_LOG(LOG_DEBUG, "flags %x", nlp->nlp_flags); if (NLP_INCLMTIME(nlp) == FALSE) return (0); ret = acl_get(name, ACL_NO_TRIVIAL, &aclp); if (ret != 0) { ! NDMP_LOG(LOG_DEBUG, "Error getting the acl information: err %d", ret); return (0); } if (aclp && (acltp = acl_totext(aclp, ACL_APPEND_ID | ACL_SID_FMT | ACL_COMPACT_FMT)) != NULL) { --- 1961,1977 ---- { int ret; acl_t *aclp = NULL; char *acltp; ! syslog(LOG_DEBUG, "flags %x", nlp->nlp_flags); if (NLP_INCLMTIME(nlp) == FALSE) return (0); ret = acl_get(name, ACL_NO_TRIVIAL, &aclp); if (ret != 0) { ! syslog(LOG_DEBUG, "Error getting the acl information: err %d", ret); return (0); } if (aclp && (acltp = acl_totext(aclp, ACL_APPEND_ID | ACL_SID_FMT | ACL_COMPACT_FMT)) != NULL) {
*** 2090,2108 **** fhp = pnp->tn_fh; } if (!tlm_cat_path(bpp->bp_tmp, pnp->tn_path, ent)) { ! NDMP_LOG(LOG_ERR, "Path too long %s/%s.", pnp->tn_path, ent); return (FST_SKIP); } if (NLP_ISSET(bpp->bp_nlp, NLPF_TOKENBK)) t = bpp->bp_nlp->nlp_tokdate; else if (NLP_ISSET(bpp->bp_nlp, NLPF_LEVELBK)) { t = bpp->bp_nlp->nlp_ldate; } else { ! NDMP_LOG(LOG_DEBUG, "Unknown backup type on \"%s/%s\"", pnp->tn_path, ent); return (-1); } if (S_ISDIR(stp->st_mode)) { --- 2053,2071 ---- fhp = pnp->tn_fh; } if (!tlm_cat_path(bpp->bp_tmp, pnp->tn_path, ent)) { ! syslog(LOG_ERR, "Path too long %s/%s.", pnp->tn_path, ent); return (FST_SKIP); } if (NLP_ISSET(bpp->bp_nlp, NLPF_TOKENBK)) t = bpp->bp_nlp->nlp_tokdate; else if (NLP_ISSET(bpp->bp_nlp, NLPF_LEVELBK)) { t = bpp->bp_nlp->nlp_ldate; } else { ! syslog(LOG_ERR, "Unknown backup type on \"%s/%s\"", pnp->tn_path, ent); return (-1); } if (S_ISDIR(stp->st_mode)) {
*** 2175,2189 **** stp = pnp->tn_st; fhp = pnp->tn_fh; } if (!tlm_cat_path(bpp->bp_tmp, pnp->tn_path, ent)) { ! NDMP_LOG(LOG_ERR, "Path too long %s/%s.", pnp->tn_path, ent); return (FST_SKIP); } if (!NLP_ISSET(bpp->bp_nlp, NLPF_LBRBK)) { ! NDMP_LOG(LOG_DEBUG, "!NLPF_LBRBK"); return (-1); } if (S_ISDIR(stp->st_mode)) { bpp->bp_tlmacl->acl_dir_fh = *fhp; --- 2138,2152 ---- stp = pnp->tn_st; fhp = pnp->tn_fh; } if (!tlm_cat_path(bpp->bp_tmp, pnp->tn_path, ent)) { ! syslog(LOG_ERR, "Path too long %s/%s.", pnp->tn_path, ent); return (FST_SKIP); } if (!NLP_ISSET(bpp->bp_nlp, NLPF_LBRBK)) { ! syslog(LOG_DEBUG, "!NLPF_LBRBK"); return (-1); } if (S_ISDIR(stp->st_mode)) { bpp->bp_tlmacl->acl_dir_fh = *fhp;
*** 2211,2224 **** * The reader thread for the backup. It sets up the callback * parameters and traverses the backup hierarchy in level-order * way. * * Parameters: ! * jname (input) - name assigned to the current backup for ! * job stats strucure ! * nlp (input) - pointer to the nlp structure ! * cmds (input) - pointer to the tlm_commands_t structure * * Returns: * 0: on success * != 0: otherwise */ --- 2174,2184 ---- * The reader thread for the backup. It sets up the callback * parameters and traverses the backup hierarchy in level-order * way. * * Parameters: ! * argp (input) - backup reader argument * * Returns: * 0: on success * != 0: otherwise */
*** 2229,2246 **** tlm_cmd_t *lcmd; tlm_acls_t tlm_acls; longlong_t bpos, n; bk_param_v3_t bp; fs_traverse_t ft; - char *jname; ndmp_lbr_params_t *nlp; tlm_commands_t *cmds; if (!argp) return (-1); - jname = argp->br_jname; nlp = argp->br_nlp; cmds = argp->br_cmds; rv = 0; lcmd = cmds->tcs_command; --- 2189,2205 ---- tlm_cmd_t *lcmd; tlm_acls_t tlm_acls; longlong_t bpos, n; bk_param_v3_t bp; fs_traverse_t ft; ndmp_lbr_params_t *nlp; tlm_commands_t *cmds; + int rc; if (!argp) return (-1); nlp = argp->br_nlp; cmds = argp->br_cmds; rv = 0; lcmd = cmds->tcs_command;
*** 2252,2269 **** /* NDMP parameters */ bp.bp_session = nlp->nlp_session; bp.bp_nlp = nlp; /* LBR-related parameters */ ! bp.bp_js = tlm_ref_job_stats(jname); bp.bp_cmds = cmds; bp.bp_lcmd = lcmd; bp.bp_tlmacl = &tlm_acls; bp.bp_opr = 0; /* release the parent thread, after referencing the job stats */ ! (void) pthread_barrier_wait(&argp->br_barrier); bp.bp_tmp = ndmp_malloc(sizeof (char) * TLM_MAX_PATH_NAME); if (!bp.bp_tmp) return (-1); --- 2211,2231 ---- /* NDMP parameters */ bp.bp_session = nlp->nlp_session; bp.bp_nlp = nlp; /* LBR-related parameters */ ! bp.bp_js = tlm_ref_job_stats(nlp->nlp_job_name); bp.bp_cmds = cmds; bp.bp_lcmd = lcmd; bp.bp_tlmacl = &tlm_acls; bp.bp_opr = 0; /* release the parent thread, after referencing the job stats */ ! rc = pthread_barrier_wait(&argp->br_barrier); ! if (rc == PTHREAD_BARRIER_SERIAL_THREAD) { ! (void) pthread_barrier_destroy(&argp->br_barrier); ! } bp.bp_tmp = ndmp_malloc(sizeof (char) * TLM_MAX_PATH_NAME); if (!bp.bp_tmp) return (-1);
*** 2271,2317 **** * Make the checkpointed paths for traversing the * backup hierarchy, if we make the checkpoint. */ bp.bp_unchkpnm = nlp->nlp_backup_path; if (!NLP_ISCHKPNTED(nlp)) { ! tlm_acls.acl_checkpointed = TRUE; bp.bp_chkpnm = ndmp_malloc(sizeof (char) * TLM_MAX_PATH_NAME); if (!bp.bp_chkpnm) { NDMP_FREE(bp.bp_tmp); return (-1); } (void) tlm_build_snapshot_name(nlp->nlp_backup_path, bp.bp_chkpnm, nlp->nlp_jstat->js_job_name); } else { ! tlm_acls.acl_checkpointed = FALSE; ! bp.bp_chkpnm = nlp->nlp_backup_path; } bp.bp_excls = ndmpd_make_exc_list(); /* set traversing arguments */ ft.ft_path = nlp->nlp_backup_path; ft.ft_lpath = bp.bp_chkpnm; - NDMP_LOG(LOG_DEBUG, "path %s lpath %s", ft.ft_path, ft.ft_lpath); if (NLP_ISSET(nlp, NLPF_TOKENBK) || NLP_ISSET(nlp, NLPF_LEVELBK)) { ft.ft_callbk = timebk_v3; tlm_acls.acl_clear_archive = FALSE; } else if (NLP_ISSET(nlp, NLPF_LBRBK)) { ft.ft_callbk = lbrbk_v3; tlm_acls.acl_clear_archive = FALSE; ! NDMP_LOG(LOG_DEBUG, "bp_opr %x clr_arc %c", bp.bp_opr, NDMP_YORN(tlm_acls.acl_clear_archive)); } else { rv = -1; MOD_LOGV3(nlp->nlp_params, NDMP_LOG_ERROR, ! "Unknow backup type.\n"); } ft.ft_arg = &bp; ! ft.ft_logfp = (ft_log_t)ndmp_log; ft.ft_flags = FST_VERBOSE | FST_STOP_ONERR; /* take into account the header written to the stream so far */ n = tlm_get_data_offset(lcmd); nlp->nlp_session->ns_data.dd_module.dm_stats.ms_bytes_processed = n; if (rv == 0) { --- 2233,2281 ---- * Make the checkpointed paths for traversing the * backup hierarchy, if we make the checkpoint. */ bp.bp_unchkpnm = nlp->nlp_backup_path; if (!NLP_ISCHKPNTED(nlp)) { ! tlm_acls.acl_checkpointed = FALSE; bp.bp_chkpnm = ndmp_malloc(sizeof (char) * TLM_MAX_PATH_NAME); if (!bp.bp_chkpnm) { NDMP_FREE(bp.bp_tmp); return (-1); } (void) tlm_build_snapshot_name(nlp->nlp_backup_path, bp.bp_chkpnm, nlp->nlp_jstat->js_job_name); } else { ! tlm_acls.acl_checkpointed = TRUE; ! bp.bp_chkpnm = nlp->nlp_mountpoint; } bp.bp_excls = ndmpd_make_exc_list(); /* set traversing arguments */ ft.ft_path = nlp->nlp_backup_path; ft.ft_lpath = bp.bp_chkpnm; if (NLP_ISSET(nlp, NLPF_TOKENBK) || NLP_ISSET(nlp, NLPF_LEVELBK)) { ft.ft_callbk = timebk_v3; tlm_acls.acl_clear_archive = FALSE; } else if (NLP_ISSET(nlp, NLPF_LBRBK)) { ft.ft_callbk = lbrbk_v3; tlm_acls.acl_clear_archive = FALSE; ! syslog(LOG_DEBUG, "bp_opr %x clr_arc %c", bp.bp_opr, NDMP_YORN(tlm_acls.acl_clear_archive)); } else { rv = -1; MOD_LOGV3(nlp->nlp_params, NDMP_LOG_ERROR, ! "Unknown backup type.\n"); } + ft.ft_arg = &bp; ! ft.ft_logfp = (ft_log_t)syslog; ft.ft_flags = FST_VERBOSE | FST_STOP_ONERR; + syslog(LOG_DEBUG, "Traverse logical path [%s]", ft.ft_lpath); + /* take into account the header written to the stream so far */ n = tlm_get_data_offset(lcmd); nlp->nlp_session->ns_data.dd_module.dm_stats.ms_bytes_processed = n; if (rv == 0) {
*** 2338,2350 **** NDMP_FREE(bp.bp_excls); cmds->tcs_reader_count--; lcmd->tc_writer = TLM_STOP; tlm_release_reader_writer_ipc(lcmd); ! tlm_un_ref_job_stats(jname); ! return (rv); } /* * tar_backup_v3 --- 2302,2314 ---- NDMP_FREE(bp.bp_excls); cmds->tcs_reader_count--; lcmd->tc_writer = TLM_STOP; tlm_release_reader_writer_ipc(lcmd); ! tlm_un_ref_job_stats(nlp->nlp_job_name); + return (rv); } /* * tar_backup_v3
*** 2354,2402 **** * * Parameters: * session (input) - pointer to the session * params (input) - pointer to the parameters structure * nlp (input) - pointer to the nlp structure - * jname (input) - job name * * Returns: * 0: on success * != 0: otherwise */ static int tar_backup_v3(ndmpd_session_t *session, ndmpd_module_params_t *params, ! ndmp_lbr_params_t *nlp, char *jname) { tlm_commands_t *cmds; backup_reader_arg_t arg; pthread_t rdtp; char info[256]; int result; ndmp_context_t nctx; int err; ! if (ndmp_get_bk_dir_ino(nlp)) return (-1); result = err = 0; /* exit as if there was an internal error */ ! if (session->ns_eof) return (-1); ! if (!session->ns_data.dd_abort) { ! if (backup_alloc_structs_v3(session, jname) < 0) { nlp->nlp_bkmap = -1; return (-1); } if (ndmpd_mark_inodes_v3(session, nlp) != 0) { if (nlp->nlp_bkmap != -1) { (void) dbm_free(nlp->nlp_bkmap); nlp->nlp_bkmap = -1; } ! free_structs_v3(session, jname); return (-1); } nlp->nlp_jstat->js_start_ltime = time(NULL); nlp->nlp_jstat->js_start_time = nlp->nlp_jstat->js_start_ltime; --- 2318,2368 ---- * * Parameters: * session (input) - pointer to the session * params (input) - pointer to the parameters structure * nlp (input) - pointer to the nlp structure * * Returns: * 0: on success * != 0: otherwise */ static int tar_backup_v3(ndmpd_session_t *session, ndmpd_module_params_t *params, ! ndmp_lbr_params_t *nlp) { tlm_commands_t *cmds; backup_reader_arg_t arg; pthread_t rdtp; char info[256]; int result; ndmp_context_t nctx; int err; + int rc; ! if (ndmp_get_bk_dir_ino(nlp)) { ! syslog(LOG_ERR, "Couldn't get backup directory inode"); return (-1); + } result = err = 0; /* exit as if there was an internal error */ ! if (session->ns_eof) { return (-1); ! } if (!session->ns_data.dd_abort) { ! if (backup_alloc_structs_v3(session) < 0) { nlp->nlp_bkmap = -1; return (-1); } if (ndmpd_mark_inodes_v3(session, nlp) != 0) { if (nlp->nlp_bkmap != -1) { (void) dbm_free(nlp->nlp_bkmap); nlp->nlp_bkmap = -1; } ! free_structs_v3(session); return (-1); } nlp->nlp_jstat->js_start_ltime = time(NULL); nlp->nlp_jstat->js_start_time = nlp->nlp_jstat->js_start_ltime;
*** 2406,2421 **** cmds->tcs_reader = cmds->tcs_writer = TLM_BACKUP_RUN; cmds->tcs_command->tc_reader = TLM_BACKUP_RUN; cmds->tcs_command->tc_writer = TLM_BACKUP_RUN; if (ndmp_write_utf8magic(cmds->tcs_command) < 0) { ! free_structs_v3(session, jname); return (-1); } ! NDMP_LOG(LOG_DEBUG, ! "Backing up \"%s\" started.", nlp->nlp_backup_path); /* Plug-in module */ if (ndmp_pl != NULL && ndmp_pl->np_pre_backup != NULL) { (void) memset(&nctx, 0, sizeof (ndmp_context_t)); --- 2372,2388 ---- cmds->tcs_reader = cmds->tcs_writer = TLM_BACKUP_RUN; cmds->tcs_command->tc_reader = TLM_BACKUP_RUN; cmds->tcs_command->tc_writer = TLM_BACKUP_RUN; if (ndmp_write_utf8magic(cmds->tcs_command) < 0) { ! free_structs_v3(session); return (-1); } ! syslog(LOG_DEBUG, "Backing up \"%s\" started.", ! NLP_ISCHKPNTED(nlp) ! ? nlp->nlp_mountpoint : nlp->nlp_backup_path); /* Plug-in module */ if (ndmp_pl != NULL && ndmp_pl->np_pre_backup != NULL) { (void) memset(&nctx, 0, sizeof (ndmp_context_t));
*** 2424,2474 **** nctx.nc_cmds = cmds; nctx.nc_params = params; nctx.nc_ddata = (void *) session; if ((err = ndmp_pl->np_pre_backup(ndmp_pl, &nctx, nlp->nlp_backup_path)) != 0) { ! NDMP_LOG(LOG_ERR, "Pre-backup plug-in: %m"); goto backup_out; } } (void) memset(&arg, 0, sizeof (backup_reader_arg_t)); - arg.br_jname = jname; arg.br_nlp = nlp; arg.br_cmds = cmds; (void) pthread_barrier_init(&arg.br_barrier, 0, 2); err = pthread_create(&rdtp, NULL, (funct_t)backup_reader_v3, (void *)&arg); if (err == 0) { ! (void) pthread_barrier_wait(&arg.br_barrier); (void) pthread_barrier_destroy(&arg.br_barrier); } else { (void) pthread_barrier_destroy(&arg.br_barrier); ! free_structs_v3(session, jname); ! NDMP_LOG(LOG_DEBUG, "Launch backup_reader_v3: %m"); return (-1); } if ((err = ndmp_tar_writer(session, params, cmds)) != 0) result = EIO; nlp->nlp_jstat->js_stop_time = time(NULL); (void) snprintf(info, sizeof (info), ! "Runtime [%s] %llu bytes (%llu): %d seconds\n", nlp->nlp_backup_path, session->ns_data.dd_module.dm_stats.ms_bytes_processed, session->ns_data.dd_module.dm_stats.ms_bytes_processed, nlp->nlp_jstat->js_stop_time - nlp->nlp_jstat->js_start_ltime); MOD_LOGV3(params, NDMP_LOG_NORMAL, info); ndmp_wait_for_reader(cmds); (void) pthread_join(rdtp, NULL); - /* exit as if there was an internal error */ if (session->ns_eof) { result = EPIPE; err = -1; } --- 2391,2442 ---- nctx.nc_cmds = cmds; nctx.nc_params = params; nctx.nc_ddata = (void *) session; if ((err = ndmp_pl->np_pre_backup(ndmp_pl, &nctx, nlp->nlp_backup_path)) != 0) { ! syslog(LOG_ERR, "Pre-backup plug-in: %m"); goto backup_out; } } (void) memset(&arg, 0, sizeof (backup_reader_arg_t)); arg.br_nlp = nlp; arg.br_cmds = cmds; (void) pthread_barrier_init(&arg.br_barrier, 0, 2); err = pthread_create(&rdtp, NULL, (funct_t)backup_reader_v3, (void *)&arg); if (err == 0) { ! rc = pthread_barrier_wait(&arg.br_barrier); ! if (rc == PTHREAD_BARRIER_SERIAL_THREAD) { (void) pthread_barrier_destroy(&arg.br_barrier); + } } else { (void) pthread_barrier_destroy(&arg.br_barrier); ! free_structs_v3(session); ! syslog(LOG_ERR, "Launch backup_reader_v3 failed on %s", ! nlp->nlp_job_name); return (-1); } if ((err = ndmp_tar_writer(session, params, cmds)) != 0) result = EIO; nlp->nlp_jstat->js_stop_time = time(NULL); (void) snprintf(info, sizeof (info), ! "Runtime [%s] %lu bytes (%lu): %d seconds\n", nlp->nlp_backup_path, session->ns_data.dd_module.dm_stats.ms_bytes_processed, session->ns_data.dd_module.dm_stats.ms_bytes_processed, nlp->nlp_jstat->js_stop_time - nlp->nlp_jstat->js_start_ltime); MOD_LOGV3(params, NDMP_LOG_NORMAL, info); ndmp_wait_for_reader(cmds); (void) pthread_join(rdtp, NULL); /* exit as if there was an internal error */ if (session->ns_eof) { result = EPIPE; err = -1; }
*** 2475,2510 **** if (!session->ns_data.dd_abort) { ndmpd_audit_backup(session->ns_connection, nlp->nlp_backup_path, session->ns_data.dd_data_addr.addr_type, session->ns_tape.td_adapter_name, result); ! NDMP_LOG(LOG_DEBUG, "Backing up \"%s\" Finished.", ! nlp->nlp_backup_path); } } if (session->ns_data.dd_abort) { ndmpd_audit_backup(session->ns_connection, nlp->nlp_backup_path, session->ns_data.dd_data_addr.addr_type, session->ns_tape.td_adapter_name, EINTR); ! NDMP_LOG(LOG_DEBUG, ! "Backing up \"%s\" aborted.", nlp->nlp_backup_path); err = -1; } else { backup_out: /* Plug-in module */ if (ndmp_pl != NULL && ndmp_pl->np_post_backup != NULL && ndmp_pl->np_post_backup(ndmp_pl, &nctx, err) == -1) { ! NDMP_LOG(LOG_DEBUG, "Post-backup plug-in: %m"); return (-1); } } ! free_structs_v3(session, jname); return (err); } /* * get_backup_size --- 2443,2480 ---- if (!session->ns_data.dd_abort) { ndmpd_audit_backup(session->ns_connection, nlp->nlp_backup_path, session->ns_data.dd_data_addr.addr_type, session->ns_tape.td_adapter_name, result); ! syslog(LOG_DEBUG, "Backing up \"%s\" Finished.", ! NLP_ISCHKPNTED(nlp) ? ! nlp->nlp_mountpoint : nlp->nlp_backup_path); } } if (session->ns_data.dd_abort) { ndmpd_audit_backup(session->ns_connection, nlp->nlp_backup_path, session->ns_data.dd_data_addr.addr_type, session->ns_tape.td_adapter_name, EINTR); ! syslog(LOG_INFO, "Backing up \"%s\" aborted.", ! NLP_ISCHKPNTED(nlp) ? ! nlp->nlp_mountpoint : nlp->nlp_backup_path); err = -1; } else { backup_out: /* Plug-in module */ if (ndmp_pl != NULL && ndmp_pl->np_post_backup != NULL && ndmp_pl->np_post_backup(ndmp_pl, &nctx, err) == -1) { ! syslog(LOG_ERR, "Post-backup plug-in: %m"); return (-1); } } ! free_structs_v3(session); return (err); } /* * get_backup_size
*** 2511,2550 **** * * Find the estimate of backup size. This is used to get an estimate * of the progress of backup during NDMP backup. */ void ! get_backup_size(ndmp_bkup_size_arg_t *sarg) { fs_traverse_t ft; ! u_longlong_t bk_size; char spath[PATH_MAX]; int rv; ! bk_size = 0; ! if (fs_is_chkpntvol(sarg->bs_path)) { ! ft.ft_path = sarg->bs_path; } else { ! (void) tlm_build_snapshot_name(sarg->bs_path, ! spath, sarg->bs_jname); ft.ft_path = spath; } ft.ft_lpath = ft.ft_path; ft.ft_callbk = size_cb; ft.ft_arg = &bk_size; ! ft.ft_logfp = (ft_log_t)ndmp_log; ft.ft_flags = FST_VERBOSE; if ((rv = traverse_level(&ft)) != 0) { ! NDMP_LOG(LOG_DEBUG, "bksize err=%d", rv); bk_size = 0; } else { ! NDMP_LOG(LOG_DEBUG, "bksize %lld, %lldKB, %lldMB\n", ! bk_size, bk_size / 1024, bk_size /(1024 * 1024)); } ! sarg->bs_session->ns_data.dd_data_size = bk_size; } /* * get_rs_path_v3 * --- 2481,2524 ---- * * Find the estimate of backup size. This is used to get an estimate * of the progress of backup during NDMP backup. */ void ! get_backup_size(ndmp_lbr_params_t *nlp) { fs_traverse_t ft; ! u_longlong_t bk_size = 0; ! char buf[256]; char spath[PATH_MAX]; int rv; ! if (NLP_ISCHKPNTED(nlp)) { ! ft.ft_path = nlp->nlp_mountpoint; } else { ! (void) tlm_build_snapshot_name(nlp->nlp_backup_path, ! spath, nlp->nlp_job_name); ft.ft_path = spath; } ft.ft_lpath = ft.ft_path; ft.ft_callbk = size_cb; ft.ft_arg = &bk_size; ! ft.ft_logfp = (ft_log_t)syslog; ft.ft_flags = FST_VERBOSE; if ((rv = traverse_level(&ft)) != 0) { ! syslog(LOG_DEBUG, "bksize err=%d", rv); ! syslog(LOG_DEBUG, "[%s] backup will be reported as [0]\n", ! nlp->nlp_job_name, buf); bk_size = 0; } else { ! (void) zfs_nicenum(bk_size, buf, sizeof (buf)); ! syslog(LOG_DEBUG, "[%s] backup size is [%s]\n", ! nlp->nlp_job_name, buf); } ! ! nlp->nlp_session->ns_data.dd_data_size = bk_size; } /* * get_rs_path_v3 *
*** 2552,2562 **** */ ndmp_error get_rs_path_v3(ndmpd_module_params_t *params, ndmp_lbr_params_t *nlp) { char *dp; ! ndmp_error rv; mem_ndmp_name_v3_t *ep; int i, nm_cnt; char *nm_dpath_list[MULTIPLE_DEST_DIRS]; static char mdest_buf[256]; --- 2526,2536 ---- */ ndmp_error get_rs_path_v3(ndmpd_module_params_t *params, ndmp_lbr_params_t *nlp) { char *dp; ! ndmp_error rv = -1; mem_ndmp_name_v3_t *ep; int i, nm_cnt; char *nm_dpath_list[MULTIPLE_DEST_DIRS]; static char mdest_buf[256];
*** 2563,2573 **** *mdest_buf = 0; *nm_dpath_list = ""; for (i = 0, nm_cnt = 0; i < (int)nlp->nlp_nfiles; i++) { ep = (mem_ndmp_name_v3_t *)MOD_GETNAME(params, i); if (!ep) { ! NDMP_LOG(LOG_DEBUG, "Can't get Nlist[%d]", i); return (NDMP_ILLEGAL_ARGS_ERR); } if (strcmp(nm_dpath_list[nm_cnt], ep->nm3_dpath) != 0 && nm_cnt < MULTIPLE_DEST_DIRS - 1) nm_dpath_list[++nm_cnt] = ep->nm3_dpath; --- 2537,2547 ---- *mdest_buf = 0; *nm_dpath_list = ""; for (i = 0, nm_cnt = 0; i < (int)nlp->nlp_nfiles; i++) { ep = (mem_ndmp_name_v3_t *)MOD_GETNAME(params, i); if (!ep) { ! syslog(LOG_ERR, "Can't get Nlist[%d]", i); return (NDMP_ILLEGAL_ARGS_ERR); } if (strcmp(nm_dpath_list[nm_cnt], ep->nm3_dpath) != 0 && nm_cnt < MULTIPLE_DEST_DIRS - 1) nm_dpath_list[++nm_cnt] = ep->nm3_dpath;
*** 2595,2605 **** " is not writable \"%s\".\n", dp); } else { rv = NDMP_NO_ERR; (void) strlcat(nlp->nlp_restore_path, dp, sizeof (mdest_buf)); ! NDMP_LOG(LOG_DEBUG, "rspath: \"%s\"", dp); } /* * Exit if there is an error or it is not a multiple * destination restore mode --- 2569,2579 ---- " is not writable \"%s\".\n", dp); } else { rv = NDMP_NO_ERR; (void) strlcat(nlp->nlp_restore_path, dp, sizeof (mdest_buf)); ! syslog(LOG_DEBUG, "rspath: \"%s\"", dp); } /* * Exit if there is an error or it is not a multiple * destination restore mode
*** 2765,2780 **** break; } NDMP_FREE(ep->nm3_opath); ep->nm3_opath = cp; ! NDMP_LOG(LOG_DEBUG, "orig[%d]: \"%s\"", i, ep->nm3_opath); if (ep->nm3_dpath) { ! NDMP_LOG(LOG_DEBUG, "dest[%d]: \"%s\"", i, ep->nm3_dpath); } else { ! NDMP_LOG(LOG_DEBUG, "dest[%d]: \"%s\"", i, "NULL"); } } free(buf); --- 2739,2754 ---- break; } NDMP_FREE(ep->nm3_opath); ep->nm3_opath = cp; ! syslog(LOG_DEBUG, "orig[%d]: \"%s\"", i, ep->nm3_opath); if (ep->nm3_dpath) { ! syslog(LOG_DEBUG, "dest[%d]: \"%s\"", i, ep->nm3_dpath); } else { ! syslog(LOG_INFO, "dest[%d]: \"%s\"", i, "NULL"); } } free(buf);
*** 2865,2879 **** { int i, rv; int err; if (!params) { ! NDMP_LOG(LOG_DEBUG, "params == NULL"); return (-1); } if (!nlp) { ! NDMP_LOG(LOG_DEBUG, "nlp == NULL"); return (-1); } if (nlp->nlp_lastidx != -1) { if (!bm_getone(nlp->nlp_rsbm, (u_longlong_t)nlp->nlp_lastidx)) --- 2839,2853 ---- { int i, rv; int err; if (!params) { ! syslog(LOG_ERR, "params == NULL"); return (-1); } if (!nlp) { ! syslog(LOG_ERR, "nlp == NULL"); return (-1); } if (nlp->nlp_lastidx != -1) { if (!bm_getone(nlp->nlp_rsbm, (u_longlong_t)nlp->nlp_lastidx))
*** 2906,2941 **** * It just creates the reader writer IPC. * This function is called for each entry in the restore entry list. * * Parameters: * session (input) - pointer to the session - * jname (input) - Job name * * Returns: * 0: on success * -1: on error */ int ! restore_dar_alloc_structs_v3(ndmpd_session_t *session, char *jname) { long xfer_size; ndmp_lbr_params_t *nlp; tlm_commands_t *cmds; nlp = ndmp_get_nlp(session); if (!nlp) { ! NDMP_LOG(LOG_DEBUG, "nlp == NULL"); return (-1); } cmds = &nlp->nlp_cmds; (void) memset(cmds, 0, sizeof (*cmds)); xfer_size = ndmp_buffer_get_size(session); cmds->tcs_command = tlm_create_reader_writer_ipc(FALSE, xfer_size); if (!cmds->tcs_command) { ! tlm_un_ref_job_stats(jname); return (-1); } return (0); } --- 2880,2914 ---- * It just creates the reader writer IPC. * This function is called for each entry in the restore entry list. * * Parameters: * session (input) - pointer to the session * * Returns: * 0: on success * -1: on error */ int ! restore_dar_alloc_structs_v3(ndmpd_session_t *session) { long xfer_size; ndmp_lbr_params_t *nlp; tlm_commands_t *cmds; nlp = ndmp_get_nlp(session); if (!nlp) { ! syslog(LOG_ERR, "nlp == NULL"); return (-1); } cmds = &nlp->nlp_cmds; (void) memset(cmds, 0, sizeof (*cmds)); xfer_size = ndmp_buffer_get_size(session); cmds->tcs_command = tlm_create_reader_writer_ipc(FALSE, xfer_size); if (!cmds->tcs_command) { ! tlm_un_ref_job_stats(nlp->nlp_job_name); return (-1); } return (0); }
*** 2947,2987 **** * To free the structures were created by restore_dar_alloc_structs_v3. * This funnction is called for each entry in restore entry list. * * Parameters: * session (input) - pointer to the session - * jname (input) - job name * * Returns: * NONE */ /*ARGSUSED*/ static void ! free_dar_structs_v3(ndmpd_session_t *session, char *jname) { ndmp_lbr_params_t *nlp; tlm_commands_t *cmds; nlp = ndmp_get_nlp(session); if (!nlp) { ! NDMP_LOG(LOG_DEBUG, "nlp == NULL"); return; } cmds = &nlp->nlp_cmds; if (!cmds) { ! NDMP_LOG(LOG_DEBUG, "cmds == NULL"); return; } if (cmds->tcs_command) { if (cmds->tcs_command->tc_buffers != NULL) tlm_release_reader_writer_ipc(cmds->tcs_command); else ! NDMP_LOG(LOG_DEBUG, "BUFFERS == NULL"); cmds->tcs_command = NULL; } else ! NDMP_LOG(LOG_DEBUG, "COMMAND == NULL"); } /* * ndmp_dar_tar_init_v3 --- 2920,2959 ---- * To free the structures were created by restore_dar_alloc_structs_v3. * This funnction is called for each entry in restore entry list. * * Parameters: * session (input) - pointer to the session * * Returns: * NONE */ /*ARGSUSED*/ static void ! free_dar_structs_v3(ndmpd_session_t *session) { ndmp_lbr_params_t *nlp; tlm_commands_t *cmds; nlp = ndmp_get_nlp(session); if (!nlp) { ! syslog(LOG_DEBUG, "nlp == NULL"); return; } cmds = &nlp->nlp_cmds; if (!cmds) { ! syslog(LOG_DEBUG, "cmds == NULL"); return; } if (cmds->tcs_command) { if (cmds->tcs_command->tc_buffers != NULL) tlm_release_reader_writer_ipc(cmds->tcs_command); else ! syslog(LOG_DEBUG, "BUFFERS == NULL"); cmds->tcs_command = NULL; } else ! syslog(LOG_DEBUG, "COMMAND == NULL"); } /* * ndmp_dar_tar_init_v3
*** 3006,3027 **** jname = ndmp_malloc(TLM_MAX_BACKUP_JOB_NAME); if (!jname) return (NULL); ! (void) ndmp_new_job_name(jname); if (!nlp) { free(jname); ! NDMP_LOG(LOG_DEBUG, "nlp == NULL"); return (NULL); } nlp->nlp_jstat = tlm_new_job_stats(jname); if (!nlp->nlp_jstat) { free(jname); ! NDMP_LOG(LOG_DEBUG, "Creating job stats"); return (NULL); } nlp->nlp_jstat->js_start_ltime = time(NULL); nlp->nlp_jstat->js_start_time = nlp->nlp_jstat->js_start_ltime; --- 2978,3002 ---- jname = ndmp_malloc(TLM_MAX_BACKUP_JOB_NAME); if (!jname) return (NULL); ! if (ndmp_new_job_name(jname, TLM_MAX_BACKUP_JOB_NAME) <= 0) { ! free(jname); ! return (NULL); ! } if (!nlp) { free(jname); ! syslog(LOG_DEBUG, "nlp == NULL"); return (NULL); } nlp->nlp_jstat = tlm_new_job_stats(jname); if (!nlp->nlp_jstat) { free(jname); ! syslog(LOG_DEBUG, "Creating job stats"); return (NULL); } nlp->nlp_jstat->js_start_ltime = time(NULL); nlp->nlp_jstat->js_start_time = nlp->nlp_jstat->js_start_ltime;
*** 3035,3055 **** } nlp->nlp_jstat->js_callbacks = (void *)(nlp->nlp_logcallbacks); nlp->nlp_rsbm = bm_alloc(nlp->nlp_nfiles, 0); if (nlp->nlp_rsbm < 0) { ! NDMP_LOG(LOG_ERR, "Out of memory."); lbrlog_callbacks_done(nlp->nlp_logcallbacks); tlm_un_ref_job_stats(jname); free(jname); return (NULL); } /* this is used in ndmpd_path_restored_v3() */ nlp->nlp_lastidx = -1; ! NDMP_LOG(LOG_DEBUG, "Restoring from %s tape(s).", ndmp_data_get_mover_mode(session)); return (jname); } --- 3010,3030 ---- } nlp->nlp_jstat->js_callbacks = (void *)(nlp->nlp_logcallbacks); nlp->nlp_rsbm = bm_alloc(nlp->nlp_nfiles, 0); if (nlp->nlp_rsbm < 0) { ! syslog(LOG_ERR, "Out of memory."); lbrlog_callbacks_done(nlp->nlp_logcallbacks); tlm_un_ref_job_stats(jname); free(jname); return (NULL); } /* this is used in ndmpd_path_restored_v3() */ nlp->nlp_lastidx = -1; ! syslog(LOG_DEBUG, "Restoring from %s tape(s).", ndmp_data_get_mover_mode(session)); return (jname); }
*** 3073,3083 **** ndmpd_module_params_t *params, ndmp_lbr_params_t *nlp, char *jname) { int err = 0; ! NDMP_LOG(LOG_DEBUG, "lastidx %d", nlp->nlp_lastidx); /* nothing restored. */ (void) send_unrecovered_list_v3(params, nlp); if (nlp->nlp_jstat) { --- 3048,3058 ---- ndmpd_module_params_t *params, ndmp_lbr_params_t *nlp, char *jname) { int err = 0; ! syslog(LOG_DEBUG, "lastidx %d", nlp->nlp_lastidx); /* nothing restored. */ (void) send_unrecovered_list_v3(params, nlp); if (nlp->nlp_jstat) {
*** 3084,3116 **** nlp->nlp_bytes_total = (u_longlong_t)nlp->nlp_jstat->js_bytes_total; tlm_un_ref_job_stats(jname); nlp->nlp_jstat = NULL; } else { ! NDMP_LOG(LOG_DEBUG, "JSTAT == NULL"); } if (nlp->nlp_logcallbacks) { lbrlog_callbacks_done(nlp->nlp_logcallbacks); nlp->nlp_logcallbacks = NULL; } else { ! NDMP_LOG(LOG_DEBUG, "FH CALLBACKS == NULL"); } if (session->ns_data.dd_abort) { ! NDMP_LOG(LOG_DEBUG, "Restoring to \"%s\" aborted.", (nlp->nlp_restore_path) ? nlp->nlp_restore_path : "NULL"); err = EINTR; } else { ! NDMP_LOG(LOG_DEBUG, "Restoring to \"%s\" finished. (%d)", (nlp->nlp_restore_path) ? nlp->nlp_restore_path : "NULL", err); } if (session->ns_data.dd_operation == NDMP_DATA_OP_RECOVER) { if (nlp->nlp_rsbm < 0) { ! NDMP_LOG(LOG_DEBUG, "nlp_rsbm < 0 %d", nlp->nlp_rsbm); } else { (void) bm_free(nlp->nlp_rsbm); nlp->nlp_rsbm = -1; } } --- 3059,3091 ---- nlp->nlp_bytes_total = (u_longlong_t)nlp->nlp_jstat->js_bytes_total; tlm_un_ref_job_stats(jname); nlp->nlp_jstat = NULL; } else { ! syslog(LOG_DEBUG, "JSTAT == NULL"); } if (nlp->nlp_logcallbacks) { lbrlog_callbacks_done(nlp->nlp_logcallbacks); nlp->nlp_logcallbacks = NULL; } else { ! syslog(LOG_DEBUG, "FH CALLBACKS == NULL"); } if (session->ns_data.dd_abort) { ! syslog(LOG_DEBUG, "Restoring to \"%s\" aborted.", (nlp->nlp_restore_path) ? nlp->nlp_restore_path : "NULL"); err = EINTR; } else { ! syslog(LOG_DEBUG, "Restoring to \"%s\" finished. (%d)", (nlp->nlp_restore_path) ? nlp->nlp_restore_path : "NULL", err); } if (session->ns_data.dd_operation == NDMP_DATA_OP_RECOVER) { if (nlp->nlp_rsbm < 0) { ! syslog(LOG_DEBUG, "nlp_rsbm < 0 %d", nlp->nlp_rsbm); } else { (void) bm_free(nlp->nlp_rsbm); nlp->nlp_rsbm = -1; } }
*** 3132,3151 **** * * Parameters: * session (input) - pointer to the session * params (input) - pointer to the parameters structure * nlp (input) - pointer to the nlp structure - * jname (input) - job name * dar_index(input) - Index of this entry in the restore list * * Returns: * 0: on success * -1: on error */ static int ndmpd_dar_tar_v3(ndmpd_session_t *session, ndmpd_module_params_t *params, ! ndmp_lbr_params_t *nlp, char *jname, int dar_index) { char *excl; char **sels; int flags; int err; --- 3107,3125 ---- * * Parameters: * session (input) - pointer to the session * params (input) - pointer to the parameters structure * nlp (input) - pointer to the nlp structure * dar_index(input) - Index of this entry in the restore list * * Returns: * 0: on success * -1: on error */ static int ndmpd_dar_tar_v3(ndmpd_session_t *session, ndmpd_module_params_t *params, ! ndmp_lbr_params_t *nlp, int dar_index) { char *excl; char **sels; int flags; int err;
*** 3161,3176 **** /* * We have to allocate and deallocate buffers every time we * run the restore, for we need to flush the buffers. */ ! if (restore_dar_alloc_structs_v3(session, jname) < 0) return (-1); sels = setupsels(session, params, nlp, dar_index); if (!sels) { ! free_dar_structs_v3(session, jname); return (-1); } excl = NULL; flags = RSFLG_OVR_ALWAYS; rn.rn_nlp = nlp; --- 3135,3150 ---- /* * We have to allocate and deallocate buffers every time we * run the restore, for we need to flush the buffers. */ ! if (restore_dar_alloc_structs_v3(session) < 0) return (-1); sels = setupsels(session, params, nlp, dar_index); if (!sels) { ! free_dar_structs_v3(session); return (-1); } excl = NULL; flags = RSFLG_OVR_ALWAYS; rn.rn_nlp = nlp;
*** 3189,3199 **** err = pthread_create(&rdtp, NULL, (funct_t)ndmp_tar_reader, (void *)&arg); if (err == 0) { tlm_cmd_wait(cmds->tcs_command, TLM_TAR_READER); } else { ! NDMP_LOG(LOG_DEBUG, "launch ndmp_tar_reader: %m"); return (-1); } cmds->tcs_command->tc_ref++; cmds->tcs_writer_count++; --- 3163,3173 ---- err = pthread_create(&rdtp, NULL, (funct_t)ndmp_tar_reader, (void *)&arg); if (err == 0) { tlm_cmd_wait(cmds->tcs_command, TLM_TAR_READER); } else { ! syslog(LOG_ERR, "launch ndmp_tar_reader failed"); return (-1); } cmds->tcs_command->tc_ref++; cmds->tcs_writer_count++;
*** 3209,3219 **** dar_index - 1); if ((err = ndmp_pl->np_pre_restore(ndmp_pl, &nctx, ep->nm3_opath, ep->nm3_dpath)) != 0) { ! NDMP_LOG(LOG_ERR, "Pre-restore plug-in: %m"); ndmp_stop_local_reader(session, cmds); ndmp_wait_for_reader(cmds); (void) pthread_join(rdtp, NULL); ndmp_stop_remote_reader(session); goto restore_out; --- 3183,3193 ---- dar_index - 1); if ((err = ndmp_pl->np_pre_restore(ndmp_pl, &nctx, ep->nm3_opath, ep->nm3_dpath)) != 0) { ! syslog(LOG_ERR, "Pre-restore plug-in: %m"); ndmp_stop_local_reader(session, cmds); ndmp_wait_for_reader(cmds); (void) pthread_join(rdtp, NULL); ndmp_stop_remote_reader(session); goto restore_out;
*** 3223,3233 **** if (tm_tar_ops.tm_getdir != NULL) { char errbuf[256]; err = (tm_tar_ops.tm_getdir)(cmds, cmds->tcs_command, nlp->nlp_jstat, &rn, 1, 1, sels, &excl, flags, ! dar_index, nlp->nlp_backup_path, session->hardlink_q); /* * If the fatal error from tm_getdir looks like an * errno code, we send the error description to DMA. */ --- 3197,3207 ---- if (tm_tar_ops.tm_getdir != NULL) { char errbuf[256]; err = (tm_tar_ops.tm_getdir)(cmds, cmds->tcs_command, nlp->nlp_jstat, &rn, 1, 1, sels, &excl, flags, ! dar_index, nlp->nlp_mountpoint, session->hardlink_q); /* * If the fatal error from tm_getdir looks like an * errno code, we send the error description to DMA. */
*** 3239,3249 **** } } cmds->tcs_writer_count--; cmds->tcs_command->tc_ref--; ! NDMP_LOG(LOG_DEBUG, "stop local reader."); ndmp_stop_local_reader(session, cmds); ndmp_wait_for_reader(cmds); (void) pthread_join(rdtp, NULL); --- 3213,3223 ---- } } cmds->tcs_writer_count--; cmds->tcs_command->tc_ref--; ! syslog(LOG_DEBUG, "stop local reader."); ndmp_stop_local_reader(session, cmds); ndmp_wait_for_reader(cmds); (void) pthread_join(rdtp, NULL);
*** 3251,3261 **** * If this is the last DAR entry and it is a three-way * restore then we should close the connection. */ if ((data_addr_type == NDMP_ADDR_TCP) && (dar_index == (int)session->ns_data.dd_nlist_len)) { ! NDMP_LOG(LOG_DEBUG, "stop remote reader."); ndmp_stop_remote_reader(session); } /* exit as if there was an internal error */ if (session->ns_eof) --- 3225,3235 ---- * If this is the last DAR entry and it is a three-way * restore then we should close the connection. */ if ((data_addr_type == NDMP_ADDR_TCP) && (dar_index == (int)session->ns_data.dd_nlist_len)) { ! syslog(LOG_DEBUG, "stop remote reader."); ndmp_stop_remote_reader(session); } /* exit as if there was an internal error */ if (session->ns_eof)
*** 3263,3280 **** restore_out: /* Plug-in module */ if (ndmp_pl != NULL && ndmp_pl->np_post_restore != NULL && ndmp_pl->np_post_restore(ndmp_pl, &nctx, err) == -1) { ! NDMP_LOG(LOG_DEBUG, "Post-restore plug-in: %m"); err = -1; } } NDMP_FREE(sels); ! free_dar_structs_v3(session, jname); return (err); } /* --- 3237,3254 ---- restore_out: /* Plug-in module */ if (ndmp_pl != NULL && ndmp_pl->np_post_restore != NULL && ndmp_pl->np_post_restore(ndmp_pl, &nctx, err) == -1) { ! syslog(LOG_DEBUG, "Post-restore plug-in: %m"); err = -1; } } NDMP_FREE(sels); ! free_dar_structs_v3(session); return (err); } /*
*** 3302,3316 **** for (; ; ) { ret = (*params->mp_seek_func)(session, fh_info, len); ! NDMP_LOG(LOG_DEBUG, "ret %d", ret); if (ret == 0) /* Seek was done successfully */ break; else if (ret < 0) { ! NDMP_LOG(LOG_DEBUG, "Seek error"); break; } /* * DMA moved to a new window. --- 3276,3291 ---- for (; ; ) { ret = (*params->mp_seek_func)(session, fh_info, len); ! syslog(LOG_DEBUG, "ret %d", ret); if (ret == 0) /* Seek was done successfully */ break; else if (ret < 0) { ! syslog(LOG_ERR, ! "Seek error in ndmpd_dar_locate_window_v3"); break; } /* * DMA moved to a new window.
*** 3367,3380 **** len = tlm_tarhdr_size(); for (i = 0; i < n; ++i) { ep = (mem_ndmp_name_v3_t *)MOD_GETNAME(params, i); if (!ep) { ! NDMP_LOG(LOG_DEBUG, "ep NULL, i %d", i); continue; } ! NDMP_LOG(LOG_DEBUG, "restoring opath %s, dpath %s, fh_info %lld", ep->nm3_opath ? ep->nm3_opath : "NULL", ep->nm3_dpath ? ep->nm3_dpath : "NULL", ep->nm3_fh_info); --- 3342,3355 ---- len = tlm_tarhdr_size(); for (i = 0; i < n; ++i) { ep = (mem_ndmp_name_v3_t *)MOD_GETNAME(params, i); if (!ep) { ! syslog(LOG_DEBUG, "ep NULL, i %d", i); continue; } ! syslog(LOG_DEBUG, "restoring opath %s, dpath %s, fh_info %lld", ep->nm3_opath ? ep->nm3_opath : "NULL", ep->nm3_dpath ? ep->nm3_dpath : "NULL", ep->nm3_fh_info);
*** 3389,3408 **** break; /* * We are inside the target window. * for each restore we will use one entry as selection list */ ! if ((ret = ndmpd_dar_tar_v3(session, params, nlp, jname, i+1)) != 0) result = EIO; ndmpd_audit_restore(session->ns_connection, ep->nm3_opath ? ep->nm3_opath : "NULL", session->ns_data.dd_data_addr.addr_type, session->ns_tape.td_adapter_name, result); } ! NDMP_LOG(LOG_DEBUG, "End of restore list"); (void) ndmpd_dar_tar_end_v3(session, params, nlp, jname); return (ret); } --- 3364,3383 ---- break; /* * We are inside the target window. * for each restore we will use one entry as selection list */ ! if ((ret = ndmpd_dar_tar_v3(session, params, nlp, i+1)) != 0) result = EIO; ndmpd_audit_restore(session->ns_connection, ep->nm3_opath ? ep->nm3_opath : "NULL", session->ns_data.dd_data_addr.addr_type, session->ns_tape.td_adapter_name, result); } ! syslog(LOG_DEBUG, "End of restore list"); (void) ndmpd_dar_tar_end_v3(session, params, nlp, jname); return (ret); }
*** 3456,3466 **** if (!(pbuf = ndmp_malloc(TLM_MAX_PATH_NAME))) return (NULL); if ((rv = realpath(bkpath, pbuf)) == NULL) { ! NDMP_LOG(LOG_DEBUG, "Invalid path [%s] err=%d", bkpath, errno); } return (rv); } --- 3431,3441 ---- if (!(pbuf = ndmp_malloc(TLM_MAX_PATH_NAME))) return (NULL); if ((rv = realpath(bkpath, pbuf)) == NULL) { ! syslog(LOG_ERR, "Invalid path [%s] err=%d", bkpath, errno); } return (rv); }
*** 3504,3514 **** */ static int ndmpd_rs_sar_tar_v3(ndmpd_session_t *session, ndmpd_module_params_t *params, ndmp_lbr_params_t *nlp) { - char jname[TLM_MAX_BACKUP_JOB_NAME]; char *excl; char **sels; int flags; int err; tlm_commands_t *cmds; --- 3479,3488 ----
*** 3517,3533 **** pthread_t rdtp; int result; ndmp_context_t nctx; result = err = 0; - (void) ndmp_new_job_name(jname); - if (restore_alloc_structs_v3(session, jname) < 0) - return (-1); sels = setupsels(session, params, nlp, 0); if (!sels) { ! free_structs_v3(session, jname); return (-1); } excl = NULL; flags = RSFLG_OVR_ALWAYS; rn.rn_nlp = nlp; --- 3491,3507 ---- pthread_t rdtp; int result; ndmp_context_t nctx; result = err = 0; + if (restore_alloc_structs_v3(session) < 0) { + return (-1); + } sels = setupsels(session, params, nlp, 0); if (!sels) { ! free_structs_v3(session); return (-1); } excl = NULL; flags = RSFLG_OVR_ALWAYS; rn.rn_nlp = nlp;
*** 3540,3550 **** cmds = &nlp->nlp_cmds; cmds->tcs_reader = cmds->tcs_writer = TLM_RESTORE_RUN; cmds->tcs_command->tc_reader = TLM_RESTORE_RUN; cmds->tcs_command->tc_writer = TLM_RESTORE_RUN; ! NDMP_LOG(LOG_DEBUG, "Restoring to \"%s\" started.", (nlp->nlp_restore_path) ? nlp->nlp_restore_path : "NULL"); arg.tr_session = session; arg.tr_mod_params = params; arg.tr_cmds = cmds; --- 3514,3524 ---- cmds = &nlp->nlp_cmds; cmds->tcs_reader = cmds->tcs_writer = TLM_RESTORE_RUN; cmds->tcs_command->tc_reader = TLM_RESTORE_RUN; cmds->tcs_command->tc_writer = TLM_RESTORE_RUN; ! syslog(LOG_DEBUG, "Restoring to \"%s\" started.", (nlp->nlp_restore_path) ? nlp->nlp_restore_path : "NULL"); arg.tr_session = session; arg.tr_mod_params = params; arg.tr_cmds = cmds;
*** 3551,3569 **** err = pthread_create(&rdtp, NULL, (funct_t)ndmp_tar_reader, (void *)&arg); if (err == 0) { tlm_cmd_wait(cmds->tcs_command, TLM_TAR_READER); } else { ! NDMP_LOG(LOG_DEBUG, "Launch ndmp_tar_reader: %m"); ! free_structs_v3(session, jname); return (-1); } if (!ndmp_check_utf8magic(cmds->tcs_command)) { ! NDMP_LOG(LOG_DEBUG, "UTF8Magic not found!"); } else { ! NDMP_LOG(LOG_DEBUG, "UTF8Magic found"); } /* Plug-in module */ if (ndmp_pl != NULL && ndmp_pl->np_pre_restore != NULL) { --- 3525,3543 ---- err = pthread_create(&rdtp, NULL, (funct_t)ndmp_tar_reader, (void *)&arg); if (err == 0) { tlm_cmd_wait(cmds->tcs_command, TLM_TAR_READER); } else { ! syslog(LOG_ERR, "Launch ndmp_tar_reader failed"); ! free_structs_v3(session); return (-1); } if (!ndmp_check_utf8magic(cmds->tcs_command)) { ! syslog(LOG_DEBUG, "UTF8Magic not found!"); } else { ! syslog(LOG_DEBUG, "UTF8Magic found"); } /* Plug-in module */ if (ndmp_pl != NULL && ndmp_pl->np_pre_restore != NULL) {
*** 3572,3582 **** nctx.nc_params = params; nctx.nc_ddata = (void *) session; if ((err = ndmp_plugin_pre_restore(&nctx, params, nlp->nlp_nfiles)) != 0) { ! NDMP_LOG(LOG_ERR, "Pre-restore plug-in: %m"); ndmp_stop_local_reader(session, cmds); ndmp_wait_for_reader(cmds); (void) pthread_join(rdtp, NULL); ndmp_stop_remote_reader(session); goto restore_out; --- 3546,3556 ---- nctx.nc_params = params; nctx.nc_ddata = (void *) session; if ((err = ndmp_plugin_pre_restore(&nctx, params, nlp->nlp_nfiles)) != 0) { ! syslog(LOG_ERR, "Pre-restore plug-in: %m"); ndmp_stop_local_reader(session, cmds); ndmp_wait_for_reader(cmds); (void) pthread_join(rdtp, NULL); ndmp_stop_remote_reader(session); goto restore_out;
*** 3589,3599 **** if (tm_tar_ops.tm_getdir != NULL) { char errbuf[256]; err = (tm_tar_ops.tm_getdir)(cmds, cmds->tcs_command, nlp->nlp_jstat, &rn, 1, 1, sels, &excl, flags, 0, ! nlp->nlp_backup_path, session->hardlink_q); /* * If the fatal error from tm_getdir looks like an * errno code, we send the error description to DMA. */ if (err > 0 && strerror_r(err, errbuf, --- 3563,3573 ---- if (tm_tar_ops.tm_getdir != NULL) { char errbuf[256]; err = (tm_tar_ops.tm_getdir)(cmds, cmds->tcs_command, nlp->nlp_jstat, &rn, 1, 1, sels, &excl, flags, 0, ! nlp->nlp_mountpoint, session->hardlink_q); /* * If the fatal error from tm_getdir looks like an * errno code, we send the error description to DMA. */ if (err > 0 && strerror_r(err, errbuf,
*** 3624,3643 **** result = EIO; } (void) send_unrecovered_list_v3(params, nlp); /* nothing restored. */ if (session->ns_data.dd_abort) { ! NDMP_LOG(LOG_DEBUG, "Restoring to \"%s\" aborted.", (nlp->nlp_restore_path) ? nlp->nlp_restore_path : "NULL"); result = EINTR; ndmpd_audit_restore(session->ns_connection, nlp->nlp_restore_path, session->ns_data.dd_data_addr.addr_type, session->ns_tape.td_adapter_name, result); err = -1; } else { ! NDMP_LOG(LOG_DEBUG, "Restoring to \"%s\" finished. (%d)", (nlp->nlp_restore_path) ? nlp->nlp_restore_path : "NULL", err); ndmpd_audit_restore(session->ns_connection, nlp->nlp_restore_path, session->ns_data.dd_data_addr.addr_type, --- 3598,3617 ---- result = EIO; } (void) send_unrecovered_list_v3(params, nlp); /* nothing restored. */ if (session->ns_data.dd_abort) { ! syslog(LOG_DEBUG, "Restoring to \"%s\" aborted.", (nlp->nlp_restore_path) ? nlp->nlp_restore_path : "NULL"); result = EINTR; ndmpd_audit_restore(session->ns_connection, nlp->nlp_restore_path, session->ns_data.dd_data_addr.addr_type, session->ns_tape.td_adapter_name, result); err = -1; } else { ! syslog(LOG_DEBUG, "Restoring to \"%s\" finished. (%d)", (nlp->nlp_restore_path) ? nlp->nlp_restore_path : "NULL", err); ndmpd_audit_restore(session->ns_connection, nlp->nlp_restore_path, session->ns_data.dd_data_addr.addr_type,
*** 3646,3662 **** restore_out: /* Plug-in module */ if (ndmp_pl != NULL && ndmp_pl->np_post_restore != NULL && ndmp_pl->np_post_restore(ndmp_pl, &nctx, err) == -1) { ! NDMP_LOG(LOG_DEBUG, "Post-restore plug-in: %m"); err = -1; } } NDMP_FREE(sels); ! free_structs_v3(session, jname); return (err); } --- 3620,3636 ---- restore_out: /* Plug-in module */ if (ndmp_pl != NULL && ndmp_pl->np_post_restore != NULL && ndmp_pl->np_post_restore(ndmp_pl, &nctx, err) == -1) { ! syslog(LOG_DEBUG, "Post-restore plug-in: %m"); err = -1; } } NDMP_FREE(sels); ! free_structs_v3(session); return (err); }
*** 3692,3729 **** } else { if (!(nlp->nlp_backup_path = get_backup_path_v3(params)) || !is_valid_backup_dir_v3(params, nlp->nlp_backup_path)) return (NDMP_ILLEGAL_ARGS_ERR); } - nlp->nlp_backup_path = get_absolute_path(nlp->nlp_backup_path); if (!nlp->nlp_backup_path) return (NDMP_ILLEGAL_ARGS_ERR); ! if (fs_is_chkpntvol(nlp->nlp_backup_path) || ! fs_is_rdonly(nlp->nlp_backup_path) || ! !fs_is_chkpnt_enabled(nlp->nlp_backup_path)) ! NLP_SET(nlp, NLPF_CHKPNTED_PATH); ! else NLP_UNSET(nlp, NLPF_CHKPNTED_PATH); /* Should the st_ctime be ignored when backing up? */ if (ndmp_ignore_ctime) { ! NDMP_LOG(LOG_DEBUG, "ignoring st_ctime"); NLP_SET(nlp, NLPF_IGNCTIME); } else { NLP_UNSET(nlp, NLPF_IGNCTIME); } if (ndmp_include_lmtime == TRUE) { ! NDMP_LOG(LOG_DEBUG, "including st_lmtime"); NLP_SET(nlp, NLPF_INCLMTIME); } else { NLP_UNSET(nlp, NLPF_INCLMTIME); } ! NDMP_LOG(LOG_DEBUG, "flags %x", nlp->nlp_flags); get_hist_env_v3(params, nlp); get_exc_env_v3(params, nlp); get_inc_env_v3(params, nlp); get_direct_env_v3(params, nlp); --- 3666,3731 ---- } else { if (!(nlp->nlp_backup_path = get_backup_path_v3(params)) || !is_valid_backup_dir_v3(params, nlp->nlp_backup_path)) return (NDMP_ILLEGAL_ARGS_ERR); } nlp->nlp_backup_path = get_absolute_path(nlp->nlp_backup_path); if (!nlp->nlp_backup_path) return (NDMP_ILLEGAL_ARGS_ERR); ! /* ! * Assume volume is not checkpointed unless found to be below ! */ NLP_UNSET(nlp, NLPF_CHKPNTED_PATH); + /* + * Get the zfs volume name from the backup path and store in + * nlp_vol. + */ + if (get_zfsvolname(nlp->nlp_vol, + sizeof (nlp->nlp_vol), nlp->nlp_backup_path) == -1) { + syslog(LOG_ERR, + "Cannot get volume from [%s] on create", + nlp->nlp_backup_path); + NDMP_FREE(nlp->nlp_params); + return (-1); + } + + /* + * Find out if this data is already checkpointed via. an AutoSync + * or HPR snapshot. If it is, set the flag, and extract the snapshot + * name to use as the nlp_job_name otherwise use the normal + * 'NdmpBackup-nnnn' format. + */ + if (fs_is_checkpointed(nlp) && + (ndmp_autosync_support || ndmp_hpr_support)) { + NLP_SET(nlp, NLPF_CHKPNTED_PATH); + syslog(LOG_DEBUG, ">>>> Checkpointed dataset found <<<<"); + } + + (void) ndmp_new_job_name(nlp->nlp_job_name, + sizeof (nlp->nlp_job_name)); + + syslog(LOG_DEBUG, "New backup job name [%s]", + nlp->nlp_job_name); + /* Should the st_ctime be ignored when backing up? */ if (ndmp_ignore_ctime) { ! syslog(LOG_DEBUG, "ignoring st_ctime"); NLP_SET(nlp, NLPF_IGNCTIME); } else { NLP_UNSET(nlp, NLPF_IGNCTIME); } if (ndmp_include_lmtime == TRUE) { ! syslog(LOG_DEBUG, "including st_lmtime"); NLP_SET(nlp, NLPF_INCLMTIME); } else { NLP_UNSET(nlp, NLPF_INCLMTIME); } ! syslog(LOG_DEBUG, "flags %x", nlp->nlp_flags); get_hist_env_v3(params, nlp); get_exc_env_v3(params, nlp); get_inc_env_v3(params, nlp); get_direct_env_v3(params, nlp);
*** 3751,3806 **** { ndmpd_module_params_t *params = arg; int err; ndmpd_session_t *session; ndmp_lbr_params_t *nlp; - char jname[TLM_MAX_BACKUP_JOB_NAME]; - ndmp_bkup_size_arg_t sarg; - pthread_t tid; session = (ndmpd_session_t *)(params->mp_daemon_cookie); *(params->mp_module_cookie) = nlp = ndmp_get_nlp(session); ndmp_session_ref(session); - (void) ndmp_new_job_name(jname); err = 0; ! if (!NLP_ISCHKPNTED(nlp) && ! ndmp_create_snapshot(nlp->nlp_backup_path, jname) < 0) { MOD_LOGV3(params, NDMP_LOG_ERROR, "Creating checkpoint on \"%s\".\n", nlp->nlp_backup_path); err = -1; } ! NDMP_LOG(LOG_DEBUG, "err %d, chkpnted %c", ! err, NDMP_YORN(NLP_ISCHKPNTED(nlp))); if (err == 0) { - sarg.bs_session = session; - sarg.bs_jname = jname; - sarg.bs_path = nlp->nlp_backup_path; - /* Get an estimate of the data size */ ! if (pthread_create(&tid, NULL, (funct_t)get_backup_size, ! (void *)&sarg) == 0) ! (void) pthread_detach(tid); ! err = ndmp_get_cur_bk_time(nlp, &nlp->nlp_cdate, jname); if (err != 0) { ! NDMP_LOG(LOG_DEBUG, "err %d", err); } else { log_bk_params_v3(session, params, nlp); ! err = tar_backup_v3(session, params, nlp, jname); } } ! if (!NLP_ISCHKPNTED(nlp)) ! (void) ndmp_remove_snapshot(nlp->nlp_backup_path, jname); - NDMP_LOG(LOG_DEBUG, "err %d, update %c", - err, NDMP_YORN(NLP_SHOULD_UPDATE(nlp))); - if (err == 0) save_backup_date_v3(params, nlp); MOD_DONE(params, err); --- 3753,3795 ---- { ndmpd_module_params_t *params = arg; int err; ndmpd_session_t *session; ndmp_lbr_params_t *nlp; session = (ndmpd_session_t *)(params->mp_daemon_cookie); *(params->mp_module_cookie) = nlp = ndmp_get_nlp(session); ndmp_session_ref(session); + pthread_cleanup_push(backup_dataset_destroy, nlp); + err = 0; ! if (backup_dataset_create(nlp) < 0) { MOD_LOGV3(params, NDMP_LOG_ERROR, "Creating checkpoint on \"%s\".\n", nlp->nlp_backup_path); err = -1; } ! syslog(LOG_DEBUG, "BACKUP STARTED [%s]", nlp->nlp_snapname); if (err == 0) { /* Get an estimate of the data size */ ! (void) get_backup_size(nlp); ! err = ndmp_get_cur_bk_time(nlp, &nlp->nlp_cdate); if (err != 0) { ! syslog(LOG_ERR, ! "Failed to get current backup time %d", err); } else { log_bk_params_v3(session, params, nlp); ! err = tar_backup_v3(session, params, nlp); } } ! pthread_cleanup_pop(B_TRUE); if (err == 0) save_backup_date_v3(params, nlp); MOD_DONE(params, err);
*** 3808,3819 **** NDMP_FREE(nlp->nlp_params); NDMP_FREE(nlp->nlp_backup_path); NS_DEC(nbk); ndmp_session_unref(session); return (err); - } /* * ndmpd_tar_backup_abort_v3 --- 3797,3809 ---- NDMP_FREE(nlp->nlp_params); NDMP_FREE(nlp->nlp_backup_path); NS_DEC(nbk); ndmp_session_unref(session); + syslog(LOG_DEBUG, "BACKUP COMPLETE [%s] (as jobname %s)", + nlp->nlp_snapname, nlp->nlp_job_name); return (err); } /* * ndmpd_tar_backup_abort_v3
*** 3866,3893 **** { ndmp_error rv; ndmp_lbr_params_t *nlp; if (!(nlp = ndmp_get_nlp(session))) { ! NDMP_LOG(LOG_DEBUG, "nlp is NULL"); rv = NDMP_ILLEGAL_ARGS_ERR; } else if (!(nlp->nlp_backup_path = get_backup_path_v3(params))) rv = NDMP_ILLEGAL_ARGS_ERR; else if ((nlp->nlp_nfiles = session->ns_data.dd_nlist_len) == 0) { ! NDMP_LOG(LOG_DEBUG, "nfiles: %d", nlp->nlp_nfiles); rv = NDMP_ILLEGAL_ARGS_ERR; } else if (get_rs_path_v3(params, nlp) != NDMP_NO_ERR) { rv = NDMP_ILLEGAL_ARGS_ERR; } else if ((rv = fix_nlist_v3(session, params, nlp)) != NDMP_NO_ERR) { ! NDMP_LOG(LOG_DEBUG, "fix_nlist_v3: %d", rv); } else { rv = NDMP_NO_ERR; get_direct_env_v3(params, nlp); if (NLP_ISSET(nlp, NLPF_DIRECT)) { if (NLP_ISSET(nlp, NLPF_RECURSIVE)) { /* Currently we dont support DAR on directory */ ! NDMP_LOG(LOG_DEBUG, "Can't have RECURSIVE and DIRECT together"); rv = NDMP_ILLEGAL_ARGS_ERR; return (rv); } --- 3856,3883 ---- { ndmp_error rv; ndmp_lbr_params_t *nlp; if (!(nlp = ndmp_get_nlp(session))) { ! syslog(LOG_DEBUG, "nlp is NULL"); rv = NDMP_ILLEGAL_ARGS_ERR; } else if (!(nlp->nlp_backup_path = get_backup_path_v3(params))) rv = NDMP_ILLEGAL_ARGS_ERR; else if ((nlp->nlp_nfiles = session->ns_data.dd_nlist_len) == 0) { ! syslog(LOG_DEBUG, "nfiles: %d", nlp->nlp_nfiles); rv = NDMP_ILLEGAL_ARGS_ERR; } else if (get_rs_path_v3(params, nlp) != NDMP_NO_ERR) { rv = NDMP_ILLEGAL_ARGS_ERR; } else if ((rv = fix_nlist_v3(session, params, nlp)) != NDMP_NO_ERR) { ! syslog(LOG_DEBUG, "fix_nlist_v3: %d", rv); } else { rv = NDMP_NO_ERR; get_direct_env_v3(params, nlp); if (NLP_ISSET(nlp, NLPF_DIRECT)) { if (NLP_ISSET(nlp, NLPF_RECURSIVE)) { /* Currently we dont support DAR on directory */ ! syslog(LOG_DEBUG, "Can't have RECURSIVE and DIRECT together"); rv = NDMP_ILLEGAL_ARGS_ERR; return (rv); }