Whamcloud - gitweb
LU-2675 obd: decruft md_enqueue() and md_intent_lock()
[fs/lustre-release.git] / lustre / lmv / lmv_intent.c
index 363eb3a..da76f8f 100644 (file)
@@ -41,7 +41,7 @@
 #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 <lustre_lib.h>
 #include <lustre_net.h>
 #include <lustre_dlm.h>
+#include <lustre_mdc.h>
 #include <obd_class.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)
@@ -126,8 +126,8 @@ static int lmv_intent_remote(struct obd_export *exp, void *lmm,
        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);
 
@@ -142,8 +142,10 @@ static int lmv_intent_remote(struct obd_export *exp, void *lmm,
                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:
@@ -181,9 +183,6 @@ int lmv_revalidate_slaves(struct obd_export *exp, struct mdt_body *mbody,
         * 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);
@@ -202,14 +201,6 @@ int lmv_revalidate_slaves(struct obd_export *exp, struct mdt_body *mbody,
 
                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
@@ -227,8 +218,8 @@ int lmv_revalidate_slaves(struct obd_export *exp, struct mdt_body *mbody,
                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);
 
@@ -243,7 +234,6 @@ int lmv_revalidate_slaves(struct obd_export *exp, struct mdt_body *mbody,
                        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,
@@ -262,9 +252,6 @@ update:
                                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);
@@ -275,7 +262,9 @@ update:
                        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)
@@ -336,10 +325,8 @@ int lmv_revalidate_slaves(struct obd_export *exp, struct mdt_body *mbody,
  * 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;
@@ -357,6 +344,8 @@ int lmv_intent_open(struct obd_export *exp, struct md_op_data *op_data,
 
                        oinfo = lsm_name_to_stripe_info(lsm, op_data->op_name,
                                                        op_data->op_namelen);
+                       if (IS_ERR(oinfo))
+                               RETURN(PTR_ERR(oinfo));
                        op_data->op_fid1 = oinfo->lmo_fid;
                }
 
@@ -380,7 +369,7 @@ int lmv_intent_open(struct obd_export *exp, struct md_op_data *op_data,
                 * 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);
        }
@@ -389,8 +378,8 @@ int lmv_intent_open(struct obd_export *exp, struct md_op_data *op_data,
               " 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);
        /*
@@ -408,9 +397,8 @@ int lmv_intent_open(struct obd_export *exp, struct md_op_data *op_data,
 
        /* 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);
 
@@ -425,17 +413,18 @@ int lmv_intent_open(struct obd_export *exp, struct md_op_data *op_data,
 /*
  * 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;
-       struct lmv_tgt_desc    *tgt = NULL;
-       struct mdt_body        *body;
-       int                     rc = 0;
+       struct obd_device       *obd = exp->exp_obd;
+       struct lmv_obd          *lmv = &obd->u.lmv;
+       struct lmv_tgt_desc     *tgt = NULL;
+       struct mdt_body         *body;
+       struct lmv_stripe_md    *lsm = op_data->op_mea1;
+       int                     rc = 0;
        ENTRY;
 
        tgt = lmv_locate_mds(lmv, op_data, &op_data->op_fid1);
@@ -446,16 +435,15 @@ int lmv_intent_lookup(struct obd_export *exp, struct md_op_data *op_data,
                fid_zero(&op_data->op_fid2);
 
        CDEBUG(D_INODE, "LOOKUP_INTENT with fid1="DFID", fid2="DFID
-              ", name='%s' -> mds #%d\n", PFID(&op_data->op_fid1),
-              PFID(&op_data->op_fid2),
+              ", name='%s' -> mds #%d lsm=%p lsm_magic=%x\n",
+              PFID(&op_data->op_fid1), PFID(&op_data->op_fid2),
               op_data->op_name ? op_data->op_name : "<NULL>",
-              tgt->ltd_idx);
+              tgt->ltd_idx, lsm, lsm == NULL ? -1 : lsm->lsm_md_magic);
 
        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);
 
@@ -464,13 +452,33 @@ int lmv_intent_lookup(struct obd_export *exp, struct md_op_data *op_data,
                 * during update_inode process (see ll_update_lsm_md) */
                if (op_data->op_mea2 != NULL) {
                        rc = lmv_revalidate_slaves(exp, NULL, op_data->op_mea2,
-                                               cb_blocking, extra_lock_flags);
+                                                  cb_blocking,
+                                                  extra_lock_flags);
                        if (rc != 0)
                                RETURN(rc);
                }
                RETURN(rc);
-       }
+       } 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) */
+               tgt = lmv_find_target(lmv, &lsm->lsm_md_oinfo[1].lmo_fid);
+               if (IS_ERR(tgt))
+                       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, it, reqp,
+                                   cb_blocking, extra_lock_flags);
+       }
        /*
         * MDS has returned success. Probably name has been resolved in
         * remote inode. Let's check this.
@@ -481,8 +489,8 @@ int lmv_intent_lookup(struct obd_export *exp, struct md_op_data *op_data,
 
        /* 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);
@@ -494,9 +502,8 @@ int lmv_intent_lookup(struct obd_export *exp, struct md_op_data *op_data,
 }
 
 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;
@@ -514,15 +521,14 @@ int lmv_intent_lock(struct obd_export *exp, struct md_op_data *op_data,
         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);
 }