}
struct find_param {
- int recursive;
- int verbose;
- int quiet;
- struct obd_uuid *obduuid;
- int lumlen;
- struct lov_user_md *lum;
- int got_uuids;
- int obdindex;
- __u32 *obdgens;
+ int recursive;
+ int verbose;
+ int quiet;
+ int showfid;
+ struct obd_uuid *obduuid;
+ int datalen;
+ struct lov_user_md *data;
+ int got_uuids;
+ int obdindex;
+ __u32 *obdgens;
};
/* XXX Max obds per lov currently hardcoded to 1000 in lov/lov_obd.c */
static int prepare_find(struct find_param *param)
{
- param->lumlen = lov_mds_md_size(MAX_LOV_UUID_COUNT);
- if ((param->lum = malloc(param->lumlen)) == NULL) {
- err_msg("unable to allocate %d bytes of memory for ioctl",
- param->lumlen);
- return ENOMEM;
+ if (param->showfid) {
+ param->datalen = PATH_MAX + 1;
+ if ((param->data = malloc(param->datalen)) == NULL) {
+ err_msg("unable to allocate %d bytes of memory for ioctl",
+ param->datalen);
+ return ENOMEM;
+ }
+ } else {
+ param->datalen = lov_mds_md_size(MAX_LOV_UUID_COUNT);
+ if ((param->data = malloc(param->datalen)) == NULL) {
+ err_msg("unable to allocate %d bytes of memory for ioctl",
+ param->datalen);
+ return ENOMEM;
+ }
}
-
param->got_uuids = 0;
param->obdindex = OBD_NOT_FOUND;
-
return 0;
}
{
if (param->obduuid)
free(param->obduuid);
- if (param->lum)
- free(param->lum);
+ if (param->data)
+ free(param->data);
}
-int llapi_lov_get_uuids(int fd, struct obd_uuid *uuidp, __u32 *obdgens,
- int *ost_count)
+int llapi_lov_get_uuids(int fd, struct obd_uuid *uuidp,
+ __u32 *obdgens, int *ost_count)
{
struct obd_ioctl_data data = { 0, };
struct lov_desc desc = { 0, };
{
struct obd_uuid uuids[1024], *uuidp;
__u32 obdgens[1024], *genp;
-
int obdcount = 1024;
int rc, i;
void llapi_lov_dump_user_lmm(struct find_param *param, char *dname, char *fname)
{
- switch(*(__u32 *)param->lum) { /* lum->lmm_magic */
+ switch(*(__u32 *)param->data) { /* lum->lmm_magic */
case LOV_USER_MAGIC_V1:
- lov_dump_user_lmm_v1(param->lum, dname, fname, param->obdindex,
+ lov_dump_user_lmm_v1(param->data, dname, fname, param->obdindex,
param->quiet, param->verbose,
(param->verbose || !param->obduuid));
break;
default:
- printf("unknown lmm_magic: 0x%08X\n", *(__u32 *)param->lum);
+ printf("unknown lmm_magic: 0x%08X\n", *(__u32 *)param->data);
return;
}
}
+void llapi_dump_fid(struct find_param *param, char *dname, char *fname)
+{
+ if (!param->quiet) {
+ int n = 0;
+ char path[PATH_MAX + 1];
+
+ n = snprintf(path, PATH_MAX, "%s/%s",
+ dname, fname);
+
+ if (n > 40)
+ n = 1;
+ else
+ n = 40 - n;
+
+ printf("%s:%*s"DLID4"\n", path, n, "",
+ OLID4((struct lustre_id *)param->data));
+ }
+}
+
int llapi_file_get_stripe(char *path, struct lov_user_md *lum)
{
char *dname, *fname;
return rc;
}
+int llapi_file_get_fid(char *path, void *data)
+{
+ char *dname, *fname;
+ int fd, rc = 0;
+
+ fname = strrchr(path, '/');
+
+ if (fname == NULL) {
+ dname = (char *)malloc(2);
+ if (dname == NULL)
+ return ENOMEM;
+ strcpy(dname, ".");
+ fname = path;
+ } else {
+ dname = (char *)malloc(fname - path + 1);
+ if (dname == NULL)
+ return ENOMEM;
+ strncpy(dname, path, fname - path);
+ dname[fname - path] = '\0';
+ fname++;
+
+ if (!strlen(fname))
+ fname = ".";
+ }
+
+ if ((fd = open(dname, O_RDONLY)) == -1) {
+ free(dname);
+ return errno;
+ }
+
+ strncpy((char *)data, fname, strlen(fname));
+ if (ioctl(fd, IOC_MDC_SHOWFID, (void *)data) == -1) {
+ close(fd);
+ free(dname);
+ return errno;
+ }
+
+ if (close(fd) == -1)
+ rc = errno;
+
+ free(dname);
+ return rc;
+}
+
/* short term backwards compat only */
int op_get_file_stripe(char *path, struct lov_user_md *lum)
{
{
int rc;
- strncpy((char *)param->lum, fname, param->lumlen);
+ if (param->showfid) {
+ char path[PATH_MAX + 1];
- rc = ioctl(dirfd(dir), IOC_MDC_GETSTRIPE, (void *)param->lum);
- if (rc) {
- if (errno == ENODATA) {
- if (!param->obduuid && !param->quiet)
- fprintf(stderr,
- "%s/%s has no stripe info\n",
+ snprintf(path, PATH_MAX, "%s/%s", dname, fname);
+ rc = llapi_file_get_fid(path, (void *)param->data);
+ if (rc) {
+ err_msg("IOC_MDC_SHOWFID ioctl failed");
+ return rc;
+ }
+ llapi_dump_fid(param, dname, fname);
+ } else {
+ strncpy((char *)param->data, fname, param->datalen);
+ rc = ioctl(dirfd(dir), IOC_MDC_GETSTRIPE, (void *)param->data);
+ if (rc) {
+ if (errno == ENODATA) {
+ if (!param->obduuid && !param->quiet)
+ fprintf(stderr,
+ "%s/%s has no stripe info\n",
+ dname, fname);
+ rc = 0;
+ } else if (errno == EISDIR) {
+ fprintf(stderr, "process_file on directory %s/%s!\n",
dname, fname);
- rc = 0;
- } else if (errno == EISDIR) {
- fprintf(stderr, "process_file on directory %s/%s!\n",
- dname, fname);
- /* add fname to directory list; */
- rc = errno;
- } else {
- err_msg("IOC_MDC_GETSTRIPE ioctl failed");
- rc = errno;
+ /* add fname to directory list; */
+ rc = errno;
+ } else {
+ err_msg("IOC_MDC_GETSTRIPE ioctl failed");
+ rc = errno;
+ }
+ return rc;
}
- return rc;
+ llapi_lov_dump_user_lmm(param, dname, fname);
}
-
- llapi_lov_dump_user_lmm(param, dname, fname);
-
return 0;
}
static int process_dir(DIR *dir, char *dname, struct find_param *param)
{
+ char path[PATH_MAX + 1];
struct dirent64 *dirp;
DIR *subdir;
- char path[1024];
int rc;
- if (!param->got_uuids) {
- rc = setup_obd_uuids(dir, dname, param);
- if (rc)
+ /* retrieve dir's stripe info */
+ if (param->showfid) {
+ rc = llapi_file_get_fid(dname, (void *)param->data);
+ if (rc) {
+ err_msg("IOC_MDC_SHOWFID ioctl failed");
return rc;
- }
+ }
+ llapi_dump_fid(param, dname, "");
+ } else {
+ if (!param->got_uuids) {
+ rc = setup_obd_uuids(dir, dname, param);
+ if (rc)
+ return rc;
+ }
- /* retrieve dir's stripe info */
- strncpy((char *)param->lum, dname, param->lumlen);
- rc = ioctl(dirfd(dir), LL_IOC_LOV_GETSTRIPE, (void *)param->lum);
- if (rc) {
- if (errno == ENODATA) {
- if (!param->obduuid && param->verbose)
- printf("%s/%s has no stripe info\n", dname, "");
- rc = 0;
+ strncpy((char *)param->data, dname, param->datalen);
+ rc = ioctl(dirfd(dir), LL_IOC_LOV_GETSTRIPE, (void *)param->data);
+ if (rc) {
+ if (errno == ENODATA) {
+ if (!param->obduuid && param->verbose)
+ printf("%s/%s has no stripe info\n", dname, "");
+ rc = 0;
+ } else {
+ err_msg("IOC_MDC_GETSTRIPE ioctl failed");
+ return errno;
+ }
} else {
- err_msg("IOC_MDC_GETSTRIPE ioctl failed");
- return errno;
+ llapi_lov_dump_user_lmm(param, dname, "");
}
- } else {
- llapi_lov_dump_user_lmm(param, dname, "");
}
/* Handle the contents of the directory */
* know d_type should be valid for lustre and this
* tool only makes sense for lustre filesystems. */
return EINVAL;
- break;
case DT_DIR:
if (!param->recursive)
break;
err_msg("\"%.40s\" opendir failed", dname);
rc = errno;
} else {
- if (!param->got_uuids)
- rc = setup_obd_uuids(dir, dname, param);
+ if (!param->showfid) {
+ if (!param->got_uuids)
+ rc = setup_obd_uuids(dir, dname, param);
+ }
if (rc == 0)
rc = process_file(dir, dname, fname, param);
closedir(dir);
}
int llapi_find(char *path, struct obd_uuid *obduuid, int recursive,
- int verbose, int quiet)
+ int verbose, int quiet, int showfid)
{
struct find_param param;
int ret = 0;
memset(¶m, 0, sizeof(param));
param.recursive = recursive;
+ param.showfid = showfid;
param.verbose = verbose;
param.quiet = quiet;
if (obduuid) {