Whamcloud - gitweb
b=24175 avoid reporting 'No such file or directory' error
[fs/lustre-release.git] / lustre / utils / liblustreapi.c
index d61cfa2..7f2e769 100644 (file)
@@ -592,7 +592,7 @@ int llapi_search_mounts(const char *pathname, int index, char *mntdir,
 {
         int want = WANT_PATH, idx = -1;
 
-        if (!pathname) {
+        if (!pathname || pathname[0] == '\0') {
                 want |= WANT_INDEX;
                 idx = index;
         } else
@@ -606,19 +606,42 @@ int llapi_search_mounts(const char *pathname, int index, char *mntdir,
 /* Given a path, find the corresponding Lustre fsname */
 int llapi_search_fsname(const char *pathname, char *fsname)
 {
-        char *path = (char*)pathname, buf[PATH_MAX + 1];
+        char *path;
+        int rc;
 
-        if (pathname[0] != '/') { /* Need a absolute path */
-                memset(buf, '\0', sizeof(buf));
-                if (realpath(pathname, buf) == NULL) {
-                        llapi_err(LLAPI_MSG_ERROR, "pathname '%s' cannot expand",
-                                  pathname);
-                        return -EINVAL;
+        path = realpath(pathname, NULL);
+        if (path == NULL) {
+                char buf[PATH_MAX + 1], *ptr;
+
+                buf[0] = 0;
+                if (pathname[0] != '/') {
+                        /* Need an absolute path, but realpath() only works for
+                         * pathnames that actually exist.  We go through the
+                         * extra hurdle of dirname(getcwd() + pathname) in
+                         * case the relative pathname contains ".." in it. */
+                        if (getcwd(buf, sizeof(buf) - 1) == NULL)
+                                return -errno;
+                        strcat(buf, "/");
+                }
+                strncat(buf, pathname, sizeof(buf) - strlen(buf));
+                path = realpath(buf, NULL);
+                if (path == NULL) {
+                        ptr = strrchr(buf, '/');
+                        if (ptr == NULL)
+                                return -ENOENT;
+                        *ptr = '\0';
+                        path = realpath(buf, NULL);
+                        if (path == NULL) {
+                                llapi_err(LLAPI_MSG_ERROR,
+                                          "pathname '%s' cannot expand",
+                                          pathname);
+                                return -errno;
+                        }
                 }
-                path = buf;
         }
-        return get_root_path(WANT_FSNAME | WANT_ERROR, fsname, NULL,
-                             path, -1);
+        rc = get_root_path(WANT_FSNAME | WANT_ERROR, fsname, NULL, path, -1);
+        free(path);
+        return rc;
 }
 
 /* return the first file matching this pattern */
@@ -1402,8 +1425,14 @@ static void lov_dump_user_lmm_header(struct lov_user_md *lum, char *path,
                 if (verbose & ~VERBOSE_COUNT)
                         llapi_printf(LLAPI_MSG_NORMAL, "%sstripe_count:   ",
                                      prefix);
-                llapi_printf(LLAPI_MSG_NORMAL, "%hd%c",
-                             (__s16)lum->lmm_stripe_count, nl);
+                if (is_dir)
+                        llapi_printf(LLAPI_MSG_NORMAL, "%d%c",
+                                     lum->lmm_stripe_count ==
+                                     (typeof(lum->lmm_stripe_count))(-1) ? -1 :
+                                     lum->lmm_stripe_count, nl);
+                else
+                        llapi_printf(LLAPI_MSG_NORMAL, "%hd%c",
+                                     (__s16)lum->lmm_stripe_count, nl);
         }
 
         if (verbose & VERBOSE_SIZE) {
@@ -1434,8 +1463,10 @@ static void lov_dump_user_lmm_header(struct lov_user_md *lum, char *path,
         }
 
         if ((verbose & VERBOSE_POOL) && (pool_name != NULL)) {
-                llapi_printf(LLAPI_MSG_NORMAL, "pool: %s", pool_name);
-                is_dir = 1;
+                if (verbose & ~VERBOSE_POOL)
+                        llapi_printf(LLAPI_MSG_NORMAL, "%spool:           ",
+                                     prefix);
+                llapi_printf(LLAPI_MSG_NORMAL, "%s%c", pool_name, nl);
         }
 
         if (is_dir && (verbose != VERBOSE_OBJID))
@@ -2803,6 +2834,10 @@ static int root_ioctl(const char *mdtname, int opc, void *data, int *mdtidxp,
                 *mdtidxp = index;
 
         rc = ioctl(fd, opc, data);
+        if (rc == -1)
+                rc = -errno;
+        else
+                rc = 0;
         if (rc && want_error)
                 llapi_err(LLAPI_MSG_ERROR, "ioctl %d err %d", opc, rc);
 
@@ -2996,10 +3031,9 @@ int llapi_changelog_clear(const char *mdtname, const char *idstr,
 int llapi_fid2path(const char *device, const char *fidstr, char *buf,
                    int buflen, long long *recno, int *linkno)
 {
-        char path[PATH_MAX];
         struct lu_fid fid;
         struct getinfo_fid2path *gf;
-        int fd, rc;
+        int rc;
 
         while (*fidstr == '[')
                 fidstr++;
@@ -3012,28 +3046,19 @@ int llapi_fid2path(const char *device, const char *fidstr, char *buf,
                 return -EINVAL;
         }
 
-        /* Take path or fsname */
-        if (device[0] == '/') {
-                strcpy(path, device);
-        } else {
-                rc = get_root_path(WANT_PATH | WANT_ERROR, (char *)device,
-                                   NULL, path, -1);
-                if (rc < 0)
-                        return rc;
-        }
-        sprintf(path, "%s/%s/fid/%s", path, dot_lustre_name, fidstr);
-        fd = open(path, O_RDONLY | O_NONBLOCK);
-        if (fd < 0)
-                return -errno;
-
         gf = malloc(sizeof(*gf) + buflen);
+        if (gf == NULL)
+                return -ENOMEM;
         gf->gf_fid = fid;
         gf->gf_recno = *recno;
         gf->gf_linkno = *linkno;
         gf->gf_pathlen = buflen;
-        rc = ioctl(fd, OBD_IOC_FID2PATH, gf);
+
+        /* Take path or fsname */
+        rc = root_ioctl(device, OBD_IOC_FID2PATH, gf, NULL, 0);
         if (rc) {
-                llapi_err(LLAPI_MSG_ERROR, "ioctl err %d", rc);
+                if (rc != -ENOENT)
+                        llapi_err(LLAPI_MSG_ERROR, "ioctl err %d", rc);
         } else {
                 memcpy(buf, gf->gf_path, gf->gf_pathlen);
                 *recno = gf->gf_recno;
@@ -3041,7 +3066,6 @@ int llapi_fid2path(const char *device, const char *fidstr, char *buf,
         }
 
         free(gf);
-        close(fd);
         return rc;
 }