Print this page
NEX-1348 It takes 23 hours and 37 minutes to run NDMP backup 43.9 GB with10000000 3KB files
Reviewed by: Roman Strashkin <roman.strashkin@nexenta.com>
Reviewed by: Evan Layton <evan.layton@nexenta.com>
Reviewed by: Sanjay Nadkarni <sanjay.nadkarni@nexenta.com>
NEX-13094 Netbackup 8.0 failed to back up files in NDMP certification test
Reviewed by: Alex Deiter <alex.deiter@nexenta.com>
Reviewed by: Evan Layton <evan.layton@nexenta.com>
Reviewed by: Yuri Pankov <yuri.pankov@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-2947 Volumes with more than a small fixed about don't traverse properly
NEX-2911 NDMP logging should use syslog and is too chatty
NEX-2692 ndmpd intermittently dumps core due to SIGABRT in umem
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.

@@ -33,10 +33,12 @@
  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  * POSSIBILITY OF SUCH DAMAGE.
  */
+/* Copyright 2017 Nexenta Systems, Inc. All rights reserved. */
+
 /*
  * This file implemets the post-order, pre-order and level-order
  * traversing of the file system.  The related macros and constants
  * are defined in traverse.h.
  */

@@ -78,11 +80,10 @@
 /*
  * Macros on fs_traverse flags.
  */
 #define STOP_ONERR(f)   ((f)->ft_flags & FST_STOP_ONERR)
 #define STOP_ONLONG(f)  ((f)->ft_flags & FST_STOP_ONLONG)
-#define VERBOSE(f)      ((f)->ft_flags & FST_VERBOSE)
 
 #define CALLBACK(pp, ep)        \
         (*(ftp)->ft_callbk)((ftp)->ft_arg, pp, ep)
 
 #define NEGATE(rv)      ((rv) = -(rv))

@@ -102,34 +103,10 @@
         long ts_dpos; /* position in the directory when reading its entries */
         fs_fhandle_t ts_fh;
         struct stat64 ts_st;
 } traverse_state_t;
 
