- /* this is splitted dir and we'd want to get attrs */
- CDEBUG(D_OTHER, "attrs from slaves for %lu/%lu/%lu\n",
- (unsigned long) cfid->mds,
- (unsigned long) cfid->id,
- (unsigned long) cfid->generation);
- rc = lmv_revalidate_slaves(exp, reqp, cfid,
- it, 1, cb_blocking);
- } else if (S_ISDIR(body->mode)) {
- /*CWARN("hmmm, %lu/%lu/%lu has not lmv obj?!\n",
- (unsigned long) cfid->mds,
- (unsigned long) cfid->id,
- (unsigned long) cfid->generation);*/
- }
- lmv_put_obj(obj);
- RETURN(rc);
-}
-
-int lmv_intent_getattr(struct obd_export *exp, struct ll_uctxt *uctxt,
- struct ll_fid *pfid, const char *name, int len,
- void *lmm, int lmmsize, struct ll_fid *cfid,
- struct lookup_intent *it, int flags,
- struct ptlrpc_request **reqp,
- ldlm_blocking_callback cb_blocking)
-{
- struct obd_device *obd = exp->exp_obd;
- struct lmv_obd *lmv = &obd->u.lmv;
- struct mds_body *body = NULL;
- struct ll_fid rpfid = *pfid;
- struct lmv_obj *obj, *obj2;
- struct mea *mea;
- int rc = 0, mds;
- ENTRY;
-
- if (cfid) {
- /* caller wants to revalidate attrs of obj
- * we have to revalidate slaves if requested
- * object is splitted directory */
- CDEBUG(D_OTHER, "revalidate attrs for %lu/%lu/%lu\n",
- (unsigned long) cfid->mds,
- (unsigned long) cfid->id,
- (unsigned long) cfid->generation);
- mds = cfid->mds;
- obj = lmv_grab_obj(obd, cfid, 0);
- if (obj) {
- /* in fact, we need not this with current
- * _intent_lock(), but it may change some day */
- rpfid = obj->objs[mds].fid;
- }
- rc = md_intent_lock(lmv->tgts[mds].exp, uctxt, &rpfid, name,
- len, lmm, lmmsize, cfid, it, flags, reqp,
- cb_blocking);
- if (obj && rc >= 0) {
- /* this is splitted dir. in order to optimize things
- * a bit, we consider obj valid updating missing
- * parts. FIXME: do we need to return any lock here?
- * it would be fine if we don't. this means that
- * nobody should use UPDATE lock to notify about
- * object removal */
- CDEBUG(D_OTHER,
- "revalidate slaves for %lu/%lu/%lu, rc %d\n",
- (unsigned long) cfid->mds,
- (unsigned long) cfid->id,
- (unsigned long) cfid->generation, rc);
- rc = lmv_revalidate_slaves(exp, reqp, cfid, it, rc,
- cb_blocking);
- }
- RETURN(rc);
+ /*
+ * Directory is already split, so we have to forward request to
+ * the right MDS.
+ */
+ sidx = raw_name2idx(obj->lo_hashtype, obj->lo_objcount,
+ (char *)op_data->op_name,
+ op_data->op_namelen);
+
+ rpid = obj->lo_stripes[sidx].ls_fid;
+
+ sop_data->op_mds = obj->lo_stripes[sidx].ls_mds;
+ tgt = lmv_get_target(lmv, sop_data->op_mds);
+ sop_data->op_bias &= ~MDS_CHECK_SPLIT;
+ lmv_object_put(obj);
+
+ CDEBUG(D_INODE,
+ "Choose slave dir ("DFID") -> mds #%d\n",
+ PFID(&rpid), tgt->ltd_idx);
+ } else {
+ sop_data->op_bias |= MDS_CHECK_SPLIT;
+ tgt = lmv_find_target(lmv, &rpid);
+ sop_data->op_mds = tgt->ltd_idx;