+ return param_callback(path, cb_find_init, cb_common_fini, param);
+}
+
+/*
+ * Get MDT number that the file/directory inode referenced
+ * by the open fd resides on.
+ * Return 0 and mdtidx on success, or -ve errno.
+ */
+int llapi_file_fget_mdtidx(int fd, int *mdtidx)
+{
+ if (ioctl(fd, LL_IOC_GET_MDTIDX, &mdtidx) < 0)
+ return -errno;
+ return 0;
+}
+
+static int cb_get_mdt_index(char *path, DIR *parent, DIR *d, void *data,
+ cfs_dirent_t *de)
+{
+ struct find_param *param = (struct find_param *)data;
+ int ret = 0;
+ int mdtidx;
+
+ LASSERT(parent != NULL || d != NULL);
+
+ if (d) {
+ ret = llapi_file_fget_mdtidx(dirfd(d), &mdtidx);
+ } else if (parent) {
+ int fd;
+
+ fd = open(path, O_RDONLY);
+ if (fd > 0) {
+ ret = llapi_file_fget_mdtidx(fd, &mdtidx);
+ close(fd);
+ } else {
+ ret = fd;
+ }
+ }
+
+ if (ret) {
+ if (errno == ENODATA) {
+ if (!param->obduuid)
+ llapi_printf(LLAPI_MSG_NORMAL,
+ "%s has no stripe info\n", path);
+ goto out;
+ } else if (errno == ENOTTY) {
+ llapi_err(LLAPI_MSG_ERROR,
+ "%s: '%s' not on a Lustre fs?",
+ __func__, path);
+ } else if (errno == ENOENT) {
+ llapi_err(LLAPI_MSG_WARN,
+ "warning: %s: %s does not exist",
+ __func__, path);
+ goto out;
+ } else {
+ llapi_err(LLAPI_MSG_ERROR,
+ "error: %s: LL_IOC_GET_MDTIDX failed for %s",
+ __func__, path);
+ }
+ return ret;
+ }
+
+ if (param->quiet)
+ llapi_printf(LLAPI_MSG_NORMAL, "%d\n", mdtidx);
+ else
+ llapi_printf(LLAPI_MSG_NORMAL, "%s MDT index: %d\n",
+ path, mdtidx);
+
+out:
+ /* Do not get down anymore? */
+ if (param->depth == param->maxdepth)
+ return 1;
+
+ param->depth++;
+ return 0;