+ /* foreign dir is not striped */
+ if (lmv_dir_foreign(op_data->op_mea1)) {
+ /* only allow getattr/lookup for itself */
+ if (op_data->op_name != NULL)
+ RETURN(-ENODATA);
+ RETURN(0);
+ }
+
+retry:
+ if (op_data->op_flags & MF_GETATTR_BY_FID) {
+ /* getattr by FID, replace fid1 with stripe FID,
+ * NB, don't replace if name is "/", because it may be a subtree
+ * mount, and if it's a striped directory, fid1 will be replaced
+ * to stripe FID by hash, while fid2 is master object FID, which
+ * will be treated as a remote object if the two FIDs are
+ * located on different MDTs, and LOOKUP lock can't be fetched.
+ */
+ LASSERT(op_data->op_name);
+ if (op_data->op_namelen != 1 ||
+ strncmp(op_data->op_name, "/", 1) != 0) {
+ tgt = lmv_locate_tgt(lmv, op_data);
+ if (IS_ERR(tgt))
+ RETURN(PTR_ERR(tgt));
+ }
+
+ /* name is used to locate stripe target, clear it here
+ * to avoid packing name in request, so that MDS knows
+ * it's getattr by FID.
+ */
+ op_data->op_name = NULL;
+ op_data->op_namelen = 0;
+
+ /* getattr request is sent to MDT where fid2 inode is */
+ tgt = lmv_fid2tgt(lmv, &op_data->op_fid2);
+ } else if (op_data->op_name) {
+ /* getattr by name */
+ tgt = lmv_locate_tgt(lmv, op_data);
+ if (!fid_is_sane(&op_data->op_fid2))
+ fid_zero(&op_data->op_fid2);
+ } else {
+ /* old way to getattr by FID, parent FID not packed */
+ tgt = lmv_fid2tgt(lmv, &op_data->op_fid1);
+ }