#include <linux/init.h>
#include <linux/slab.h>
#include <linux/pagemap.h>
-#include <asm/div64.h>
+#include <linux/math64.h>
#include <linux/seq_file.h>
#include <linux/namei.h>
#include <linux/lustre_intent.h>
#include <lprocfs_status.h>
#include "lmv_internal.h"
-static int lmv_intent_remote(struct obd_export *exp, void *lmm,
- int lmmsize, struct lookup_intent *it,
- const struct lu_fid *parent_fid, int flags,
+static int lmv_intent_remote(struct obd_export *exp, struct lookup_intent *it,
+ const struct lu_fid *parent_fid,
struct ptlrpc_request **reqp,
ldlm_blocking_callback cb_blocking,
__u64 extra_lock_flags)
CDEBUG(D_INODE, "REMOTE_INTENT with fid="DFID" -> mds #%d\n",
PFID(&body->fid1), tgt->ltd_idx);
- rc = md_intent_lock(tgt->ltd_exp, op_data, lmm, lmmsize, it,
- flags, &req, cb_blocking, extra_lock_flags);
+ rc = md_intent_lock(tgt->ltd_exp, op_data, it, &req, cb_blocking,
+ extra_lock_flags);
if (rc)
GOTO(out_free_op_data, rc);
it->d.lustre.it_remote_lock_mode = it->d.lustre.it_lock_mode;
}
- it->d.lustre.it_lock_handle = plock.cookie;
- it->d.lustre.it_lock_mode = pmode;
+ if (pmode) {
+ it->d.lustre.it_lock_handle = plock.cookie;
+ it->d.lustre.it_lock_mode = pmode;
+ }
EXIT;
out_free_op_data:
* revalidate slaves has some problems, temporarily return,
* we may not need that
*/
- if (lsm->lsm_md_stripe_count <= 1)
- RETURN(0);
-
OBD_ALLOC_PTR(op_data);
if (op_data == NULL)
RETURN(-ENOMEM);
fid = lsm->lsm_md_oinfo[i].lmo_fid;
inode = lsm->lsm_md_oinfo[i].lmo_root;
- if (i == 0) {
- if (mbody != NULL) {
- body = mbody;
- goto update;
- } else {
- goto release_lock;
- }
- }
/*
* Prepare op_data for revalidating. Note that @fid2 shluld be
CDEBUG(D_INODE, "Revalidate slave "DFID" -> mds #%d\n",
PFID(&fid), tgt->ltd_idx);
- rc = md_intent_lock(tgt->ltd_exp, op_data, NULL, 0, &it, 0,
- &req, cb_blocking, extra_lock_flags);
+ rc = md_intent_lock(tgt->ltd_exp, op_data, &it, &req,
+ cb_blocking, extra_lock_flags);
if (rc < 0)
GOTO(cleanup, rc);
body = req_capsule_server_get(&req->rq_pill,
&RMF_MDT_BODY);
LASSERT(body != NULL);
-update:
if (unlikely(body->nlink < 2)) {
CERROR("%s: nlink %d < 2 corrupt stripe %d "DFID
":" DFID"\n", obd->obd_name, body->nlink,
GOTO(cleanup, rc = -EIO);
}
- if (i != 0)
- md_set_lock_data(tgt->ltd_exp, &lockh->cookie,
- inode, NULL);
i_size_write(inode, body->size);
set_nlink(inode, body->nlink);
if (req != NULL)
ptlrpc_req_finished(req);
}
-release_lock:
+
+ md_set_lock_data(tgt->ltd_exp, &lockh->cookie, inode, NULL);
+
size += i_size_read(inode);
if (i != 0)
* may be split dir.
*/
int lmv_intent_open(struct obd_export *exp, struct md_op_data *op_data,
- void *lmm, int lmmsize, struct lookup_intent *it,
- int flags, struct ptlrpc_request **reqp,
- ldlm_blocking_callback cb_blocking,
- __u64 extra_lock_flags)
+ struct lookup_intent *it, struct ptlrpc_request **reqp,
+ ldlm_blocking_callback cb_blocking, __u64 extra_lock_flags)
{
struct obd_device *obd = exp->exp_obd;
struct lmv_obd *lmv = &obd->u.lmv;
* fid and setup FLD for it.
*/
op_data->op_fid3 = op_data->op_fid2;
- rc = lmv_fid_alloc(exp, &op_data->op_fid2, op_data);
+ rc = lmv_fid_alloc(NULL, exp, &op_data->op_fid2, op_data);
if (rc != 0)
RETURN(rc);
}
" name='%s' -> mds #%d\n", PFID(&op_data->op_fid1),
PFID(&op_data->op_fid2), op_data->op_name, tgt->ltd_idx);
- rc = md_intent_lock(tgt->ltd_exp, op_data, lmm, lmmsize, it, flags,
- reqp, cb_blocking, extra_lock_flags);
+ rc = md_intent_lock(tgt->ltd_exp, op_data, it, reqp, cb_blocking,
+ extra_lock_flags);
if (rc != 0)
RETURN(rc);
/*
/* Not cross-ref case, just get out of here. */
if (unlikely((body->valid & OBD_MD_MDS))) {
- rc = lmv_intent_remote(exp, lmm, lmmsize, it, &op_data->op_fid1,
- flags, reqp, cb_blocking,
- extra_lock_flags);
+ rc = lmv_intent_remote(exp, it, &op_data->op_fid1, reqp,
+ cb_blocking, extra_lock_flags);
if (rc != 0)
RETURN(rc);
/*
* Handler for: getattr, lookup and revalidate cases.
*/
-int lmv_intent_lookup(struct obd_export *exp, struct md_op_data *op_data,
- void *lmm, int lmmsize, struct lookup_intent *it,
- int flags, struct ptlrpc_request **reqp,
- ldlm_blocking_callback cb_blocking,
- __u64 extra_lock_flags)
+static int
+lmv_intent_lookup(struct obd_export *exp, struct md_op_data *op_data,
+ struct lookup_intent *it, struct ptlrpc_request **reqp,
+ ldlm_blocking_callback cb_blocking,
+ __u64 extra_lock_flags)
{
struct obd_device *obd = exp->exp_obd;
struct lmv_obd *lmv = &obd->u.lmv;
op_data->op_bias &= ~MDS_CROSS_REF;
- rc = md_intent_lock(tgt->ltd_exp, op_data, lmm, lmmsize, it,
- flags, reqp, cb_blocking, extra_lock_flags);
+ rc = md_intent_lock(tgt->ltd_exp, op_data, it, reqp, cb_blocking,
+ extra_lock_flags);
if (rc < 0)
RETURN(rc);
RETURN(rc);
}
RETURN(rc);
- } else if (it_disposition(it, DISP_LOOKUP_NEG) &&
- lsm != NULL && lsm->lsm_md_magic == LMV_MAGIC_MIGRATE) {
+ } else if (it_disposition(it, DISP_LOOKUP_NEG) && lsm != NULL &&
+ lsm->lsm_md_hash_type & LMV_HASH_FLAG_MIGRATION) {
/* For migrating directory, if it can not find the child in
* the source directory(master stripe), try the targeting
* directory(stripe 1) */
RETURN(PTR_ERR(tgt));
ptlrpc_req_finished(*reqp);
+ it->d.lustre.it_data = NULL;
+ *reqp = NULL;
+
CDEBUG(D_INODE, "For migrating dir, try target dir "DFID"\n",
PFID(&lsm->lsm_md_oinfo[1].lmo_fid));
op_data->op_fid1 = lsm->lsm_md_oinfo[1].lmo_fid;
it->d.lustre.it_disposition &= ~DISP_ENQ_COMPLETE;
- rc = md_intent_lock(tgt->ltd_exp, op_data, lmm, lmmsize, it,
- flags, reqp, cb_blocking, extra_lock_flags);
- RETURN(rc);
+ rc = md_intent_lock(tgt->ltd_exp, op_data, it, reqp,
+ cb_blocking, extra_lock_flags);
}
/*
* MDS has returned success. Probably name has been resolved in
/* Not cross-ref case, just get out of here. */
if (unlikely((body->valid & OBD_MD_MDS))) {
- rc = lmv_intent_remote(exp, lmm, lmmsize, it, NULL, flags,
- reqp, cb_blocking, extra_lock_flags);
+ rc = lmv_intent_remote(exp, it, NULL, reqp, cb_blocking,
+ extra_lock_flags);
if (rc != 0)
RETURN(rc);
body = req_capsule_server_get(&(*reqp)->rq_pill, &RMF_MDT_BODY);
}
int lmv_intent_lock(struct obd_export *exp, struct md_op_data *op_data,
- void *lmm, int lmmsize, struct lookup_intent *it,
- int flags, struct ptlrpc_request **reqp,
- ldlm_blocking_callback cb_blocking,
+ struct lookup_intent *it, struct ptlrpc_request **reqp,
+ ldlm_blocking_callback cb_blocking,
__u64 extra_lock_flags)
{
struct obd_device *obd = exp->exp_obd;
if (rc)
RETURN(rc);
- if (it->it_op & (IT_LOOKUP | IT_GETATTR | IT_LAYOUT))
- rc = lmv_intent_lookup(exp, op_data, lmm, lmmsize, it,
- flags, reqp, cb_blocking,
- extra_lock_flags);
- else if (it->it_op & IT_OPEN)
- rc = lmv_intent_open(exp, op_data, lmm, lmmsize, it,
- flags, reqp, cb_blocking,
- extra_lock_flags);
- else
- LBUG();
- RETURN(rc);
+ if (it->it_op & (IT_LOOKUP | IT_GETATTR | IT_LAYOUT))
+ rc = lmv_intent_lookup(exp, op_data, it, reqp, cb_blocking,
+ extra_lock_flags);
+ else if (it->it_op & IT_OPEN)
+ rc = lmv_intent_open(exp, op_data, it, reqp, cb_blocking,
+ extra_lock_flags);
+ else
+ LBUG();
+
+ RETURN(rc);
}