From f4bdf481ff8302ea9dd4283b7f54269c21aa3f50 Mon Sep 17 00:00:00 2001 From: huanghua Date: Fri, 14 Jul 2006 07:31:08 +0000 Subject: [PATCH] some fix in open --- lustre/include/lustre_req_layout.h | 1 + lustre/mdt/mdt_handler.c | 2 +- lustre/mdt/mdt_open.c | 95 ++++++++++++++++++++++++-------------- lustre/ptlrpc/layout.c | 6 +++ 4 files changed, 68 insertions(+), 36 deletions(-) diff --git a/lustre/include/lustre_req_layout.h b/lustre/include/lustre_req_layout.h index 9f27a59c..d483764 100644 --- a/lustre/include/lustre_req_layout.h +++ b/lustre/include/lustre_req_layout.h @@ -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; diff --git a/lustre/mdt/mdt_handler.c b/lustre/mdt/mdt_handler.c index 5996d90..ea7278f 100644 --- a/lustre/mdt/mdt_handler.c +++ b/lustre/mdt/mdt_handler.c @@ -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) diff --git a/lustre/mdt/mdt_open.c b/lustre/mdt/mdt_open.c index a9c700b..e749363 100644 --- a/lustre/mdt/mdt_open.c +++ b/lustre/mdt/mdt_open.c @@ -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), diff --git a/lustre/ptlrpc/layout.c b/lustre/ptlrpc/layout.c index 9b95b3c..e94b453 100644 --- a/lustre/ptlrpc/layout.c +++ b/lustre/ptlrpc/layout.c @@ -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); -- 1.8.3.1