X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Futils%2Fliblustreapi_fid.c;h=578c6e6c797f055cfa6bc23ee55064de43f5117c;hb=0ab950762cdec28636b6033c50a2e563c28ba954;hp=3ef7ff9713e7ac157d86f0d19c17526f76900923;hpb=7ff384eee1945440d5cc9a0658750fa3276fba6a;p=fs%2Flustre-release.git diff --git a/lustre/utils/liblustreapi_fid.c b/lustre/utils/liblustreapi_fid.c index 3ef7ff9..578c6e6 100644 --- a/lustre/utils/liblustreapi_fid.c +++ b/lustre/utils/liblustreapi_fid.c @@ -160,100 +160,71 @@ out: return rc; } -/* Print mdtname 'name' into 'buf' using 'format'. Add -MDT0000 if needed. - * format must have %s%s, buf must be > 16 - * Eg: if name = "lustre-MDT0000", "lustre", or "lustre-MDT0000_UUID" - * then buf = "lustre-MDT0000" - */ -static int get_mdtname(char *name, char *format, char *buf) +int llapi_fid2path_at(int mnt_fd, const struct lu_fid *fid, + char *path_buf, int path_buf_size, + long long *recno, int *linkno) { - char suffix[] = "-MDT0000"; - int len = strlen(name); + struct getinfo_fid2path *gf = NULL; + int rc; - if (len > 5 && strncmp(name + len - 5, "_UUID", 5) == 0) { - name[len - 5] = '\0'; - len -= 5; + gf = calloc(1, sizeof(*gf) + path_buf_size); + if (gf == NULL) { + rc = -ENOMEM; + goto out; } - if (len > 8) { - if ((len <= 16) && strncmp(name + len - 8, "-MDT", 4) == 0) { - suffix[0] = '\0'; - } else { - /* Not enough room to add suffix */ - llapi_err_noerrno(LLAPI_MSG_ERROR, - "Invalid MDT name |%s|", name); - return -EINVAL; - } - } + gf->gf_fid = *fid; + if (recno != NULL) + gf->gf_recno = *recno; - return sprintf(buf, format, name, suffix); -} + if (linkno != NULL) + gf->gf_linkno = *linkno; -/** ioctl on filsystem root, with mdtindex sent as data - * \param mdtname path, fsname, or mdtname (lutre-MDT0004) - * \param mdtidxp pointer to integer within data to be filled in with the - * mdt index (0 if no mdt is specified). NULL won't be filled. - */ -int root_ioctl(const char *mdtname, int opc, void *data, int *mdtidxp, - int want_error) -{ - char fsname[20]; - char *ptr; - int fd, rc; - long index; + gf->gf_pathlen = path_buf_size; - /* Take path, fsname, or MDTname. Assume MDT0000 in former cases. - * Open root and parse mdt index. - */ - if (mdtname[0] == '/') { - index = 0; - rc = get_root_path(WANT_FD | want_error, NULL, &fd, - (char *)mdtname, -1); - } else { - if (get_mdtname((char *)mdtname, "%s%s", fsname) < 0) - return -EINVAL; - ptr = fsname + strlen(fsname) - 8; - *ptr = '\0'; - index = strtol(ptr + 4, NULL, 16); - rc = get_root_path(WANT_FD | want_error, fsname, &fd, NULL, -1); - } - if (rc < 0) { - if (want_error) - llapi_err_noerrno(LLAPI_MSG_ERROR, - "Can't open %s: %d\n", mdtname, rc); - return rc; + rc = ioctl(mnt_fd, OBD_IOC_FID2PATH, gf); + if (rc) { + rc = -errno; + goto out; } - if (mdtidxp) - *mdtidxp = index; + rc = copy_strip_dne_path(gf->gf_u.gf_path, path_buf, path_buf_size); + + if (recno != NULL) + *recno = gf->gf_recno; + + if (linkno != NULL) + *linkno = gf->gf_linkno; +out: + free(gf); - rc = ioctl(fd, opc, data); - if (rc == -1) - rc = -errno; - else - rc = 0; - close(fd); return rc; } -int llapi_fid2path(const char *device, const char *fidstr, char *path, +int llapi_fid2path(const char *path_or_device, const char *fidstr, char *path, int pathlen, long long *recno, int *linkno) { struct lu_fid fid; - struct getinfo_fid2path *gf; + int mnt_fd = -1; int rc; - if (!path || pathlen <= 1) { + if (path_or_device == NULL || *path_or_device == '\0') { rc = -EINVAL; goto out; } - rc = llapi_fid_parse(fidstr, &fid, NULL); - if (!rc && !fid_is_sane(&fid)) { - rc = -EINVAL; + if (*path_or_device == '/') + rc = get_root_path(WANT_FD, NULL, &mnt_fd, + (char *)path_or_device, -1); + else + rc = get_root_path(WANT_FD, (char *)path_or_device, + &mnt_fd, NULL, -1); + + if (rc < 0) goto out; - } - if (rc) { + + rc = llapi_fid_parse(fidstr, &fid, NULL); + if (rc < 0) { llapi_err_noerrno(LLAPI_MSG_ERROR, "bad FID format '%s', should be [seq:oid:ver] (e.g. "DFID")\n", fidstr, @@ -261,35 +232,11 @@ int llapi_fid2path(const char *device, const char *fidstr, char *path, goto out; } - gf = malloc(sizeof(*gf) + pathlen); - if (gf == NULL) { - rc = -ENOMEM; - goto out; - } - - gf->gf_fid = fid; - if (recno) - gf->gf_recno = *recno; - if (linkno) - gf->gf_linkno = *linkno; - gf->gf_pathlen = pathlen; - - /* Take path or fsname */ - rc = root_ioctl(device, OBD_IOC_FID2PATH, gf, NULL, 0); - if (rc) - goto out_free; - - rc = copy_strip_dne_path(gf->gf_u.gf_path, path, pathlen); - - if (recno) - *recno = gf->gf_recno; - if (linkno) - *linkno = gf->gf_linkno; - -out_free: - free(gf); + rc = llapi_fid2path_at(mnt_fd, &fid, path, pathlen, recno, linkno); out: - errno = -rc; + if (!(mnt_fd < 0)) + close(mnt_fd); + return rc; }