Whamcloud - gitweb
some fix in open
authorhuanghua <huanghua>
Fri, 14 Jul 2006 07:31:08 +0000 (07:31 +0000)
committerhuanghua <huanghua>
Fri, 14 Jul 2006 07:31:08 +0000 (07:31 +0000)
lustre/include/lustre_req_layout.h
lustre/mdt/mdt_handler.c
lustre/mdt/mdt_open.c
lustre/ptlrpc/layout.c

index 9f27a59..d483764 100644 (file)
@@ -96,6 +96,7 @@ extern const struct req_format RQF_MDS_GETXATTR;
 extern const struct req_format RQF_MDS_SETXATTR;
 extern const struct req_format RQF_MDS_GETATTR;
 extern const struct req_format RQF_MDS_CLOSE;
+extern const struct req_format RQF_MDS_PIN;
 extern const struct req_format RQF_MDS_CLOSE_LAST;
 extern const struct req_format RQF_MDS_CONNECT;
 extern const struct req_format RQF_MDS_DISCONNECT;
index 5996d90..ea7278f 100644 (file)
@@ -2721,7 +2721,7 @@ DEF_MDT_HNDL_F(HABEO_CORPUS,              READPAGE,     mdt_readpage),
 DEF_MDT_HNDL_F(0,                         REINT,        mdt_reint),
 DEF_MDT_HNDL_F(HABEO_CORPUS|HABEO_REFERO, CLOSE,        mdt_close),
 DEF_MDT_HNDL_0(0,                         DONE_WRITING, mdt_done_writing),
-DEF_MDT_HNDL_0(0,                         PIN,          mdt_pin),
+DEF_MDT_HNDL_F(0           |HABEO_REFERO, PIN,          mdt_pin),
 DEF_MDT_HNDL_0(0,                         SYNC,         mdt_sync),
 DEF_MDT_HNDL_0(0,                         QUOTACHECK,   mdt_handle_quotacheck),
 DEF_MDT_HNDL_0(0,                         QUOTACTL,     mdt_handle_quotactl)
index a9c700b..e749363 100644 (file)
@@ -89,45 +89,69 @@ static void mdt_mfd_put(struct mdt_file_data *mfd)
         }
 }
 
