From c9f165bc19b95235b8d5001a4ec091aa6c094932 Mon Sep 17 00:00:00 2001 From: tappro Date: Sun, 6 Aug 2006 21:16:50 +0000 Subject: [PATCH] - use md_attr in mo_attr_set() and set lov ea together with inode attr. - while attr_set() return resulting attr back - move O_EXCL check later, because reply should contain the FID --- lustre/cmm/cmm_object.c | 4 ++-- lustre/include/md_object.h | 4 ++-- lustre/mdd/mdd_handler.c | 58 +++++++++++++++++++++++++++------------------- lustre/mdt/mdt_handler.c | 7 +++--- lustre/mdt/mdt_lib.c | 45 +++++++++++++++++++---------------- lustre/mdt/mdt_open.c | 24 ++++++++++++------- lustre/mdt/mdt_reint.c | 17 ++------------ 7 files changed, 85 insertions(+), 74 deletions(-) diff --git a/lustre/cmm/cmm_object.c b/lustre/cmm/cmm_object.c index 7884c89..c9b4806 100644 --- a/lustre/cmm/cmm_object.c +++ b/lustre/cmm/cmm_object.c @@ -231,7 +231,7 @@ static int cml_attr_get(const struct lu_context *ctx, struct md_object *mo, } static int cml_attr_set(const struct lu_context *ctx, struct md_object *mo, - const struct lu_attr *attr) + struct md_attr *attr) { int rc; ENTRY; @@ -561,7 +561,7 @@ static int cmr_attr_get(const struct lu_context *ctx, struct md_object *mo, } static int cmr_attr_set(const struct lu_context *ctx, struct md_object *mo, - const struct lu_attr *attr) + struct md_attr *attr) { RETURN(-EFAULT); } diff --git a/lustre/include/md_object.h b/lustre/include/md_object.h index aad5d66..53e2a0b 100644 --- a/lustre/include/md_object.h +++ b/lustre/include/md_object.h @@ -83,7 +83,7 @@ struct md_object_operations { int (*moo_attr_get)(const struct lu_context *ctxt, struct md_object *dt, struct md_attr *attr); int (*moo_attr_set)(const struct lu_context *ctxt, struct md_object *dt, - const struct lu_attr *attr); + struct md_attr *attr); int (*moo_xattr_get)(const struct lu_context *ctxt, struct md_object *obj, @@ -247,7 +247,7 @@ static inline int mo_readlink(const struct lu_context *cx, struct md_object *m, } static inline int mo_attr_set(const struct lu_context *cx, struct md_object *m, - const struct lu_attr *at) + struct md_attr *at) { LASSERT(m->mo_ops->moo_attr_set); return m->mo_ops->moo_attr_set(cx, m, at); diff --git a/lustre/mdd/mdd_handler.c b/lustre/mdd/mdd_handler.c index 4479963..0e1f301 100644 --- a/lustre/mdd/mdd_handler.c +++ b/lustre/mdd/mdd_handler.c @@ -142,12 +142,12 @@ static int mdd_attr_get(const struct lu_context *ctxt, if (rc == 0) { LASSERT((ma->ma_attr.la_mode & S_IFMT) == (obj->mo_lu.lo_header->loh_attr & S_IFMT)); - ma->ma_valid |= MA_INODE; + ma->ma_valid = MA_INODE; /* get LOV EA also */ if ((S_ISREG(ma->ma_attr.la_mode) || S_ISDIR(ma->ma_attr.la_mode)) && ma->ma_lmm != 0 && ma->ma_lmm_size > 0) { - rc = mdd_get_md(ctxt, obj, ma->ma_lmm,&ma->ma_lmm_size); + rc = mdd_get_md(ctxt, obj, ma->ma_lmm, &ma->ma_lmm_size); if (rc > 0) { ma->ma_valid |= MA_LOV; rc = 0; @@ -445,18 +445,32 @@ static int __mdd_object_create(const struct lu_context *ctxt, RETURN(rc); } -static int __mdd_attr_set(const struct lu_context *ctxt, struct md_object *obj, +static int __mdd_attr_set(const struct lu_context *ctxt, struct mdd_object *o, const struct lu_attr *attr, struct thandle *handle) { struct dt_object *next; - LASSERT(lu_object_exists(ctxt, &obj->mo_lu)); - next = mdd_object_child(md2mdd_obj(obj)); + LASSERT(lu_object_exists(ctxt, mdd2lu_obj(o))); + next = mdd_object_child(o); return next->do_ops->do_attr_set(ctxt, next, attr, handle); } +static int __mdd_xattr_set(const struct lu_context *ctxt, struct mdd_object *o, + const void *buf, int buf_len, const char *name, + int fl, struct thandle *handle) +{ + struct dt_object *next; + + LASSERT(lu_object_exists(ctxt, mdd2lu_obj(o))); + next = mdd_object_child(o); + return next->do_ops->do_xattr_set(ctxt, next, buf, buf_len, name, fl, + handle); +} + + +/* set attr and LOV EA at once, return updated attr */ static int mdd_attr_set(const struct lu_context *ctxt, - struct md_object *obj, const struct lu_attr *attr) + struct md_object *obj, struct md_attr *ma) { struct mdd_object *mdo = md2mdd_obj(obj); struct mdd_device *mdd = mdo2mdd(obj); @@ -470,39 +484,35 @@ static int mdd_attr_set(const struct lu_context *ctxt, RETURN(PTR_ERR(handle)); mdd_lock(ctxt, mdo, DT_WRITE_LOCK); - rc = __mdd_attr_set(ctxt, obj, attr, handle); - mdd_unlock(ctxt, mdo, DT_WRITE_LOCK); + rc = __mdd_attr_set(ctxt, md2mdd_obj(obj), &ma->ma_attr, handle); + if (rc == 0 && (ma->ma_valid & MA_LOV)) { + /* set LOV ea now */ + rc = __mdd_xattr_set(ctxt, md2mdd_obj(obj), + ma->ma_lmm, ma->ma_lmm_size, + XATTR_NAME_LOV, 0, handle); + } + /* XXX: llog cancel cookie? */ + + if (rc == 0) + rc = mdd_attr_get(ctxt, obj, ma); + + mdd_unlock(ctxt, mdo, DT_WRITE_LOCK); mdd_trans_stop(ctxt, mdd, handle); RETURN(rc); } -static int __mdd_xattr_set(const struct lu_context *ctxt,struct mdd_device *mdd, - struct mdd_object *obj, const void *buf, - int buf_len, const char *name, int fl, - struct thandle *handle) -{ - struct dt_object *next; - - LASSERT(lu_object_exists(ctxt, mdd2lu_obj(obj))); - next = mdd_object_child(obj); - return next->do_ops->do_xattr_set(ctxt, next, buf, buf_len, name, fl, - handle); -} - int mdd_xattr_set_txn(const struct lu_context *ctxt, struct md_object *obj, const void *buf, int buf_len, const char *name, int fl, struct thandle *handle) { struct mdd_object *mdo = md2mdd_obj(obj); - struct mdd_device *mdd = mdo2mdd(obj); int rc; ENTRY; - mdd_lock(ctxt, mdo, DT_WRITE_LOCK); - rc = __mdd_xattr_set(ctxt, mdd, md2mdd_obj(obj), buf, buf_len, name, + rc = __mdd_xattr_set(ctxt, md2mdd_obj(obj), buf, buf_len, name, fl, handle); mdd_unlock(ctxt, mdo, DT_WRITE_LOCK); diff --git a/lustre/mdt/mdt_handler.c b/lustre/mdt/mdt_handler.c index e8bdf43..0715451 100644 --- a/lustre/mdt/mdt_handler.c +++ b/lustre/mdt/mdt_handler.c @@ -247,7 +247,8 @@ static int mdt_getattr_internal(struct mdt_thread_info *info, mdt_pack_attr2body(repbody, la, mdt_object_fid(o)); if (mdt_body_has_lov(la, reqbody)) { - if (ma->ma_lmm_size && ma->ma_valid & MA_LOV) { + if (/*ma->ma_lmm_size && */(ma->ma_valid & MA_LOV)) { + LASSERT(ma->ma_lmm_size); CDEBUG(D_INODE, "packing ea for "DFID3"\n", PFID3(mdt_object_fid(o))); mdt_dump_lmm(D_INFO, ma->ma_lmm); @@ -263,9 +264,9 @@ static int mdt_getattr_internal(struct mdt_thread_info *info, } else { repbody->valid |= OBD_MD_LINKNAME; repbody->eadatasize = rc + 1; - ((char*)ma->ma_lmm)[rc] = 0; /* NULL terminate */ + ((char*)ma->ma_lmm)[rc] = 0; /* NULL terminate */ CDEBUG(D_INODE, "symlink dest %s, len = %d\n", - (char*)buffer, rc); + (char*)ma->ma_lmm, rc); rc = 0; } } diff --git a/lustre/mdt/mdt_lib.c b/lustre/mdt/mdt_lib.c index feabe4f..0106db1 100644 --- a/lustre/mdt/mdt_lib.c +++ b/lustre/mdt/mdt_lib.c @@ -112,13 +112,14 @@ int mdt_handle_last_unlink(struct mdt_thread_info *info, struct mdt_object *mo, &RMF_MDT_BODY); if (ma->ma_valid & MA_INODE) mdt_pack_attr2body(repbody, la, mdt_object_fid(mo)); - if (ma->ma_lmm_size && ma->ma_valid & MA_LOV) { + if (/*ma->ma_lmm_size && */(ma->ma_valid & MA_LOV)) { + LASSERT(ma->ma_lmm_size); mdt_dump_lmm(D_INFO, ma->ma_lmm); repbody->eadatasize = ma->ma_lmm_size; repbody->valid |= OBD_MD_FLEASIZE; } - if (ma->ma_cookie_size && ma->ma_valid & MA_COOKIE) + if (ma->ma_cookie_size && (ma->ma_valid & MA_COOKIE)) repbody->valid |= OBD_MD_FLCOOKIE; } @@ -129,7 +130,8 @@ int mdt_handle_last_unlink(struct mdt_thread_info *info, struct mdt_object *mo, static int mdt_setattr_unpack(struct mdt_thread_info *info) { struct mdt_rec_setattr *rec; - struct lu_attr *attr = &info->mti_attr.ma_attr; + struct md_attr *ma = &info->mti_attr; + struct lu_attr *la = &ma->ma_attr; struct mdt_reint_record *rr = &info->mti_rr; struct req_capsule *pill = &info->mti_pill; ENTRY; @@ -140,27 +142,30 @@ static int mdt_setattr_unpack(struct mdt_thread_info *info) RETURN(-EFAULT); rr->rr_fid1 = &rec->sa_fid; - attr->la_valid = rec->sa_valid; - attr->la_mode = rec->sa_mode; - attr->la_uid = rec->sa_uid; - attr->la_gid = rec->sa_gid; - attr->la_size = rec->sa_size; - attr->la_flags = rec->sa_attr_flags; - attr->la_ctime = rec->sa_ctime; - attr->la_atime = rec->sa_atime; - attr->la_mtime = rec->sa_mtime; + la->la_valid = rec->sa_valid; + la->la_mode = rec->sa_mode; + la->la_uid = rec->sa_uid; + la->la_gid = rec->sa_gid; + la->la_size = rec->sa_size; + la->la_flags = rec->sa_attr_flags; + la->la_ctime = rec->sa_ctime; + la->la_atime = rec->sa_atime; + la->la_mtime = rec->sa_mtime; + ma->ma_valid = MA_INODE; if (req_capsule_field_present(pill, &RMF_EADATA)) { - rr->rr_eadata = req_capsule_client_get(pill, &RMF_EADATA); - rr->rr_eadatalen = req_capsule_get_size(pill, &RMF_EADATA, - RCL_CLIENT); + ma->ma_lmm = req_capsule_client_get(pill, &RMF_EADATA); + ma->ma_lmm_size = req_capsule_get_size(pill, &RMF_EADATA, + RCL_CLIENT); + ma->ma_valid |= MA_LOV; } if (req_capsule_field_present(pill, &RMF_LOGCOOKIES)) { - rr->rr_logcookies = req_capsule_client_get(pill, - &RMF_LOGCOOKIES); - rr->rr_logcookielen = req_capsule_get_size(pill, - &RMF_LOGCOOKIES, - RCL_CLIENT); + ma->ma_cookie = req_capsule_client_get(pill, + &RMF_LOGCOOKIES); + ma->ma_cookie_size = req_capsule_get_size(pill, + &RMF_LOGCOOKIES, + RCL_CLIENT); + ma->ma_valid |= MA_COOKIE; } RETURN(0); diff --git a/lustre/mdt/mdt_open.c b/lustre/mdt/mdt_open.c index 2f05e25..3b08886 100644 --- a/lustre/mdt/mdt_open.c +++ b/lustre/mdt/mdt_open.c @@ -189,12 +189,18 @@ static int mdt_mfd_open(struct mdt_thread_info *info, if (rc) RETURN(rc); } + isreg = S_ISREG(la->la_mode); isdir = S_ISDIR(la->la_mode); islnk = S_ISLNK(la->la_mode); if (ma->ma_valid & MA_INODE) mdt_pack_attr2body(repbody, la, mdt_object_fid(o)); + /* this check need to return the exists object's fid back, so it is done + * here, after preparing the reply */ + if (!created && (flags & MDS_OPEN_EXCL) && (flags & MDS_OPEN_CREAT)) + RETURN (-EEXIST); + /* if we are following a symlink, don't open * do not return open handle for special nodes as client required */ @@ -203,7 +209,7 @@ static int mdt_mfd_open(struct mdt_thread_info *info, info->mti_trans_flags |= MDT_NONEED_TANSNO; RETURN(0); } - /* FIXME:maybe this can be done earlier? */ + /* This can't be done earlier, we need to return reply body */ if (isdir) { if (flags & (MDS_OPEN_CREAT | FMODE_WRITE)) { /* we are trying to create or @@ -213,6 +219,7 @@ static int mdt_mfd_open(struct mdt_thread_info *info, } else if (flags & MDS_OPEN_DIRECTORY) RETURN(-ENOTDIR); +#if 0 if ((isreg) && !(ma->ma_valid & MA_LOV)) { /*No EA, check whether it is will set regEA and dirEA *since in above attr get, these size might be zero, @@ -227,13 +234,14 @@ static int mdt_mfd_open(struct mdt_thread_info *info, RETURN(rc); */ } - +#endif CDEBUG(D_INODE, "after open, ma_valid bit = "LPX64" lmm_size = %d\n", ma->ma_valid, ma->ma_lmm_size); repbody->eadatasize = 0; repbody->aclsize = 0; - if (ma->ma_lmm_size && ma->ma_valid & MA_LOV) { + if (/*ma->ma_lmm_size && */ma->ma_valid & MA_LOV) { + LASSERT(ma->ma_lmm_size); repbody->eadatasize = ma->ma_lmm_size; if (isdir) repbody->valid |= OBD_MD_FLDIREA; @@ -413,11 +421,11 @@ int mdt_reint_open(struct mdt_thread_info *info) /* new object will be created. see the following */ } else { intent_set_disposition(ldlm_rep, DISP_LOOKUP_POS); - if ((la->la_flags & MDS_OPEN_EXCL && - la->la_flags & MDS_OPEN_CREAT)) - GOTO(out_parent, result = -EEXIST); + /* check for O_EXCL is moved to the mdt_mfd_open, we need to + * return FID back in that case */ } + child = mdt_object_find(info->mti_ctxt, mdt, child_fid); if (IS_ERR(child)) GOTO(out_parent, result = PTR_ERR(child)); @@ -437,7 +445,7 @@ int mdt_reint_open(struct mdt_thread_info *info) created = 1; } - /* Open it now. */ + /* Try to open it now. */ result = mdt_mfd_open(info, parent, child, la->la_flags, created); GOTO(finish_open, result); @@ -504,7 +512,7 @@ int mdt_close(struct mdt_thread_info *info) o = mfd->mfd_object; ma->ma_lmm = req_capsule_server_get(&info->mti_pill, - &RMF_MDT_MD); + &RMF_MDT_MD); ma->ma_lmm_size = req_capsule_get_size(&info->mti_pill, &RMF_MDT_MD, RCL_SERVER); rc = mo_attr_get(info->mti_ctxt, mdt_object_child(o), ma); diff --git a/lustre/mdt/mdt_reint.c b/lustre/mdt/mdt_reint.c index 854822c..5246e8b 100644 --- a/lustre/mdt/mdt_reint.c +++ b/lustre/mdt/mdt_reint.c @@ -158,11 +158,8 @@ static int mdt_reint_setattr(struct mdt_thread_info *info) if (lu_object_exists(info->mti_ctxt, &mo->mot_obj.mo_lu) <= 0) GOTO(out_unlock, rc = -ENOENT); - rc = mo_attr_set(info->mti_ctxt, next, attr); - if (rc != 0) - GOTO(out_unlock, rc); - - rc = mo_attr_get(info->mti_ctxt, next, &info->mti_attr); + /* all attrs are packed into mti_attr in unpack_setattr */ + rc = mo_attr_set(info->mti_ctxt, next, &info->mti_attr); if (rc != 0) GOTO(out_unlock, rc); @@ -177,16 +174,6 @@ static int mdt_reint_setattr(struct mdt_thread_info *info) if (valid & (ATTR_ATIME | ATTR_ATIME_SET)) repbody->valid |= OBD_MD_FLATIME; */ - /* FIXME: I have to combine the attr_set & xattr_set into one single - transaction. How can I? - */ - - if (rr->rr_eadatalen > 0) - rc = mo_xattr_set(info->mti_ctxt, next, - rr->rr_eadata, rr->rr_eadatalen, - XATTR_NAME_LOV, 0); - - /* FIXME & TODO Please deal with logcookies here*/ GOTO(out_unlock, rc); out_unlock: mdt_object_unlock_put(info, mo, lh, rc); -- 1.8.3.1