From b6e6a2b9d6d2bd9aa2ed486322dc6edbdc7964dd Mon Sep 17 00:00:00 2001 From: tappro Date: Wed, 24 May 2006 00:23:19 +0000 Subject: [PATCH] add initial support for open() --- lustre/mdt/mdt_handler.c | 1 + lustre/mdt/mdt_internal.h | 1 + lustre/mdt/mdt_lib.c | 20 ++++++++++- lustre/mdt/mdt_reint.c | 90 ++++++++++++++++++++++++++++++++++++++++++++++- 4 files changed, 110 insertions(+), 2 deletions(-) diff --git a/lustre/mdt/mdt_handler.c b/lustre/mdt/mdt_handler.c index 94ef160..90a8540 100644 --- a/lustre/mdt/mdt_handler.c +++ b/lustre/mdt/mdt_handler.c @@ -180,6 +180,7 @@ static int mdt_getattr(struct mdt_thread_info *info, info->mti_body = lustre_msg_buf(req->rq_repmsg, 0, sizeof(struct mdt_body)); mdt_pack_attr2body(info->mti_body, &info->mti_attr); + info->mti_body->fid1 = *mdt_object_fid(info->mti_object); info->mti_body->valid |= OBD_MD_FLID; } } diff --git a/lustre/mdt/mdt_internal.h b/lustre/mdt/mdt_internal.h index ccaa9e3..c6820cb 100644 --- a/lustre/mdt/mdt_internal.h +++ b/lustre/mdt/mdt_internal.h @@ -129,6 +129,7 @@ struct mdt_reint_record { struct lu_fid *rr_fid2; char *rr_name; char *rr_tgt; + __u32 rr_flags; }; /* diff --git a/lustre/mdt/mdt_lib.c b/lustre/mdt/mdt_lib.c index af34290..bd296b7 100644 --- a/lustre/mdt/mdt_lib.c +++ b/lustre/mdt/mdt_lib.c @@ -101,8 +101,26 @@ static int mdt_open_unpack(struct mdt_thread_info *info, struct ptlrpc_request *req, int offset) { + struct mdt_rec_create *rec; + struct lu_attr *attr = &info->mti_attr; + struct mdt_reint_record *rr = &info->mti_rr; ENTRY; - RETURN(-EOPNOTSUPP); + + rec = lustre_swab_reqbuf(req, offset, sizeof (*rec), + lustre_swab_mdt_rec_create); + if (rec == NULL) + RETURN(-EFAULT); + + rr->rr_fid1 = &rec->cr_fid1; + rr->rr_fid2 = &rec->cr_fid2; + attr->la_mode = rec->cr_mode; + rr->rr_flags = rec->cr_flags; + + rr->rr_name = lustre_msg_string(req->rq_reqmsg, offset + 1, 0); + if (rr->rr_name == NULL) + RETURN (-EFAULT); + + RETURN(0); } typedef int (*reint_unpacker)(struct mdt_thread_info *info, diff --git a/lustre/mdt/mdt_reint.c b/lustre/mdt/mdt_reint.c index 38885f3..65c00ae 100644 --- a/lustre/mdt/mdt_reint.c +++ b/lustre/mdt/mdt_reint.c @@ -38,6 +38,45 @@ /* object operations */ +static int mdt_md_open(struct mdt_thread_info *info, struct mdt_object *obj) +{ + return 0; +} + +static int mdt_md_create(struct mdt_thread_info *info) +{ + struct mdt_device *mdt = info->mti_mdt; + struct mdt_object *parent; + struct mdt_object *child; + struct mdt_lock_handle *lh; + + int result; + + lh = &info->mti_lh[MDT_LH_PARENT]; + lh->mlh_mode = LCK_PW; + + parent = mdt_object_find_lock(info->mti_ctxt, + mdt, info->mti_rr.rr_fid1, + lh, + MDS_INODELOCK_UPDATE); + if (IS_ERR(parent)) + return PTR_ERR(parent); + + child = mdt_object_find(info->mti_ctxt, mdt, info->mti_rr.rr_fid2); + if (!IS_ERR(child)) { + struct md_object *next = mdt_object_child(parent); + + result = mdo_create(info->mti_ctxt, &info->mti_attr, next, + info->mti_rr.rr_name, + mdt_object_child(child)); + mdt_object_put(info->mti_ctxt, child); + } else + result = PTR_ERR(child); + mdt_object_unlock(mdt->mdt_namespace, parent, lh); + mdt_object_put(info->mti_ctxt, parent); + return result; +} + static int mdt_md_mkdir(struct mdt_thread_info *info) { struct mdt_device *mdt = info->mti_mdt; @@ -163,8 +202,57 @@ static int mdt_reint_rename(struct mdt_thread_info *info) static int mdt_reint_open(struct mdt_thread_info *info) { + struct mdt_device *mdt = info->mti_mdt; + struct mdt_object *parent; + struct mdt_object *child; + struct mdt_lock_handle *lh; + int result; + ENTRY; - RETURN(-EOPNOTSUPP); + + lh = &info->mti_lh[MDT_LH_PARENT]; + lh->mlh_mode = LCK_PW; + + parent = mdt_object_find_lock(info->mti_ctxt, + mdt, info->mti_rr.rr_fid1, + lh, + MDS_INODELOCK_UPDATE); + if (IS_ERR(parent)) + return PTR_ERR(parent); + + result = mdo_lookup(info->mti_ctxt, mdt_object_child(parent), + info->mti_rr.rr_name, info->mti_rr.rr_fid2); + if (result && result != -ENOENT) { + GOTO(out_parent, result); + } + + child = mdt_object_find(info->mti_ctxt, mdt, info->mti_rr.rr_fid2); + if (IS_ERR(child)) + GOTO(out_parent, PTR_ERR(child)); + + if (info->mti_rr.rr_flags & MDS_OPEN_CREAT) { + if (result == -ENOENT) { + /* let's create something */ + result = mdo_create(info->mti_ctxt, &info->mti_attr, + mdt_object_child(parent), + info->mti_rr.rr_name, + mdt_object_child(child)); + } else if (info->mti_rr.rr_flags & MDS_OPEN_EXCL) { + result = -EEXIST; + } + } + + if (result) + GOTO(out_parent, result); + + result = mdt_md_open(info, child); + + mdt_object_put(info->mti_ctxt, child); + +out_parent: + mdt_object_unlock(mdt->mdt_namespace, parent, lh); + mdt_object_put(info->mti_ctxt, parent); + RETURN(result); } -- 1.8.3.1