Whamcloud - gitweb
- changes with names on exports and another fields in llite and mds. lov_exp is
[fs/lustre-release.git] / lustre / lmv / lmv_intent.c
index c1cb22a..1badf65 100644 (file)
@@ -80,7 +80,7 @@ int lmv_handle_remote_inode(struct obd_export *exp, void *lmm,
                 struct lustre_id nid;
                 int pmode;
 
-                if (it->it_op == IT_LOOKUP) {
+                if (it->it_op == IT_LOOKUP || it->it_op == IT_CHDIR) {
                         /*
                          * unfortunately, we have to lie to MDC/MDS to retrieve
                          * attributes llite needs.
@@ -132,9 +132,9 @@ int lmv_intent_open(struct obd_export *exp, struct lustre_id *pid,
         struct lmv_obd *lmv = &obd->u.lmv;
         struct mds_body *body = NULL;
         struct lustre_id rpid = *pid;
+        int rc, mds, loop = 0;
         struct lmv_obj *obj;
         struct mea *mea;
-        int rc, mds, loop = 0;
         ENTRY;
 
         /* IT_OPEN is intended to open (and create, possible) an object. Parent
@@ -157,12 +157,11 @@ repeat:
         }
 
         rc = md_intent_lock(lmv->tgts[id_group(&rpid)].ltd_exp, &rpid, name,
-                            len, lmm, lmmsize, cid, it, flags, reqp,
-                            cb_blocking);
+                            len, lmm, lmmsize, cid, it, flags, reqp, cb_blocking);
         if (rc == -ERESTART) {
                 /* directory got splitted. time to update local object and
                  * repeat the request with proper MDS */
-                LASSERT(lmv_id_equal(pid, &rpid));
+                LASSERT(id_equal_fid(pid, &rpid));
                 rc = lmv_get_mea_and_update_object(exp, &rpid);
                 if (rc == 0) {
                         ptlrpc_req_finished(*reqp);
@@ -178,7 +177,14 @@ repeat:
                                      flags, reqp, cb_blocking);
         if (rc != 0) {
                 LASSERT(rc < 0);
-                CERROR("can't handle remote %s: dir "DLID4"("DLID4"):"
+
+                /* 
+                 * this is possible, that some userspace application will try to
+                 * open file as directory and we will have error -20 here. As
+                 * this is "usual" situation, we should not print error here,
+                 * only debug info.
+                 */
+                CDEBUG(D_OTHER, "can't handle remote %s: dir "DLID4"("DLID4"):"
                        "%*s: %d\n", LL_IT2STR(it), OLID4(pid), OLID4(&rpid),
                        len, name, rc);
                 RETURN(rc);
@@ -226,7 +232,7 @@ int lmv_intent_getattr(struct obd_export *exp, struct lustre_id *pid,
         struct lmv_obd *lmv = &obd->u.lmv;
         struct mds_body *body = NULL;
         struct lustre_id rpid = *pid;
-        struct lmv_obj *obj, *obj2;
+        struct lmv_obj *obj = NULL, *obj2 = NULL;
         struct mea *mea;
         int rc = 0, mds;
         ENTRY;
@@ -236,16 +242,18 @@ int lmv_intent_getattr(struct obd_export *exp, struct lustre_id *pid,
                  * slaves if requested object is splitted directory */
                 CDEBUG(D_OTHER, "revalidate attrs for "DLID4"\n", OLID4(cid));
                 mds = id_group(cid);
+#if 0
                 obj = lmv_grab_obj(obd, cid);
                 if (obj) {
                         /* in fact, we need not this with current intent_lock(),
                          * but it may change some day */
-                        if (!lmv_id_equal(pid, cid)){
+                        if (!id_equal_fid(pid, cid)){
                                 rpid = obj->objs[mds].id;
                                 mds = id_group(&rpid);
                         }
                         lmv_put_obj(obj);
-               }
+                }
+#endif
         } else {
                 CDEBUG(D_OTHER, "INTENT getattr for %*s on "DLID4"\n",
                        len, name, OLID4(pid));
@@ -254,7 +262,7 @@ int lmv_intent_getattr(struct obd_export *exp, struct lustre_id *pid,
                 if (obj && len) {
                         /* directory is already splitted. calculate mds */
                         mds = raw_name2idx(obj->hashtype, obj->objcount, 
-                                           (char *) name, len);
+                                           (char *)name, len);
                         rpid = obj->objs[mds].id;
                         mds = id_group(&rpid);
                         lmv_put_obj(obj);
@@ -262,10 +270,12 @@ int lmv_intent_getattr(struct obd_export *exp, struct lustre_id *pid,
                         CDEBUG(D_OTHER, "forward to MDS #%u (slave "DLID4")\n",
                                mds, OLID4(&rpid));
                 }
-        } 
+        }
+
+        /* the same about fid returning. */
         rc = md_intent_lock(lmv->tgts[mds].ltd_exp, &rpid, name,
-                            len, lmm, lmmsize, cid, it, flags, reqp,
-                            cb_blocking);
+                            len, lmm, lmmsize, cid, it, flags,
+                            reqp, cb_blocking);
         if (rc < 0)
                 RETURN(rc);
        
@@ -317,7 +327,8 @@ int lmv_intent_getattr(struct obd_export *exp, struct lustre_id *pid,
                 CDEBUG(D_OTHER, "attrs from slaves for "DLID4", rc %d\n",
                        OLID4(cid), rc);
                 
-                rc = lmv_revalidate_slaves(exp, reqp, cid, it, 1, cb_blocking);
+                rc = lmv_revalidate_slaves(exp, reqp, cid, it, 1,
+                                           cb_blocking);
                 lmv_put_obj(obj2);
         }
         RETURN(rc);
@@ -370,7 +381,7 @@ int lmv_lookup_slaves(struct obd_export *exp, struct ptlrpc_request **reqp)
                 struct ptlrpc_request *req = NULL;
                 struct lookup_intent it;
 
-                if (lmv_id_equal(&id, &obj->id))
+                if (id_equal_fid(&id, &obj->id))
                         /* skip master obj */
                         continue;
 
@@ -418,10 +429,12 @@ release_lock:
                 if (it.d.lustre.it_lock_mode)
                         ldlm_lock_decref(lockh, it.d.lustre.it_lock_mode);
         }
+
+        EXIT;
 cleanup:
         lmv_unlock_obj(obj);
         lmv_put_obj(obj);
-        RETURN(rc);
+        return rc;
 }
 
 int lmv_intent_lookup(struct obd_export *exp, struct lustre_id *pid,
@@ -444,7 +457,6 @@ int lmv_intent_lookup(struct obd_export *exp, struct lustre_id *pid,
          * this lookup below) or to confirm requested resolving is still valid
          * (let's call this revalidation) cid != NULL specifies revalidation.
          */
-
         if (cid) {
                 /*
                  * this is revalidation: we have to check is LOOKUP lock still
@@ -468,8 +480,9 @@ int lmv_intent_lookup(struct obd_export *exp, struct lustre_id *pid,
                 mds = id_group(pid);
 repeat:
                 LASSERT(++loop <= 2);
-                /* this is lookup. during lookup we have to update all the 
-                 * attributes, because returned values will be put in struct 
+                
+                /* this is lookup. during lookup we have to update all the
+                 * attributes, because returned values will be put in struct
                  * inode */
 
                 obj = lmv_grab_obj(obd, pid);
@@ -484,9 +497,9 @@ repeat:
                         lmv_put_obj(obj);
                 }
         }
-        rc = md_intent_lock(lmv->tgts[mds].ltd_exp, pid, name,
-                            len, lmm, lmmsize, cid, it, flags, reqp, 
-                            cb_blocking);
+        rc = md_intent_lock(lmv->tgts[mds].ltd_exp, &rpid, name,
+                            len, lmm, lmmsize, cid, it, flags,
+                            reqp, cb_blocking);
         if (rc > 0) {
                 LASSERT(cid != 0);
                 RETURN(rc);
@@ -524,10 +537,10 @@ repeat:
         if (rc < 0)
                 RETURN(rc);
 
-        /* okay, MDS has returned success. probably name has been resolved in
-         * remote inode */
-        rc = lmv_handle_remote_inode(exp, lmm, lmmsize, it, flags,
-                                     reqp, cb_blocking);
+        /* okay, MDS has returned success. Probably name has been resolved in
+         * remote inode. */
+        rc = lmv_handle_remote_inode(exp, lmm, lmmsize, it,
+                                     flags, reqp, cb_blocking);
 
         if (rc == 0 && (mea = lmv_splitted_dir_body(*reqp, 1))) {
                 /* wow! this is splitted dir, we'd like to handle it */
@@ -627,7 +640,7 @@ int lmv_revalidate_slaves(struct obd_export *exp, struct ptlrpc_request **reqp,
                 it.it_op = IT_GETATTR;
                 cb = lmv_dirobj_blocking_ast;
 
-                if (lmv_id_equal(&id, &obj->id)) {
+                if (id_equal_fid(&id, &obj->id)) {
                         if (master_valid) {
                                 /* lmv_intent_getattr() already checked
                                  * validness and took the lock */
@@ -719,9 +732,10 @@ release_lock:
                 body->size = size;
                 
                 if (mreq == NULL) {
-                        /* very important to maintain lli->mds the same because
-                         * of revalidation. mreq == NULL means that caller has
-                         * no reply and the only attr we can return is size */
+                        /* very important to maintain id_group(lli->lli_id) the
+                         * same because of revalidation. mreq == NULL means that
+                         * caller has no reply and the only attr we can return
+                         * is size */
                         body->valid = OBD_MD_FLSIZE;
 //                        body->mds = id_group(&obj->id);
                 }
@@ -738,8 +752,10 @@ release_lock:
                         oit->d.lustre.it_lock_mode = master_lock_mode;
                 rc = 1;
         }
+
+        EXIT;
 cleanup:
         lmv_unlock_obj(obj);
         lmv_put_obj(obj);
-        RETURN(rc);
+        return rc;
 }