-static int mdt_object_open(struct mdt_thread_info *info,
-                           struct mdt_object *o, 
-                           int flags)
+static int mdt_mfd_open(struct mdt_thread_info *info,
+                        struct mdt_object *o, 
+                        int flags, struct ldlm_reply *rep)
 {
         struct mdt_export_data *med;
         struct mdt_file_data   *mfd;
         struct mdt_body        *repbody;
-        struct lov_mds_md      *lmm;
+        struct lov_mds_md      *lmm = NULL;
+        struct lu_attr         *attr = &info->mti_attr;
+        struct ptlrpc_request  *req = mdt_info_req(info);
         int                     rc = 0;
         ENTRY;
 
         med = &mdt_info_req(info)->rq_export->exp_mdt_data;
         repbody = req_capsule_server_get(&info->mti_pill, &RMF_MDT_BODY);
-        lmm = req_capsule_server_get(&info->mti_pill, &RMF_MDT_MD);
-
-        rc = mo_attr_get(info->mti_ctxt, mdt_object_child(o),
-                         &info->mti_attr);
-        if (rc == -EREMOTE) {
-                repbody->fid1 = *mdt_object_fid(o);
-                repbody->valid |= OBD_MD_FLID;
-                /*FIXME: should be return 0 or -EREMOTE? */
-                /* also in mdt_reint:mdt_md_create() */
+        if (req_capsule_has_field(&info->mti_pill, &RMF_MDT_MD))
+                lmm = req_capsule_server_get(&info->mti_pill, &RMF_MDT_MD);
+
+        rc = mo_attr_get(info->mti_ctxt, mdt_object_child(o), attr);
+        if (rc == 0) {
+                if (!S_ISREG(attr->la_mode) &&
+                    !S_ISDIR(attr->la_mode) &&
+                     (req->rq_export->exp_connect_flags & OBD_CONNECT_NODEVOH))
+                        /* If client supports this, do not return open handle
+                        *  for special device nodes */
+                        RETURN(0);
+
+                if (S_ISDIR(attr->la_mode)) {
+                        if (flags & MDS_OPEN_CREAT || flags & FMODE_WRITE) {
+                                /* we are trying to create or 
+                                 * write an existing dir. */
+                                rc = -EISDIR;
+                        }
+                } else if (flags & MDS_OPEN_DIRECTORY) 
+                        rc = -ENOTDIR;
         }
-        if (rc != 0)
+        intent_set_disposition(rep, DISP_OPEN_OPEN);
+        if (rc != 0) {
+                if (rc == -EREMOTE) {
+                        repbody->fid1 = *mdt_object_fid(o);
+                        repbody->valid |= OBD_MD_FLID;
+                        /*FIXME: should be return 0 or -EREMOTE? */
+                        /* also in mdt_reint:mdt_md_create() */
+                }
                 RETURN(rc);
+        }
 
-        mdt_pack_attr2body(repbody, &info->mti_attr, mdt_object_fid(o));
+        mdt_pack_attr2body(repbody, attr, mdt_object_fid(o));
 
 /*
-        rc = mo_xattr_get(info->mti_ctxt, mdt_object_child(o),
-                          lmm, info->mti_mdt->mdt_max_mdsize, "lov");
-        if (rc < 0)
-                RETURN(-EINVAL);
-        if (S_ISDIR(info->mti_attr.la_mode))
-                repbody->valid |= OBD_MD_FLDIREA;
-        else
-                repbody->valid |= OBD_MD_FLEASIZE;
-        repbody->eadatasize = rc;
-        rc = 0;
+        if (lmm) {
+                rc = mo_xattr_get(info->mti_ctxt, mdt_object_child(o),
+                                  lmm, info->mti_mdt->mdt_max_mdsize, 
+                                  XATTR_NAME_LOV);
+                if (rc < 0)
+                        RETURN(-EINVAL);
+                if (S_ISDIR(attr->la_mode))
+                        repbody->valid |= OBD_MD_FLDIREA;
+                else
+                        repbody->valid |= OBD_MD_FLEASIZE;
+                repbody->eadatasize = rc;
+                rc = 0;
+        }
 */
         if (flags & FMODE_WRITE) {
                 /*mds_get_write_access*/
@@ -170,8 +194,7 @@ int mdt_open_by_fid(struct mdt_thread_info* info, const struct lu_fid *fid,
         if (!IS_ERR(o)) {
                 if (mdt_object_exists(info->mti_ctxt, &o->mot_obj.mo_lu)) {
                         intent_set_disposition(rep, DISP_LOOKUP_POS);
-                        rc = mdt_object_open(info, o, flags);
-                        intent_set_disposition(rep, DISP_OPEN_OPEN);
+                        rc = mdt_mfd_open(info, o, flags ,rep);
                 } else {
                         intent_set_disposition(rep, DISP_LOOKUP_NEG);
                         rc = -ENOENT;
@@ -185,10 +208,15 @@ int mdt_open_by_fid(struct mdt_thread_info* info, const struct lu_fid *fid,
 
 int mdt_pin(struct mdt_thread_info* info)
 {
+        struct mdt_body *body;
         int rc;
         ENTRY;
-        rc = mdt_open_by_fid(info, &info->mti_body->fid1, 
-                             info->mti_body->flags, NULL);
+        
+        rc = req_capsule_pack(&info->mti_pill);
+        if (rc == 0) {
+                body = req_capsule_client_get(&info->mti_pill, &RMF_MDT_BODY);
+                rc = mdt_open_by_fid(info, &body->fid1, body->flags, NULL);
+        }
         RETURN(rc);
 }
 
@@ -227,7 +255,6 @@ int mdt_reint_open(struct mdt_thread_info *info)
         struct mdt_lock_handle *lh;
         struct ldlm_reply      *ldlm_rep;
         struct ptlrpc_request  *req = mdt_info_req(info);
-        struct mdt_body        *body;
         struct lu_fid          *child_fid = &info->mti_tmp_fid1;
         int                     result;
         int                     created = 0;
@@ -239,7 +266,6 @@ int mdt_reint_open(struct mdt_thread_info *info)
 
         /*TODO: MDS_CHECK_RESENT */;
         ldlm_rep = req_capsule_server_get(&info->mti_pill, &RMF_DLM_REP);
-        body = req_capsule_server_get(&info->mti_pill, &RMF_MDT_BODY);
 
         if (strlen(rr->rr_name) == 0) {
                 /* partial remote open */
@@ -299,11 +325,10 @@ int mdt_reint_open(struct mdt_thread_info *info)
         }
 
         /* Open it now. */
-        result = mdt_object_open(info, child, info->mti_attr.la_flags);
-        intent_set_disposition(ldlm_rep, DISP_OPEN_OPEN);
-        GOTO(destroy_child, result);
+        result = mdt_mfd_open(info, child, info->mti_attr.la_flags, ldlm_rep);
+        GOTO(finish_open, result);
 
-destroy_child:
+finish_open:
         if (created) {
                 if (result != 0 && result != -EREMOTE) {
                         mdo_unlink(info->mti_ctxt, mdt_object_child(parent),
index 9b95b3c..e94b453 100644 (file)
@@ -247,6 +247,7 @@ static const struct req_format *req_formats[] = {
         &RQF_MDS_SETXATTR,
         &RQF_MDS_SYNC,
         &RQF_MDS_CLOSE,
+        &RQF_MDS_PIN,
         &RQF_MDS_READPAGE,
         &RQF_MDS_REINT_UNLINK_LAST,
         &RQF_MDS_CLOSE_LAST,
@@ -546,6 +547,11 @@ const struct req_format RQF_MDS_CLOSE =
                         mdt_body_only, mdt_body_only);
 EXPORT_SYMBOL(RQF_MDS_CLOSE);
 
+const struct req_format RQF_MDS_PIN =
+        DEFINE_REQ_FMT0("MDS_PIN",
+                        mdt_body_only, mdt_body_only);
+EXPORT_SYMBOL(RQF_MDS_PIN);
+
 const struct req_format RQF_MDS_READPAGE =
         DEFINE_REQ_FMT0("MDS_READPAGE",
                         mdt_body_only, mdt_body_only);