Whamcloud - gitweb
LU-4824 utils: lfs find should continue after errors
[fs/lustre-release.git] / lustre / utils / liblustreapi.c
index 56804b8..5247d58 100644 (file)
@@ -1559,8 +1559,8 @@ static int llapi_semantic_traverse(char *path, int size, DIR *parent,
        int len, ret;
        DIR *d, *p = NULL;
 
-        ret = 0;
-        len = strlen(path);
+       ret = 0;
+       len = strlen(path);
 
         d = opendir(path);
         if (!d && errno != ENOTDIR) {
@@ -1580,12 +1580,12 @@ static int llapi_semantic_traverse(char *path, int size, DIR *parent,
        if (sem_init && (ret = sem_init(path, parent ?: p, &d, data, de)))
                goto err;
 
-       if (!d || (param->get_lmv && !param->recursive)) {
-               ret = 0;
+       if (!d || (param->get_lmv && !param->recursive))
                goto out;
-       }
 
        while ((dent = readdir64(d)) != NULL) {
+               int rc;
+
                param->have_fileinfo = 0;
 
                 if (!strcmp(dent->d_name, ".") || !strcmp(dent->d_name, ".."))
@@ -1608,13 +1608,15 @@ static int llapi_semantic_traverse(char *path, int size, DIR *parent,
                 if (dent->d_type == DT_UNKNOWN) {
                        lstat_t *st = &param->lmd->lmd_st;
 
-                       ret = get_lmd_info(path, d, NULL, param->lmd,
+                       rc = get_lmd_info(path, d, NULL, param->lmd,
                                           param->lumlen);
-                       if (ret == 0)
+                       if (rc == 0)
                                dent->d_type = IFTODT(st->st_mode);
+                       else if (ret == 0)
+                               ret = rc;
 
-                        if (ret == -ENOENT)
-                                continue;
+                       if (rc == -ENOENT)
+                               continue;
                }
                 switch (dent->d_type) {
                 case DT_UNKNOWN:
@@ -1622,21 +1624,21 @@ static int llapi_semantic_traverse(char *path, int size, DIR *parent,
                                           "error: %s: '%s' is UNKNOWN type %d",
                                           __func__, dent->d_name, dent->d_type);
                         break;
-                case DT_DIR:
-                        ret = llapi_semantic_traverse(path, size, d, sem_init,
-                                                      sem_fini, data, dent);
-                        if (ret < 0)
-                                goto out;
-                        break;
-                default:
-                        ret = 0;
-                        if (sem_init) {
-                                ret = sem_init(path, d, NULL, data, dent);
-                                if (ret < 0)
-                                        goto out;
-                        }
-                        if (sem_fini && ret == 0)
-                                sem_fini(path, d, NULL, data, dent);
+               case DT_DIR:
+                       rc = llapi_semantic_traverse(path, size, d, sem_init,
+                                                     sem_fini, data, dent);
+                       if (rc != 0 && ret == 0)
+                               ret = rc;
+                       break;
+               default:
+                       rc = 0;
+                       if (sem_init) {
+                               rc = sem_init(path, d, NULL, data, dent);
+                               if (rc < 0 && ret == 0)
+                                       ret = rc;
+                       }
+                       if (sem_fini && rc == 0)
+                               sem_fini(path, d, NULL, data, dent);
                 }
         }
 
@@ -1650,7 +1652,7 @@ err:
                 closedir(d);
         if (p)
                 closedir(p);
-        return ret;
+       return ret;
 }
 
 static int param_callback(char *path, semantic_func_t sem_init,