-/*
- * Statistics gathering structure.
- */
-typedef struct traverse_statistics {
-        ulong_t fss_newdirs;
-        ulong_t fss_readdir_err;
-        ulong_t fss_longpath_err;
-        ulong_t fss_lookup_err;
-        ulong_t fss_nondir_calls;
-        ulong_t fss_dir_calls;
-        ulong_t fss_nondir_skipped;
-        ulong_t fss_dir_skipped;
-        ulong_t fss_pushes;
-        ulong_t fss_pops;
-        ulong_t fss_stack_residue;
-} traverse_statistics_t;
-
-/*
- * Global instance of statistics variable.
- */
-traverse_statistics_t traverse_stats;
-
-#define MAX_DENT_BUF_SIZE       (8 * 1024)
-
 typedef struct {
         struct stat64 fd_attr;
         fs_fhandle_t fd_fh;
         short fd_len;
         char fd_name[1];

@@ -140,45 +117,13 @@
         int da_end;
         int da_size;
 } dent_arg_t;
 
 static int traverse_level_nondir(struct fs_traverse *ftp,
-    traverse_state_t *tsp, struct fst_node *pnp,
-    dent_arg_t *darg);
+    traverse_state_t *tsp, struct fst_node *pnp);
 
 /*
- * Gather some directory entry information and return them
- */
-static int
-fs_populate_dents(void *arg, int namelen,
-    char *name, long *countp, struct stat64 *attr,
-    fs_fhandle_t *fh)
-{
-        dent_arg_t *darg = (dent_arg_t *)arg;
-        int reclen = sizeof (fs_dent_info_t) + namelen;
-        fs_dent_info_t *dent;
-
-        if ((darg->da_end + reclen) > darg->da_size)
-                return (-1);
-
-        /* LINTED improper alignment */
-        dent = (fs_dent_info_t *)(darg->da_buf + darg->da_end);
-
-        dent->fd_attr = *attr;
-        dent->fd_fh = *fh;
-        (void) strcpy(dent->fd_name, name);
-
-        dent->fd_len = reclen;
-        darg->da_end += reclen;
-
-        if (countp)
-                (*countp)++;
-
-        return (0);
-}
-
-/*
  * Creates a new traversing state based on the path passed to it.
  */
 static traverse_state_t *
 new_tsp(char *path)
 {

@@ -200,12 +145,15 @@
  * Create a file handle and get stats for the given path
  */
 int
 fs_getstat(char *path, fs_fhandle_t *fh, struct stat64 *st)
 {
-        if (lstat64(path, st) == -1)
+        if (lstat64(path, st) == -1) {
+                syslog(LOG_INFO,
+                    "lstat64() says [%s] not found errno=(%d)", path, errno);
                 return (errno);
+        }
 
         fh->fh_fid = st->st_ino;
 
         if (!S_ISDIR(st->st_mode))
                 fh->fh_fpath = NULL;

@@ -213,74 +161,10 @@
                 fh->fh_fpath = strdup(path);
         return (0);
 }
 
 /*
- * Get directory entries info and return in the buffer. Cookie
- * will keep the state of each call
- */
-static int
-fs_getdents(int fildes, struct dirent *buf, size_t *nbyte,
-    char *pn_path, long *dpos, longlong_t *cookie,
-    long *n_entries, dent_arg_t *darg)
-{
-        struct dirent *ptr;
-        char file_path[PATH_MAX + 1];
-        fs_fhandle_t fh;
-        struct stat64 st;
-        char *p;
-        int len;
-        int rv;
-
-        if (*nbyte == 0) {
-                (void) memset((char *)buf, 0, MAX_DENT_BUF_SIZE);
-                *nbyte = rv = getdents(fildes, buf, darg->da_size);
-                *cookie = 0LL;
-
-                if (rv <= 0)
-                        return (rv);
-        }
-
-        p = (char *)buf + *cookie;
-        len = *nbyte;
-        do {
-                /* LINTED improper alignment */
-                ptr = (struct dirent *)p;
-                *dpos =  ptr->d_off;
-
-                if (rootfs_dot_or_dotdot(ptr->d_name))
-                        goto skip_entry;
-
-                (void) snprintf(file_path, PATH_MAX, "%s/", pn_path);
-                (void) strlcat(file_path, ptr->d_name, PATH_MAX + 1);
-                (void) memset(&fh, 0, sizeof (fs_fhandle_t));
-
-                if (lstat64(file_path, &st) != 0) {
-                        rv = -1;
-                        break;
-                }
-
-                fh.fh_fid = st.st_ino;
-
-                if (S_ISDIR(st.st_mode))
-                        goto skip_entry;
-
-                if (fs_populate_dents(darg, strlen(ptr->d_name),
-                    (char *)ptr->d_name, n_entries, &st, &fh) != 0)
-                        break;
-
-skip_entry:
-                p = p + ptr->d_reclen;
-                len -= ptr->d_reclen;
-        } while (len);
-
-        *cookie = (longlong_t)(p - (char *)buf);
-        *nbyte = len;
-        return (rv);
-}
-
-/*
  * Read the directory entries and return the information about
  * each entry
  */
 int
 fs_readdir(fs_fhandle_t *ts_fh, char *path, long *dpos,

@@ -336,40 +220,39 @@
         struct stat64 pst, est;
         traverse_state_t *tsp;
         struct fst_node pn, en; /* parent and entry nodes */
 
         if (!ftp || !ftp->ft_path || !*ftp->ft_path || !ftp->ft_callbk) {
-                NDMP_LOG(LOG_DEBUG, "Invalid argument");
                 errno = EINVAL;
                 return (-1);
         }
 
         /* set the default log function if it's not already set */
         if (!ftp->ft_logfp) {
                 ftp->ft_logfp = (ft_log_t)syslog;
-                NDMP_LOG(LOG_DEBUG, "Log to system log \"%s\"", ftp->ft_path);
+                syslog(LOG_DEBUG, "Log to system log \"%s\"", ftp->ft_path);
         }
 
         /* set the logical path to physical path if it's not already set */
         if (!ftp->ft_lpath) {
-                NDMP_LOG(LOG_DEBUG,
+                syslog(LOG_DEBUG,
                     "report the same paths: \"%s\"", ftp->ft_path);
                 ftp->ft_lpath = ftp->ft_path;
         }
 
         pl = strlen(ftp->ft_lpath);
         if (pl + 1 > PATH_MAX) { /* +1 for the '/' */
-                NDMP_LOG(LOG_DEBUG, "lpath too long \"%s\"", ftp->ft_path);
+                syslog(LOG_ERR, "lpath too long \"%s\"", ftp->ft_path);
                 errno = ENAMETOOLONG;
                 return (-1);
         }
         (void) strcpy(path, ftp->ft_lpath);
         (void) memset(&pfh, 0, sizeof (pfh));
         rv = fs_getstat(ftp->ft_lpath, &pfh, &pst);
 
         if (rv != 0) {
-                NDMP_LOG(LOG_DEBUG,
+                syslog(LOG_ERR,
                     "Error %d on fs_getstat(%s)", rv, ftp->ft_path);
                 return (rv);
         }
 
         if (!S_ISDIR(pst.st_mode)) {

@@ -378,12 +261,10 @@
                 pn.tn_st = &pst;
                 en.tn_path = NULL;
                 en.tn_fh = NULL;
                 en.tn_st = NULL;
                 rv = CALLBACK(&pn, &en);
-                if (VERBOSE(ftp))
-                        NDMP_LOG(LOG_DEBUG, "CALLBACK(%s): %d", pn.tn_path, rv);
                 free(pfh.fh_fpath);
                 return (rv);
         }
 
         sp = cstack_new();

@@ -408,15 +289,11 @@
 
         rv = 0;
         next_dir = 1;
         do {
                 if (next_dir) {
-                        traverse_stats.fss_newdirs++;
-
                         *tsp->ts_end = '\0';
-                        if (VERBOSE(ftp))
-                                NDMP_LOG(LOG_DEBUG, "pl %d \"%s\"", pl, path);
                 }
 
                 next_dir = 0;
                 do {
                         el = NAME_MAX;

@@ -423,14 +300,11 @@
                         rv = fs_readdir(&tsp->ts_fh, pn.tn_path,
                             &tsp->ts_dpos, nm, &el,
                             &efh, &est);
 
                         if (rv != 0) {
-                                free(efh.fh_fpath);
-                                traverse_stats.fss_readdir_err++;
-
-                                NDMP_LOG(LOG_DEBUG,
+                                syslog(LOG_ERR,
                                     "Error %d on readdir(%s) pos %d",
                                     rv, path, tsp->ts_dpos);
                                 if (STOP_ONERR(ftp))
                                         break;
                                 rv = SKIP_ENTRY;

@@ -438,30 +312,21 @@
                                 continue;
                         }
 
                         /* done with this directory */
                         if (el == 0) {
-                                if (VERBOSE(ftp))
-                                        NDMP_LOG(LOG_DEBUG,
-                                            "Done(%s)", pn.tn_path);
                                 break;
                         }
                         nm[el] = '\0';
 
                         if (rootfs_dot_or_dotdot(nm)) {
                                 free(efh.fh_fpath);
                                 continue;
                         }
 
-                        if (VERBOSE(ftp))
-                                NDMP_LOG(LOG_DEBUG, "%u dname: \"%s\"",
-                                    tsp->ts_dpos, nm);
-
                         if (pl + 1 + el > PATH_MAX) {
-                                traverse_stats.fss_longpath_err++;
-
-                                NDMP_LOG(LOG_ERR, "Path %s/%s is too long.",
+                                syslog(LOG_ERR, "Path %s/%s is too long.",
                                     path, nm);
                                 if (STOP_ONLONG(ftp))
                                         rv = ENAMETOOLONG;
                                 free(efh.fh_fpath);
                                 continue;

@@ -477,11 +342,10 @@
                                 if (cstack_push(sp, tsp, 0)) {
                                         rv = ENOMEM;
                                         free(efh.fh_fpath);
                                         break;
                                 }
-                                traverse_stats.fss_pushes++;
 
                                 /*
                                  * Concatenate the current entry with the
                                  * current path.  This will be the path of
                                  * the new directory to be scanned.

@@ -516,22 +380,15 @@
                         } else {
                                 /*
                                  * The entry is not a directory so the
                                  * callback function must be called.
                                  */
-                                traverse_stats.fss_nondir_calls++;
-
                                 en.tn_path = nm;
                                 en.tn_fh = &efh;
                                 en.tn_st = &est;
                                 rv = CALLBACK(&pn, &en);
                                 free(efh.fh_fpath);
-                                if (VERBOSE(ftp))
-                                        NDMP_LOG(LOG_DEBUG,
-                                            "CALLBACK(%s/%s): %d",
-                                            pn.tn_path, en.tn_path, rv);
-
                                 if (rv != 0)
                                         break;
                         }
                 } while (rv == 0);
 

@@ -559,28 +416,18 @@
                                 break;
 
                         assert(tsp != NULL);
                         pl = tsp->ts_end - path;
 
-                        if (VERBOSE(ftp))
-                                NDMP_LOG(LOG_DEBUG, "poped pl %d 0x%p \"%s\"",
-                                    pl, tsp, path);
-
-                        traverse_stats.fss_pops++;
-                        traverse_stats.fss_dir_calls++;
-
                         pn.tn_fh = &tsp->ts_fh;
                         pn.tn_st = &tsp->ts_st;
                         en.tn_path = lp + 1;
                         en.tn_fh = &efh;
                         en.tn_st = &est;
 
                         rv = CALLBACK(&pn, &en);
                         free(efh.fh_fpath);
-                        if (VERBOSE(ftp))
-                                NDMP_LOG(LOG_DEBUG, "CALLBACK(%s/%s): %d",
-                                    pn.tn_path, en.tn_path, rv);
                         /*
                          * Does not need to free tsp here.  It will be released
                          * later.
                          */
                 }

@@ -594,28 +441,22 @@
 
         /*
          * For the 'ftp->ft_path' directory itself.
          */
         if (rv == 0) {
-                traverse_stats.fss_dir_calls++;
-
                 pn.tn_fh = &efh;
                 pn.tn_st = &est;
                 en.tn_path = NULL;
                 en.tn_fh = NULL;
                 en.tn_st = NULL;
                 rv = CALLBACK(&pn, &en);
-                if (VERBOSE(ftp))
-                        NDMP_LOG(LOG_DEBUG, "CALLBACK(%s): %d", pn.tn_path, rv);
         }
 
         /*
          * Pop and free all the remaining entries on the stack.
          */
         while (!cstack_pop(sp, (void **)&tsp, (int *)NULL)) {
-                traverse_stats.fss_stack_residue++;
-
                 free(tsp->ts_fh.fh_fpath);
                 free(tsp);
         }
 
         cstack_delete(sp);

@@ -635,107 +476,71 @@
  *    SKIP_ENTRY: Failed to get the directory entries, so the caller
  *        should skip this entry.
  */
 static int
 traverse_level_nondir(struct fs_traverse *ftp,
-    traverse_state_t *tsp, struct fst_node *pnp, dent_arg_t *darg)
+    traverse_state_t *tsp, struct fst_node *pnp)
 {
-        int pl; /* path length */
-        int rv;
+        struct stat64 st;
+        fs_fhandle_t fh;
+        DIR *dp;
+        struct dirent *dirp;
         struct fst_node en; /* entry node */
-        longlong_t cookie_verf;
-        fs_dent_info_t *dent;
-        struct dirent *buf;
-        size_t len = 0;
-        int fd;
+        char path[MAXPATHLEN+MAXNAMELEN+2];
+        int rv = 0;
 
-        rv = 0;
-        pl = strlen(pnp->tn_path);
-
-        buf = ndmp_malloc(MAX_DENT_BUF_SIZE);
-        if (buf == NULL)
+        if ((dp = opendir(tsp->ts_fh.fh_fpath)) == NULL) {
+                syslog(LOG_ERR,
+                    "traverse_level_nondir: open directory "
+                    "%s failed: %m", tsp->ts_fh.fh_fpath);
                 return (errno);
+        }
 
-        fd = open(tsp->ts_fh.fh_fpath, O_RDONLY);
-        if (fd == -1) {
-                free(buf);
-                return (errno);
+        while ((dirp = readdir(dp)) != NULL) {
+                if ((strcmp(dirp->d_name, ".") == 0) ||
+                    (strcmp(dirp->d_name, "..") == 0)) {
+                        continue;
         }
 
-        while (rv == 0) {
-                long i, n_entries;
-
-                darg->da_end = 0;
-                n_entries = 0;
-                rv = fs_getdents(fd, buf, &len, pnp->tn_path, &tsp->ts_dpos,
-                    &cookie_verf, &n_entries, darg);
-                if (rv < 0) {
-                        traverse_stats.fss_readdir_err++;
-
-                        NDMP_LOG(LOG_DEBUG, "Error %d on readdir(%s) pos %d",
-                            rv, pnp->tn_path, tsp->ts_dpos);
-                        if (STOP_ONERR(ftp))
-                                break;
-                        /*
-                         * We cannot read the directory entry, we should
-                         * skip to the next directory.
-                         */
-                        rv = SKIP_ENTRY;
+                if (!tlm_cat_path(path, tsp->ts_fh.fh_fpath,
+                    dirp->d_name)) {
                         continue;
-                } else {
-                        /* Break at the end of directory */
-                        if (rv > 0)
-                                rv = 0;
-                        else
-                                break;
                 }
 
-                /* LINTED imporper alignment */
-                dent = (fs_dent_info_t *)darg->da_buf;
-                /* LINTED imporper alignment */
-                for (i = 0; i < n_entries; i++, dent = (fs_dent_info_t *)
-                    ((char *)dent + dent->fd_len)) {
-
-                        if (VERBOSE(ftp))
-                                NDMP_LOG(LOG_DEBUG, "i %u dname: \"%s\"",
-                                    dent->fd_fh.fh_fid, dent->fd_name);
-
-                        if ((pl + strlen(dent->fd_name)) > PATH_MAX) {
-                                traverse_stats.fss_longpath_err++;
-
-                                NDMP_LOG(LOG_ERR, "Path %s/%s is too long.",
-                                    pnp->tn_path, dent->fd_name);
-                                if (STOP_ONLONG(ftp))
-                                        rv = -ENAMETOOLONG;
-                                free(dent->fd_fh.fh_fpath);
+                if (lstat64(path, &st) != 0) {
+                        syslog(LOG_ERR,
+                            "traverse_level_nondir: failed to get file"
+                            " status for %s skipping: %m", tsp->ts_fh.fh_fpath);
                                 continue;
                         }
+                fh.fh_fid = st.st_ino;
 
                         /*
                          * The entry is not a directory so the callback
                          * function must be called.
                          */
-                        if (!S_ISDIR(dent->fd_attr.st_mode)) {
-                                traverse_stats.fss_nondir_calls++;
-
-                                en.tn_path = dent->fd_name;
-                                en.tn_fh = &dent->fd_fh;
-                                en.tn_st = &dent->fd_attr;
+                if (!S_ISDIR(st.st_mode)) {
+                        en.tn_path = dirp->d_name;
+                        en.tn_fh = &fh;
+                        en.tn_st = &st;
                                 rv = CALLBACK(pnp, &en);
-                                dent->fd_fh.fh_fpath = NULL;
-                                if (rv < 0)
+                        if (rv < 0) {
+                                syslog(LOG_DEBUG,
+                                    "traverse_level_nondir: result is %d "
+                                    "with %s", rv, path);
                                         break;
+                        }
                                 if (rv == FST_SKIP) {
-                                        traverse_stats.fss_nondir_skipped++;
+                                syslog(LOG_DEBUG,
+                                    "traverse_level_nondir: skipping "
+                                    "%s", path);
                                         break;
                                 }
                         }
                 }
-        }
 
-        free(buf);
-        (void) close(fd);
+        (void) closedir(dp);
         return (rv);
 }
 
 /*
  * Traverse the file system in the level-order way.  The description

@@ -753,40 +558,38 @@
         cstack_t *sp;
         fs_fhandle_t pfh, efh;
         struct stat64 pst, est;
         traverse_state_t *tsp;
         struct fst_node pn, en;  /* parent and entry nodes */
-        dent_arg_t darg;
 
         if (!ftp || !ftp->ft_path || !*ftp->ft_path || !ftp->ft_callbk) {
-                NDMP_LOG(LOG_DEBUG, "Invalid argument");
                 errno = EINVAL;
                 return (-1);
         }
         /* set the default log function if it's not already set */
         if (!ftp->ft_logfp) {
                 ftp->ft_logfp = (ft_log_t)syslog;
-                NDMP_LOG(LOG_DEBUG, "Log to system log \"%s\"", ftp->ft_path);
+                syslog(LOG_DEBUG, "Log to system log \"%s\"", ftp->ft_path);
         }
         if (!ftp->ft_lpath) {
-                NDMP_LOG(LOG_DEBUG,
+                syslog(LOG_DEBUG,
                     "report the same paths \"%s\"", ftp->ft_path);
                 ftp->ft_lpath = ftp->ft_path;
         }
 
         pl = strlen(ftp->ft_lpath);
         if (pl + 1 > PATH_MAX) { /* +1 for the '/' */
-                NDMP_LOG(LOG_DEBUG, "lpath too long \"%s\"", ftp->ft_path);
+                syslog(LOG_ERR, "lpath too long \"%s\"", ftp->ft_path);
                 errno = ENAMETOOLONG;
                 return (-1);
         }
         (void) strcpy(path, ftp->ft_lpath);
         (void) memset(&pfh, 0, sizeof (pfh));
         rv = fs_getstat(ftp->ft_lpath, &pfh, &pst);
         if (rv != 0) {
-                NDMP_LOG(LOG_DEBUG,
-                    "Error %d on fs_getstat(%s)", rv, ftp->ft_path);
+                syslog(LOG_DEBUG,
+                    "Error %d on fs_getstat(%s)", rv, ftp->ft_lpath);
                 return (-1);
         }
 
         en.tn_path = NULL;
         en.tn_fh = NULL;

@@ -794,13 +597,10 @@
         if (!S_ISDIR(pst.st_mode)) {
                 pn.tn_path = ftp->ft_lpath;
                 pn.tn_fh = &pfh;
                 pn.tn_st = &pst;
                 rv = CALLBACK(&pn, &en);
-                if (VERBOSE(ftp))
-                        NDMP_LOG(LOG_DEBUG, "CALLBACK(%s): %d", pn.tn_path, rv);
-
                 free(pfh.fh_fpath);
                 return (rv);
         }
 
         sp = cstack_new();

@@ -815,52 +615,35 @@
                 free(pfh.fh_fpath);
                 errno = ENOMEM;
                 return (-1);
         }
 
-        darg.da_buf = ndmp_malloc(MAX_DENT_BUF_SIZE);
-        if (!darg.da_buf) {
-                cstack_delete(sp);
-                free(pfh.fh_fpath);
-                free(tsp);
-                errno = ENOMEM;
-                return (-1);
-        }
-        darg.da_size = MAX_DENT_BUF_SIZE;
-
         tsp->ts_ent = tsp->ts_end;
         tsp->ts_fh = pfh;
         tsp->ts_st = pst;
         pn.tn_path = path;
         pn.tn_fh = &tsp->ts_fh;
         pn.tn_st = &tsp->ts_st;
 
         /* call the callback function on the path itself */
-        traverse_stats.fss_dir_calls++;
         rv = CALLBACK(&pn, &en);
         if (rv < 0) {
                 free(tsp);
                 goto end;
         }
         if (rv == FST_SKIP) {
-                traverse_stats.fss_dir_skipped++;
                 free(tsp);
                 rv = 0;
                 goto end;
         }
 
         rv = 0;
         next_dir = 1;
         do {
                 if (next_dir) {
-                        traverse_stats.fss_newdirs++;
-
                         *tsp->ts_end = '\0';
-                        if (VERBOSE(ftp))
-                                NDMP_LOG(LOG_DEBUG, "pl %d \"%s\"", pl, path);
-
-                        rv = traverse_level_nondir(ftp, tsp, &pn, &darg);
+                        rv = traverse_level_nondir(ftp, tsp, &pn);
                         if (rv < 0) {
                                 NEGATE(rv);
                                 free(tsp->ts_fh.fh_fpath);
                                 free(tsp);
                                 break;

@@ -891,13 +674,11 @@
                         el = NAME_MAX;
                         rv = fs_readdir(&tsp->ts_fh, pn.tn_path,
                             &tsp->ts_dpos, nm, &el, &efh,
                             &est);
                         if (rv != 0) {
-                                traverse_stats.fss_readdir_err++;
-
-                                NDMP_LOG(LOG_DEBUG,
+                                syslog(LOG_DEBUG,
                                     "Error %d on readdir(%s) pos %d",
                                     rv, path, tsp->ts_dpos);
                                 if (STOP_ONERR(ftp))
                                         break;
                                 rv = SKIP_ENTRY;

@@ -913,23 +694,19 @@
                         if (rootfs_dot_or_dotdot(nm)) {
                                 free(efh.fh_fpath);
                                 continue;
                         }
 
-                        if (VERBOSE(ftp))
-                                NDMP_LOG(LOG_DEBUG, "%u dname: \"%s\"",
-                                    tsp->ts_dpos, nm);
-
                         if (pl + 1 + el > PATH_MAX) {
                                 /*
                                  * The long paths were already encountered
                                  * when processing non-dir entries in.
                                  * traverse_level_nondir.
                                  * We don't increase fss_longpath_err
                                  * counter for them again here.
                                  */
-                                NDMP_LOG(LOG_ERR, "Path %s/%s is too long.",
+                                syslog(LOG_ERR, "Path %s/%s is too long.",
                                     path, nm);
                                 if (STOP_ONLONG(ftp))
                                         rv = ENAMETOOLONG;
                                 free(efh.fh_fpath);
                                 continue;

@@ -942,11 +719,10 @@
                          * Call the callback function for the new
                          * directory found, then push the current
                          * directory on to the stack.  Then dive
                          * into the entry found.
                          */
-                        traverse_stats.fss_dir_calls++;
                         en.tn_path = nm;
                         en.tn_fh = &efh;
                         en.tn_st = &est;
                         rv = CALLBACK(&pn, &en);
 

@@ -954,11 +730,10 @@
                                 NEGATE(rv);
                                 free(efh.fh_fpath);
                                 break;
                         }
                         if (rv == FST_SKIP) {
-                                traverse_stats.fss_dir_skipped++;
                                 free(efh.fh_fpath);
                                 rv = 0;
                                 continue;
                         }
 

@@ -967,12 +742,10 @@
                          * dive into the entry found.
                          */
                         if (cstack_push(sp, tsp, 0)) {
                                 rv = ENOMEM;
                         } else {
-                                traverse_stats.fss_pushes++;
-
                                 lp = tsp->ts_end;
                                 *tsp->ts_end = '/';
                                 (void) strcpy(tsp->ts_end + 1, nm);
 
                                 tsp = new_tsp(path);

@@ -1009,16 +782,10 @@
 
                 if (rv == 0) {
                         if (cstack_pop(sp, (void **)&tsp, (int *)NULL))
                                 break;
 
-                        traverse_stats.fss_pops++;
-
-                        if (VERBOSE(ftp))
-                                NDMP_LOG(LOG_DEBUG,
-                                    "Poped pl %d \"%s\"", pl, path);
-
                         *tsp->ts_end = '\0';
                         pl = tsp->ts_end - path;
                         pn.tn_fh = &tsp->ts_fh;
                         pn.tn_st = &tsp->ts_st;
                 }

@@ -1026,17 +793,14 @@
 
         /*
          * Pop and free all the remaining entries on the stack.
          */
         while (!cstack_pop(sp, (void **)&tsp, (int *)NULL)) {
-                traverse_stats.fss_stack_residue++;
-
                 free(tsp->ts_fh.fh_fpath);
                 free(tsp);
         }
 end:
-        free(darg.da_buf);
         cstack_delete(sp);
         return (rv);
 }
 
 /*