Whamcloud - gitweb
git://git.whamcloud.com
/
fs
/
lustre-release.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
| inline |
side by side
b=24175 avoid reporting 'No such file or directory' error
[fs/lustre-release.git]
/
lustre
/
utils
/
liblustreapi.c
diff --git
a/lustre/utils/liblustreapi.c
b/lustre/utils/liblustreapi.c
index
d61cfa2
..
7f2e769
100644
(file)
--- a/
lustre/utils/liblustreapi.c
+++ b/
lustre/utils/liblustreapi.c
@@
-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;
}