X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Futils%2Fliblustreapi_util.c;h=e8af531c7ffb1051d197bee2ef56634e7a23fb85;hb=HEAD;hp=ad69d930fea17b06f15ffb216c5c69bf36850091;hpb=b59835f8b6c81befee23c5c3c0fafb63e98fbc0c;p=fs%2Flustre-release.git diff --git a/lustre/utils/liblustreapi_util.c b/lustre/utils/liblustreapi_util.c index ad69d93..ceab7a4 100644 --- a/lustre/utils/liblustreapi_util.c +++ b/lustre/utils/liblustreapi_util.c @@ -161,16 +161,15 @@ int llapi_get_version_string(char *version, unsigned int version_size) */ int llapi_get_version(char *buffer, int buffer_size, char **version) { - int rc; -#if LUSTRE_VERSION_CODE > OBD_OCD_VERSION(2, 8, 53, 0) static bool printed; + int rc; + if (!printed) { fprintf(stderr, "%s deprecated, use llapi_get_version_string()\n", __func__); printed = true; } -#endif rc = llapi_get_version_string(buffer, buffer_size); /* keep old return style for this legacy function */ @@ -288,34 +287,74 @@ int llapi_search_ost(const char *fsname, const char *poolname, return llapi_search_tgt(fsname, poolname, ostname, false); } +/** + * Return the open fd for a given device/path provided + * + * \param device[in] buffer holding device or path string + * \param rootfd[out] file descriptor after successful opening of + * of above path or device + * + * \retval 0 on success + * \retval -ve on failure + */ +int llapi_root_path_open(const char *device, int *rootfd) +{ + int tmp_fd, rc; + + if (*device == '/') + rc = get_root_path(WANT_FD, NULL, &tmp_fd, + (char *)device, -1, NULL, NULL); + else + rc = get_root_path(WANT_FD, (char *)device, &tmp_fd, + NULL, -1, NULL, NULL); + + if (!rc) + *rootfd = dup(tmp_fd); + + return rc; +} + +/** + * Call IOCTL to remove file by fid. The fd must be valid and fa + * (fid_array) struct must allready be populated. + * + * \param fd[in] valid descriptor of device/path + * \param fa[in] fid_array struct holding fids + * + * \retval 0 on success + * \retval -ve/errno on failure + */ +int llapi_rmfid_at(int fd, struct fid_array *fa) +{ + return ioctl(fd, LL_IOC_RMFID, fa) ? -errno : 0; +} + int llapi_rmfid(const char *path, struct fid_array *fa) { - char rootpath[PATH_MAX]; - int fd, rc; + int rootfd, rc; -retry_open: - fd = open(path, O_RDONLY | O_NONBLOCK | O_NOFOLLOW); - if (fd < 0) { - if (errno == ENOENT && path != rootpath) { - rc = llapi_search_rootpath(rootpath, path); - if (!rc) { - path = rootpath; - goto retry_open; - } - } else { - return -errno; - } + rc = llapi_root_path_open(path, &rootfd); + if (rc < 0) { + fprintf(stderr, + "lfs rmfid: error opening device/fsname '%s': %s\n", + path, strerror(-rc)); + return -rc; } - rc = ioctl(fd, LL_IOC_RMFID, fa); - close(fd); + rc = llapi_rmfid_at(rootfd, fa); + close(rootfd); + if (rc < 0) { + fprintf(stderr, "lfs rmfid: cannot remove FIDs: %s\n", + strerror(-rc)); + return rc; + } return rc ? -errno : 0; } int llapi_direntry_remove(char *dname) { -#ifdef HAVE_IOC_REMOVE_ENTRY +#ifdef LL_IOC_REMOVE_ENTRY char *dirpath = NULL; char *namepath = NULL; char *dir; @@ -324,10 +363,15 @@ int llapi_direntry_remove(char *dname) int rc = 0; dirpath = strdup(dname); - namepath = strdup(dname); - if (!dirpath || !namepath) + if (!dirpath) return -ENOMEM; + namepath = strdup(dname); + if (!namepath) { + rc = -ENOMEM; + goto out_dirpath; + } + filename = basename(namepath); dir = dirname(dirpath); @@ -345,13 +389,13 @@ int llapi_direntry_remove(char *dname) "error on ioctl %#lx for '%s' (%d)", (long)LL_IOC_LMV_SETSTRIPE, filename, fd); out: - free(dirpath); + close(fd); free(namepath); - if (fd != -1) - close(fd); +out_dirpath: + free(dirpath); return rc; #else - return -ENOTSUP; + return -EOPNOTSUPP; #endif }