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);
                          }