+ if (param->type && !checked_type) {
+ if ((st->st_mode & S_IFMT) == param->type) {
+ if (param->exclude_type)
+ goto decided;
+ } else {
+ if (!param->exclude_type)
+ goto decided;
+ }
+ }
+
+ /* Prepare odb. */
+ if (param->obduuid) {
+ if (lustre_fs && param->got_uuids &&
+ param->st_dev != st->st_dev) {
+ /* A lustre/lustre mount point is crossed. */
+ param->got_uuids = 0;
+ param->obds_printed = 0;
+ param->obdindex = OBD_NOT_FOUND;
+ }
+
+ if (lustre_fs && !param->got_uuids) {
+ ret = setup_obd_indexes(dir ? dir : parent, param);
+ if (ret)
+ return ret;
+
+ param->st_dev = st->st_dev;
+ } else if (!lustre_fs && param->got_uuids) {
+ /* A lustre/non-lustre mount point is crossed. */
+ param->got_uuids = 0;
+ param->obdindex = OBD_NOT_FOUND;
+ }
+ }
+
+ /* If an OBD UUID is specified but no one matches, skip this file. */
+ if (param->obduuid && param->obdindex == OBD_NOT_FOUND)
+ goto decided;
+
+ /* If a OST UUID is given, and some OST matches, check it here. */
+ if (param->obdindex != OBD_NOT_FOUND) {
+ if (!S_ISREG(st->st_mode))
+ goto decided;
+
+ /* Only those files should be accepted, which have a
+ * stripe on the specified OST. */
+ if (!param->lmd->lmd_lmm.lmm_stripe_count) {
+ goto decided;
+ } else {
+ int i, j;
+ for (i = 0;
+ i < param->lmd->lmd_lmm.lmm_stripe_count; i++) {
+ for (j = 0; j < param->num_obds; j++) {
+ if (param->obdindexes[j] ==
+ param->lmd->lmd_lmm.lmm_objects[i].l_ost_idx)
+ goto obd_matches;
+ }
+ }
+
+ if (i == param->lmd->lmd_lmm.lmm_stripe_count)
+ goto decided;
+ }
+ }
+
+ /* Check the time on mds. */
+ if (!decision) {
+ int for_mds;
+
+ for_mds = lustre_fs ? (S_ISREG(st->st_mode) &&
+ param->lmd->lmd_lmm.lmm_stripe_count)
+ : 0;
+ decision = find_time_check(st, param, for_mds);
+ }
+
+obd_matches:
+ /* If file still fits the request, ask osd for updated info.
+ The regulat stat is almost of the same speed as some new
+ 'glimpse-size-ioctl'. */
+ if (!decision && S_ISREG(st->st_mode) &&
+ (param->lmd->lmd_lmm.lmm_stripe_count || param->size)) {
+ if (param->obdindex != OBD_NOT_FOUND) {
+ /* Check whether the obd is active or not, if it is
+ * not active, just print the object affected by this
+ * failed ost
+ * */
+ struct obd_statfs stat_buf;
+ struct obd_uuid uuid_buf;
+
+ memset(&stat_buf, 0, sizeof(struct obd_statfs));
+ memset(&uuid_buf, 0, sizeof(struct obd_uuid));
+ ret = llapi_obd_statfs(path, LL_STATFS_LOV,
+ param->obdindex, &stat_buf,
+ &uuid_buf);
+ if (ret) {
+ if (ret == -ENODATA || ret == -ENODEV
+ || ret == -EIO)
+ errno = EIO;
+ llapi_printf(LLAPI_MSG_NORMAL,
+ "obd_uuid: %s failed %s ",
+ param->obduuid->uuid,
+ strerror(errno));
+ goto print_path;
+ }
+ }
+ if (dir) {
+ ret = ioctl(dirfd(dir), IOC_LOV_GETINFO,
+ (void *)param->lmd);
+ } else if (parent) {
+ ret = ioctl(dirfd(parent), IOC_LOV_GETINFO,
+ (void *)param->lmd);
+ }
+
+ if (ret) {
+ if (errno == ENOENT) {
+ llapi_err(LLAPI_MSG_ERROR,
+ "warning: %s: %s does not exist",
+ __FUNCTION__, path);
+ goto decided;
+ } else {
+ llapi_err(LLAPI_MSG_ERROR,
+ "%s: IOC_LOV_GETINFO on %s failed",
+ __FUNCTION__, path);
+ return ret;
+ }
+ }
+
+ /* Check the time on osc. */
+ decision = find_time_check(st, param, 0);
+ if (decision == -1)
+ goto decided;
+ }
+
+ if (param->size)
+ decision = find_value_cmp(st->st_size, param->size,
+ param->size_sign, param->size_units,
+ 0);
+
+print_path:
+ if (decision != -1) {
+ llapi_printf(LLAPI_MSG_NORMAL, "%s", path);
+ if (param->zeroend)
+ llapi_printf(LLAPI_MSG_NORMAL, "%c", '\0');
+ else
+ llapi_printf(LLAPI_MSG_NORMAL, "\n");
+ }
+
+decided:
+ /* Do not get down anymore? */
+ if (param->depth == param->maxdepth)
+ return 1;
+
+ param->depth++;
+ return 0;
+}
+
+static int cb_common_fini(char *path, DIR *parent, DIR *d, void *data,
+ struct dirent64 *de)
+{
+ struct find_param *param = (struct find_param *)data;
+ param->depth--;
+ return 0;