it->d.lustre.it_disposition &= ~DISP_ENQ_COMPLETE;
- tgt_exp = lmv_get_export(lmv, &body->fid1);
+ tgt_exp = lmv_find_export(lmv, &body->fid1);
if (IS_ERR(tgt_exp))
GOTO(out, rc = PTR_ERR(tgt_exp));
mea_idx = raw_name2idx(obj->lo_hashtype, obj->lo_objcount,
(char *)op->name, op->namelen);
rpid = &obj->lo_inodes[mea_idx].li_fid;
- rc = lmv_fld_lookup(lmv, rpid, &mds);
+ mds = obj->lo_inodes[mea_idx].li_mds;
lmv_obj_put(obj);
- if (rc)
- RETURN(rc);
rc = __lmv_fid_alloc(lmv, fid, mds);
if (rc) {
op_data->namelen);
rpid = obj->lo_inodes[mea_idx].li_fid;
+ tgt_exp = lmv_get_export(lmv, obj->lo_inodes[mea_idx].li_mds);
lmv_obj_put(obj);
CDEBUG(D_OTHER, "Choose slave dir ("DFID")\n", PFID(&rpid));
+ } else {
+ tgt_exp = lmv_find_export(lmv, &rpid);
}
-
- tgt_exp = lmv_get_export(lmv, &rpid);
if (IS_ERR(tgt_exp))
GOTO(out_free_sop_data, rc = PTR_ERR(tgt_exp));
cb_blocking, extra_lock_flags);
if (rc != 0) {
LASSERT(rc < 0);
-
/*
* This is possible, that some userspace application will try to
* open file as directory and we will have -ENOTDIR here. As
- * this is "usual" situation, we should not print error here,
+ * this is normal situation, we should not print error here,
* only debug info.
*/
CDEBUG(D_OTHER, "can't handle remote %s: dir "DFID"("DFID"):"
if (obj) {
if (!lu_fid_eq(&op_data->fid1, &op_data->fid2)){
rpid = obj->lo_inodes[mds].li_fid;
- rc = lmv_fld_lookup(lmv, &rpid, &mds);
- if (rc) {
- lmv_obj_put(obj);
- GOTO(out_free_sop_data, rc);
- }
+ mds = obj->lo_inodes[mds].li_mds;
}
lmv_obj_put(obj);
}
(char *)op_data->name,
op_data->namelen);
rpid = obj->lo_inodes[mea_idx].li_fid;
- rc = lmv_fld_lookup(lmv, &rpid, &mds);
- if (rc) {
- lmv_obj_put(obj);
- GOTO(out_free_sop_data, rc);
- }
+ mds = obj->lo_inodes[mea_idx].li_mds;
lmv_obj_put(obj);
CDEBUG(D_OTHER, "forward to MDS #"LPU64" (slave "DFID")\n",
mds, PFID(&rpid));
+ } else {
+ rc = lmv_fld_lookup(lmv, &op_data->fid1, &mds);
+ if (rc)
+ GOTO(out_free_sop_data, rc);
}
}
op_data->fid1 = fid;
op_data->fid2 = fid;
- tgt_exp = lmv_get_export(lmv, &fid);
+ tgt_exp = lmv_get_export(lmv, obj->lo_inodes[i].li_mds);
if (IS_ERR(tgt_exp))
GOTO(cleanup, rc = PTR_ERR(tgt_exp));
(char *)op_data->name,
op_data->namelen);
rpid = obj->lo_inodes[mea_idx].li_fid;
+ mds = obj->lo_inodes[mea_idx].li_mds;
lmv_obj_put(obj);
+ } else {
+ rc = lmv_fld_lookup(lmv, &rpid, &mds);
+ if (rc)
+ GOTO(out_free_sop_data, rc);
}
- rc = lmv_fld_lookup(lmv, &rpid, &mds);
- if (rc)
- GOTO(out_free_sop_data, rc);
CDEBUG(D_OTHER, "revalidate lookup for "DFID" to #"LPU64" MDS\n",
PFID(&op_data->fid2), mds);
} else {
- rc = lmv_fld_lookup(lmv, &op_data->fid1, &mds);
- if (rc)
- GOTO(out_free_sop_data, rc);
repeat:
LASSERT(++loop <= 2);
(char *)op_data->name,
op_data->namelen);
rpid = obj->lo_inodes[mea_idx].li_fid;
- rc = lmv_fld_lookup(lmv, &rpid, &mds);
- if (rc) {
- lmv_obj_put(obj);
- GOTO(out_free_sop_data, rc);
- }
+ mds = obj->lo_inodes[mea_idx].li_mds;
}
lmv_obj_put(obj);
+ } else {
+ rc = lmv_fld_lookup(lmv, &op_data->fid1, &mds);
+ if (rc)
+ GOTO(out_free_sop_data, rc);
}
fid_zero(&op_data->fid2);
}
op_data->fid2 = fid;
/* is obj valid? */
- tgt_exp = lmv_get_export(lmv, &fid);
+ tgt_exp = lmv_get_export(lmv, obj->lo_inodes[i].li_mds);
if (IS_ERR(tgt_exp))
GOTO(cleanup, rc = PTR_ERR(tgt_exp));
*/
obj = lmv_obj_grab(obd, hint->ph_pfid);
if (obj) {
+ struct lu_fid *rpid;
+ int mea_idx;
+
/*
* If the dir got split, alloc fid according to its
* hash. No matter what we create, object create should
- * go to correct MDS.
+ * go to correct MDS.
*/
- struct lu_fid *rpid;
- int mea_idx;
mea_idx = raw_name2idx(obj->lo_hashtype,
obj->lo_objcount,
hint->ph_cname->name,
hint->ph_cname->len);
rpid = &obj->lo_inodes[mea_idx].li_fid;
- rc = lmv_fld_lookup(lmv, rpid, mds);
+ *mds = obj->lo_inodes[mea_idx].li_mds;
lmv_obj_put(obj);
- if (rc)
- GOTO(exit, rc);
+ rc = 0;
CDEBUG(D_INODE, "The obj "DFID" has been split, got "
"MDS at "LPU64" by name %s\n", PFID(hint->ph_pfid),
} else {
/*
* Default policy for others is to use parent MDS.
- * ONLY directories can be cross-ref during creation
+ * ONLY directories can be cross-ref during creation.
*/
rc = lmv_fld_lookup(lmv, hint->ph_pfid, mds);
}
if (rc)
RETURN(rc);
- tgt_exp = lmv_get_export(lmv, fid);
+ tgt_exp = lmv_find_export(lmv, fid);
if (IS_ERR(tgt_exp))
RETURN(PTR_ERR(tgt_exp));
if (rc)
RETURN(rc);
- tgt_exp = lmv_get_export(lmv, fid);
+ tgt_exp = lmv_find_export(lmv, fid);
if (IS_ERR(tgt_exp))
RETURN(PTR_ERR(tgt_exp));
if (rc)
RETURN(rc);
- tgt_exp = lmv_get_export(lmv, fid);
+ tgt_exp = lmv_find_export(lmv, fid);
if (IS_ERR(tgt_exp))
RETURN(PTR_ERR(tgt_exp));
if (rc)
RETURN(rc);
- tgt_exp = lmv_get_export(lmv, &op_data->fid1);
+ tgt_exp = lmv_find_export(lmv, &op_data->fid1);
if (IS_ERR(tgt_exp))
RETURN(PTR_ERR(tgt_exp));
valid = OBD_MD_FLEASIZE | OBD_MD_FLDIREA | OBD_MD_MEA;
- tgt_exp = lmv_get_export(lmv, fid);
+ tgt_exp = lmv_find_export(lmv, fid);
if (IS_ERR(tgt_exp))
RETURN(PTR_ERR(tgt_exp));
mea_idx = raw_name2idx(obj->lo_hashtype, obj->lo_objcount,
op_data->name, op_data->namelen);
op_data->fid1 = obj->lo_inodes[mea_idx].li_fid;
+ tgt_exp = lmv_get_export(lmv, obj->lo_inodes[mea_idx].li_mds);
lmv_obj_put(obj);
+ } else {
+ tgt_exp = lmv_find_export(lmv, &op_data->fid1);
}
- CDEBUG(D_OTHER, "CREATE '%*s' on "DFID"\n", op_data->namelen,
- op_data->name, PFID(&op_data->fid1));
-
- tgt_exp = lmv_get_export(lmv, &op_data->fid1);
if (IS_ERR(tgt_exp))
RETURN(PTR_ERR(tgt_exp));
+ CDEBUG(D_OTHER, "CREATE '%*s' on "DFID"\n", op_data->namelen,
+ op_data->name, PFID(&op_data->fid1));
+
rc = md_create(tgt_exp, op_data, data, datalen, mode, uid, gid,
cap_effective, rdev, request);
if (rc == 0) {
if (rc)
RETURN(rc);
- tgt_exp = lmv_get_export(lmv, &op_data->fid1);
+ tgt_exp = lmv_find_export(lmv, &op_data->fid1);
if (IS_ERR(tgt_exp))
RETURN(PTR_ERR(tgt_exp));
memset(op_data2, 0, sizeof(*op_data2));
op_data2->fid1 = mea->mea_ids[i];
- tgt_exp = lmv_get_export(lmv, &op_data2->fid1);
+ tgt_exp = lmv_find_export(lmv, &op_data2->fid1);
if (IS_ERR(tgt_exp))
GOTO(cleanup, rc = PTR_ERR(tgt_exp));
it->d.lustre.it_disposition &= ~DISP_ENQ_COMPLETE;
ptlrpc_req_finished(req);
- tgt_exp = lmv_get_export(lmv, &fid_copy);
+ tgt_exp = lmv_find_export(lmv, &fid_copy);
if (IS_ERR(tgt_exp))
GOTO(out, rc = PTR_ERR(tgt_exp));
{
struct obd_device *obd = exp->exp_obd;
struct lmv_obd *lmv = &obd->u.lmv;
- struct obd_export *tgt_exp;
+ struct obd_export *tgt_exp = NULL;
struct lmv_obj *obj;
int rc;
ENTRY;
(char *)op_data->name,
op_data->namelen);
op_data->fid1 = obj->lo_inodes[mea_idx].li_fid;
+ tgt_exp = lmv_get_export(lmv, obj->lo_inodes[mea_idx].li_mds);
lmv_obj_put(obj);
}
}
- CDEBUG(D_OTHER, "ENQUEUE '%s' on "DFID"\n", LL_IT2STR(it),
- PFID(&op_data->fid1));
-
- tgt_exp = lmv_get_export(lmv, &op_data->fid1);
+
+ if (tgt_exp == NULL)
+ tgt_exp = lmv_find_export(lmv, &op_data->fid1);
if (IS_ERR(tgt_exp))
RETURN(PTR_ERR(tgt_exp));
+ CDEBUG(D_OTHER, "ENQUEUE '%s' on "DFID"\n", LL_IT2STR(it),
+ PFID(&op_data->fid1));
+
rc = md_enqueue(tgt_exp, lock_type, it, lock_mode, op_data, lockh,
lmm, lmmsize, cb_compl, cb_blocking, cb_data,
extra_lock_flags);
mea_idx = raw_name2idx(obj->lo_hashtype, obj->lo_objcount,
filename, namelen - 1);
rid = obj->lo_inodes[mea_idx].li_fid;
+ tgt_exp = lmv_get_export(lmv, obj->lo_inodes[mea_idx].li_mds);
lmv_obj_put(obj);
+ } else {
+ tgt_exp = lmv_find_export(lmv, &rid);
}
+ if (IS_ERR(tgt_exp))
+ RETURN(PTR_ERR(tgt_exp));
CDEBUG(D_OTHER, "getattr_name for %*s on "DFID" -> "DFID"\n",
namelen, filename, PFID(fid), PFID(&rid));
- tgt_exp = lmv_get_export(lmv, &rid);
- if (IS_ERR(tgt_exp))
- RETURN(PTR_ERR(tgt_exp));
-
rc = md_getattr_name(tgt_exp, &rid, oc, filename, namelen, valid,
ea_size, request);
if (rc == 0) {
CDEBUG(D_OTHER, "request attrs for "DFID"\n",
PFID(&rid));
- tgt_exp = lmv_get_export(lmv, &rid);
+ tgt_exp = lmv_find_export(lmv, &rid);
if (IS_ERR(tgt_exp)) {
ptlrpc_req_finished(*request);
RETURN(PTR_ERR(tgt_exp));
op_data->name,
op_data->namelen);
op_data->fid2 = obj->lo_inodes[mea_idx].li_fid;
+ mds = obj->lo_inodes[mea_idx].li_mds;
lmv_obj_put(obj);
+ } else {
+ rc = lmv_fld_lookup(lmv, &op_data->fid2, &mds);
+ if (rc)
+ RETURN(rc);
}
- rc = lmv_fld_lookup(lmv, &op_data->fid2, &mds);
- if (rc)
- RETURN(rc);
-
CDEBUG(D_OTHER,"link "DFID":%*s to "DFID"\n",
PFID(&op_data->fid2), op_data->namelen,
op_data->name, PFID(&op_data->fid1));
struct obd_device *obd = exp->exp_obd;
struct lmv_obd *lmv = &obd->u.lmv;
struct lmv_obj *obj;
- mdsno_t mds, mds2;
int rc, mea_idx;
+ mdsno_t mds;
ENTRY;
CDEBUG(D_OTHER, "rename %*s in "DFID" to %*s in "DFID"\n",
mea_idx = raw_name2idx(obj->lo_hashtype, obj->lo_objcount,
(char *)old, oldlen);
op_data->fid1 = obj->lo_inodes[mea_idx].li_fid;
+ mds = obj->lo_inodes[mea_idx].li_mds;
CDEBUG(D_OTHER, "Parent obj "DFID"\n", PFID(&op_data->fid1));
lmv_obj_put(obj);
+ } else {
+ rc = lmv_fld_lookup(lmv, &op_data->fid1, &mds);
+ if (rc)
+ RETURN(rc);
}
obj = lmv_obj_grab(obd, &op_data->fid2);
CDEBUG(D_OTHER, "Parent obj "DFID"\n", PFID(&op_data->fid2));
lmv_obj_put(obj);
}
-
- rc = lmv_fld_lookup(lmv, &op_data->fid1, &mds);
- if (rc)
- RETURN(rc);
-
request:
- rc = lmv_fld_lookup(lmv, &op_data->fid2, &mds2);
- if (rc)
- RETURN(rc);
-
- if (mds != mds2) {
- CDEBUG(D_OTHER,"cross-node rename "DFID"/%*s to "DFID"/%*s\n",
- PFID(&op_data->fid1), oldlen, old,
- PFID(&op_data->fid2), newlen, new);
- }
op_data->fsuid = current->fsuid;
op_data->fsgid = current->fsgid;
op_data->cap = current->cap_effective;
for (i = 0; i < obj->lo_objcount; i++) {
op_data->fid1 = obj->lo_inodes[i].li_fid;
- tgt_exp = lmv_get_export(lmv, &op_data->fid1);
+ tgt_exp = lmv_get_export(lmv, obj->lo_inodes[i].li_mds);
if (IS_ERR(tgt_exp)) {
rc = PTR_ERR(tgt_exp);
break;
}
lmv_obj_put(obj);
} else {
- tgt_exp = lmv_get_export(lmv, &op_data->fid1);
+ tgt_exp = lmv_find_export(lmv, &op_data->fid1);
if (IS_ERR(tgt_exp))
RETURN(PTR_ERR(tgt_exp));
if (rc)
RETURN(rc);
- tgt_exp = lmv_get_export(lmv, fid);
+ tgt_exp = lmv_find_export(lmv, fid);
if (IS_ERR(tgt_exp))
RETURN(PTR_ERR(tgt_exp));
do_div(index, (__u32)seg);
i = (int)index;
rid = obj->lo_inodes[i].li_fid;
+ tgt_exp = lmv_get_export(lmv, obj->lo_inodes[i].li_mds);
lmv_obj_unlock(obj);
CDEBUG(D_INFO, "forward to "DFID" with offset %lu i %d\n",
PFID(&rid), (unsigned long)offset, i);
+ } else {
+ tgt_exp = lmv_find_export(lmv, &rid);
}
- tgt_exp = lmv_get_export(lmv, &rid);
if (IS_ERR(tgt_exp))
GOTO(cleanup, rc = PTR_ERR(tgt_exp));
* Here we could remove "." and ".." from all pages which at not from
* master. But MDS has only "." and ".." for master dir.
*/
+ EXIT;
cleanup:
if (obj)
lmv_obj_put(obj);
- RETURN(rc);
+ return rc;
}
static int lmv_unlink_slaves(struct obd_export *exp,
op_data2->mode = MDS_MODE_DONT_LOCK | S_IFDIR;
op_data2->fsuid = current->fsuid;
op_data2->fsgid = current->fsgid;
- tgt_exp = lmv_get_export(lmv, &op_data2->fid1);
+ tgt_exp = lmv_find_export(lmv, &op_data2->fid1);
if (IS_ERR(tgt_exp))
GOTO(out_free_op_data2, rc = PTR_ERR(tgt_exp));
{
struct obd_device *obd = exp->exp_obd;
struct lmv_obd *lmv = &obd->u.lmv;
- struct obd_export *tgt_exp;
+ struct obd_export *tgt_exp = NULL;
int rc;
ENTRY;
op_data->name,
op_data->namelen);
op_data->fid1 = obj->lo_inodes[mea_idx].li_fid;
+ tgt_exp = lmv_get_export(lmv,
+ obj->lo_inodes[mea_idx].li_mds);
lmv_obj_put(obj);
CDEBUG(D_OTHER, "unlink '%*s' in "DFID" -> %u\n",
op_data->namelen, op_data->name,
CDEBUG(D_OTHER, "drop i_nlink on "DFID"\n",
PFID(&op_data->fid1));
}
- tgt_exp = lmv_get_export(lmv, &op_data->fid1);
+ if (tgt_exp == NULL)
+ tgt_exp = lmv_find_export(lmv, &op_data->fid1);
if (IS_ERR(tgt_exp))
RETURN(PTR_ERR(tgt_exp));
op_data->fsuid = current->fsuid;
ENTRY;
- tgt_exp = lmv_get_export(lmv, &och->och_fid);
+ tgt_exp = lmv_find_export(lmv, &och->och_fid);
if (IS_ERR(tgt_exp))
RETURN(PTR_ERR(tgt_exp));
struct obd_export *tgt_exp;
ENTRY;
- tgt_exp = lmv_get_export(lmv, &och->och_fid);
+ tgt_exp = lmv_find_export(lmv, &och->och_fid);
if (IS_ERR(tgt_exp))
RETURN(PTR_ERR(tgt_exp));
if (rc)
RETURN(rc);
- tgt_exp = lmv_get_export(lmv, fid);
+ tgt_exp = lmv_find_export(lmv, fid);
if (IS_ERR(tgt_exp))
RETURN(PTR_ERR(tgt_exp));
if (rc)
RETURN(rc);
- tgt_exp = lmv_get_export(lmv, &oc->c_capa.lc_fid);
+ tgt_exp = lmv_find_export(lmv, &oc->c_capa.lc_fid);
if (IS_ERR(tgt_exp))
RETURN(PTR_ERR(tgt_exp));