Whamcloud - gitweb
b=2185
[fs/lustre-release.git] / lustre / mds / mds_open.c
index 14d740b..510d844 100644 (file)
@@ -390,21 +390,10 @@ static int mds_create_objects(struct ptlrpc_request *req, int offset,
                         if (rc)
                                 GOTO(out_oa, rc);
                 } else {
-                        OBD_ALLOC(lmm, mds->mds_max_mdsize);
-                        if (lmm == NULL)
-                                GOTO(out_oa, rc = -ENOMEM);
-                                                                                                                                                                                                     
-                        lmm_size = mds->mds_max_mdsize;
-                        rc = mds_get_md(obd, dchild->d_parent->d_inode,
-                                        lmm, &lmm_size, 1);
-                        if (rc > 0)
-                                rc = obd_iocontrol(OBD_IOC_LOV_SETSTRIPE,
-                                                   mds->mds_osc_exp,
-                                                   0, &lsm, lmm);
-                        OBD_FREE(lmm, mds->mds_max_mdsize);
-                        if (rc)
-                                GOTO(out_oa, rc);
-                }
+                        /* Per-directory striping default code removed, because
+                         * it uses the same unnamed EA storage as the directory
+                         * striping for CMD. -p */
+                } 
                 LASSERT(oa->o_gr >= FILTER_GROUP_FIRST_MDS);
                 rc = obd_create(mds->mds_osc_exp, oa, &lsm, &oti);
                 if (rc) {
@@ -652,8 +641,20 @@ static int mds_finish_open(struct ptlrpc_request *req, struct dentry *dchild,
                         up(&dchild->d_inode->i_sem);
                         RETURN(rc);
                 }
+                if (S_ISREG(dchild->d_inode->i_mode) &&
+                    (body->valid & OBD_MD_FLEASIZE)) {
+                        rc = mds_revalidate_lov_ea(obd, dchild->d_inode,
+                                                   req->rq_repmsg, 2);
+                        if (!rc)
+                                rc = mds_pack_md(obd, req->rq_repmsg, 2, body,
+                                                 dchild->d_inode, 0);
+                        if (rc) {
+                                up(&dchild->d_inode->i_sem);
+                                RETURN(rc);
+                        }
+                }
         }
-        /* If the inode has EA data, then OSTs hold size, mtime */
+        /* If the inode has no EA data, then MDSs hold size, mtime */
         if (S_ISREG(dchild->d_inode->i_mode) &&
             !(body->valid & OBD_MD_FLEASIZE)) {
                 body->valid |= (OBD_MD_FLSIZE | OBD_MD_FLBLOCKS |
@@ -817,6 +818,10 @@ int mds_open(struct mds_update_record *rec, int offset,
         int mea_size, update_mode;
         ENTRY;
 
+        DEBUG_REQ(D_INODE, req, "parent "LPU64"/%u name %*s mode %o",
+                  rec->ur_fid1->id, rec->ur_fid1->generation,
+                  rec->ur_namelen - 1, rec->ur_name, rec->ur_mode);
+
         parent_lockh[0].cookie = 0;
         parent_lockh[1].cookie = 0;
 
@@ -908,9 +913,13 @@ int mds_open(struct mds_update_record *rec, int offset,
                  * should live at this MDS or at another one */
                 int i;
                 i = mea_name2idx(mea, rec->ur_name, rec->ur_namelen - 1);
-                if (mea->mea_master != i) {
-                        CERROR("inapropriate MDS(%d) for %s. should be %d\n",
-                                mea->mea_master, rec->ur_name, i);
+                if (mea->mea_master != mea->mea_fids[i].mds) {
+                        CDEBUG(D_OTHER,
+                               "%s: inapropriate MDS(%d) for %lu/%u:%s."
+                               " should be %d(%d)\n", obd->obd_name,
+                               mea->mea_master, dparent->d_inode->i_ino,
+                               dparent->d_inode->i_generation, rec->ur_name,
+                               mea->mea_fids[i].mds, i);
                         GOTO(cleanup, rc = -ERESTART);
                 }
         }
@@ -972,15 +981,16 @@ got_child:
                 unsigned long ino = rec->ur_fid2->id;
                 struct iattr iattr;
                 struct inode *inode;
-
-                if ((rc = mds_try_to_split_dir(obd, dparent, &mea, 0))) {
-                        if (rc > 0) {
-                                /* dir got splitted */
-                                GOTO(cleanup, rc = -ERESTART);
-                        } else {
-                                /* error happened during spitting */
-                                GOTO(cleanup, rc);
-                        }
+                rc = mds_try_to_split_dir(obd, dparent, &mea, 0, update_mode);
+                CDEBUG(D_OTHER, "%s: splitted %lu/%u - %d\n",
+                       obd->obd_name, dparent->d_inode->i_ino,
+                       dparent->d_inode->i_generation, rc);
+                if (rc > 0) {
+                        /* dir got splitted */
+                        GOTO(cleanup, rc = -ERESTART);
+                } else if (rc < 0) {
+                        /* error happened during spitting */
+                        GOTO(cleanup, rc);
                 }
 
                 if (!(rec->ur_flags & MDS_OPEN_CREAT)) {
@@ -1099,24 +1109,6 @@ got_child:
                 }
         }
 
-        if (rc == 0) {
-                struct ldlm_res_id res_id = { . name = {0} };
-                ldlm_policy_data_t policy;
-                int flags = 0;
-                res_id.name[0] = dchild->d_inode->i_ino;
-                res_id.name[1] = dchild->d_inode->i_generation;
-                policy.l_inodebits.bits = MDS_INODELOCK_LOOKUP |
-                                                MDS_INODELOCK_UPDATE;
-                rc = ldlm_cli_enqueue(NULL, NULL, obd->obd_namespace,
-                                      res_id, LDLM_IBITS, &policy,
-                                      LCK_PR, &flags,
-                                      mds_blocking_ast,
-                                      ldlm_completion_ast, NULL, NULL,
-                                      NULL, 0, NULL, child_lockh);
-                if (rc == 0)
-                        cleanup_phase = 3;
-        }
-
         /* Step 5: mds_open it */
         rc = mds_finish_open(req, dchild, body, rec->ur_flags, &handle, rec,
                              rep);
@@ -1127,9 +1119,6 @@ got_child:
                                 req, rc, rep ? rep->lock_policy_res1 : 0);
 
         switch (cleanup_phase) {
-        case 3:
-                if (rc)
-                        ldlm_lock_decref(child_lockh, LCK_PR);
         case 2:
                 if (rc && created) {
                         int err = vfs_unlink(dparent->d_inode, dchild);
@@ -1139,7 +1128,9 @@ got_child:
                                        err);
                         }
                 } else if (created) {
+#if 0
                         mds_lock_new_child(obd, dchild->d_inode, NULL);
+#endif
                 }
                 l_dput(dchild);
         case 1:
@@ -1160,8 +1151,6 @@ got_child:
                 atomic_inc(&mds->mds_open_count);
         if (mea)
                 OBD_FREE(mea, mea_size);
-        if ((cleanup_phase != 3) && !rc)
-                rc = ENOLCK;
         RETURN(rc);
 }