From bec1e067eb45117119e957ce38b90cf2d31791ff Mon Sep 17 00:00:00 2001 From: huanghua Date: Fri, 23 Jun 2006 10:18:31 +0000 Subject: [PATCH] (1) more code for MDT in reint. (2) make some interface parameter const. --- lustre/cmm/cmm_object.c | 8 +-- lustre/include/dt_object.h | 6 +- lustre/include/lu_object.h | 4 ++ lustre/include/lustre/lustre_idl.h | 2 +- lustre/include/lustre_req_layout.h | 2 + lustre/include/md_object.h | 12 ++-- lustre/mdd/mdd_handler.c | 8 +-- lustre/mdt/mdt_handler.c | 79 +++++++++++------------ lustre/mdt/mdt_internal.h | 13 +++- lustre/mdt/mdt_lib.c | 125 +++++++++++++++++++++++++++++++++++-- lustre/mdt/mdt_reint.c | 95 ++++++++++++++++++++++++++-- lustre/mdt/mdt_xattr.c | 6 +- lustre/ptlrpc/layout.c | 38 ++++++++++- 13 files changed, 320 insertions(+), 78 deletions(-) diff --git a/lustre/cmm/cmm_object.c b/lustre/cmm/cmm_object.c index a425d4f..4ef52b1 100644 --- a/lustre/cmm/cmm_object.c +++ b/lustre/cmm/cmm_object.c @@ -242,7 +242,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, - struct lu_attr *attr) + const struct lu_attr *attr) { int rc; ENTRY; @@ -261,7 +261,7 @@ static int cml_xattr_get(const struct lu_context *ctx, struct md_object *mo, } static int cml_xattr_set(const struct lu_context *ctx, struct md_object *mo, - void *buf, int buflen, const char *name) + const void *buf, int buflen, const char *name) { int rc; ENTRY; @@ -503,7 +503,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, - struct lu_attr *attr) + const struct lu_attr *attr) { RETURN(-EFAULT); } @@ -515,7 +515,7 @@ static int cmr_xattr_get(const struct lu_context *ctx, struct md_object *mo, } static int cmr_xattr_set(const struct lu_context *ctx, struct md_object *mo, - void *buf, int buflen, const char *name) + const void *buf, int buflen, const char *name) { RETURN(-EFAULT); } diff --git a/lustre/include/dt_object.h b/lustre/include/dt_object.h index 33e54f5..172138e 100644 --- a/lustre/include/dt_object.h +++ b/lustre/include/dt_object.h @@ -150,7 +150,8 @@ struct dt_object_operations { */ int (*do_attr_set)(const struct lu_context *ctxt, struct dt_object *dt, - struct lu_attr *attr, struct thandle *handle); + const struct lu_attr *attr, + struct thandle *handle); /* * Return a value of an extended attribute. * @@ -165,7 +166,8 @@ struct dt_object_operations { * precondition: lu_object_exists(ctxt, &dt->do_lu); */ int (*do_xattr_set)(const struct lu_context *ctxt, - struct dt_object *dt, void *buf, int buf_len, + struct dt_object *dt, + const void *buf, int buf_len, const char *name, struct thandle *handle); /* * Create new object on this device. diff --git a/lustre/include/lu_object.h b/lustre/include/lu_object.h index 840ec14..dd8eac6 100644 --- a/lustre/include/lu_object.h +++ b/lustre/include/lu_object.h @@ -329,6 +329,10 @@ struct lu_attr { __u32 la_flags; /* object flags */ __u32 la_nlink; /* number of persistent references to this * object */ +#ifdef MDT_CODE + __u32 la_rdev; /* real device */ + __u64 la_valid; /* real device */ +#endif }; diff --git a/lustre/include/lustre/lustre_idl.h b/lustre/include/lustre/lustre_idl.h index 260f983..f407753 100644 --- a/lustre/include/lustre/lustre_idl.h +++ b/lustre/include/lustre/lustre_idl.h @@ -959,7 +959,7 @@ struct mdt_rec_setattr { __u32 sa_uid; __u32 sa_gid; __u32 sa_attr_flags; - __u32 sa_padding; /* also fix lustre_swab_mds_rec_setattr */ + __u32 sa_padding; /* also fix lustre_swab_mdt_rec_setattr */ }; extern void lustre_swab_mdt_rec_setattr (struct mdt_rec_setattr *sa); diff --git a/lustre/include/lustre_req_layout.h b/lustre/include/lustre_req_layout.h index bc9b7cd..291a026 100644 --- a/lustre/include/lustre_req_layout.h +++ b/lustre/include/lustre_req_layout.h @@ -106,6 +106,8 @@ extern const struct req_format RQF_MDS_REINT; extern const struct req_format RQF_MDS_REINT_CREATE; extern const struct req_format RQF_MDS_REINT_OPEN; extern const struct req_format RQF_MDS_REINT_UNLINK; +extern const struct req_format RQF_MDS_REINT_LINK; +extern const struct req_format RQF_MDS_REINT_RENAME; extern const struct req_format RQF_MDS_REINT_SETATTR; extern const struct req_format RQF_LDLM_ENQUEUE; extern const struct req_format RQF_LDLM_INTENT; diff --git a/lustre/include/md_object.h b/lustre/include/md_object.h index 78f29b6..88acd46 100644 --- a/lustre/include/md_object.h +++ b/lustre/include/md_object.h @@ -52,15 +52,15 @@ struct md_object_operations { int (*moo_attr_get)(const struct lu_context *ctxt, struct md_object *dt, struct lu_attr *attr); int (*moo_attr_set)(const struct lu_context *ctxt, struct md_object *dt, - struct lu_attr *attr); + const struct lu_attr *attr); int (*moo_xattr_get)(const struct lu_context *ctxt, struct md_object *obj, void *buf, int buf_len, const char *name); int (*moo_xattr_set)(const struct lu_context *ctxt, - struct md_object *obj, - void *buf, int buf_len, const char *name); + struct md_object *obj, const void *buf, + int buf_len, const char *name); /* part of cross-ref operation */ int (*moo_object_create)(const struct lu_context *, struct md_object *, struct lu_attr *); @@ -174,7 +174,7 @@ static inline int mo_attr_get(const struct lu_context *cx, struct md_object *m, } static inline int mo_attr_set(const struct lu_context *cx, struct md_object *m, - struct lu_attr *at) + const struct lu_attr *at) { LASSERT(m->mo_ops->moo_attr_set); return m->mo_ops->moo_attr_set(cx, m, at); @@ -198,8 +198,8 @@ static inline int mo_xattr_del(const struct lu_context *cx, } static inline int mo_xattr_set(const struct lu_context *cx, - struct md_object *m, - void *buf, int buf_len, const char *name) + struct md_object *m, const void *buf, + int buf_len, const char *name) { LASSERT(m->mo_ops->moo_xattr_set); return m->mo_ops->moo_xattr_set(cx, m, buf, buf_len, name); diff --git a/lustre/mdd/mdd_handler.c b/lustre/mdd/mdd_handler.c index c1a4982..a641cd4 100644 --- a/lustre/mdd/mdd_handler.c +++ b/lustre/mdd/mdd_handler.c @@ -565,7 +565,7 @@ static int mdd_object_create(const struct lu_context *ctxt, struct md_object *ob static int __mdd_attr_set(const struct lu_context *ctxt, struct md_object *obj, - struct lu_attr *attr, struct thandle *handle) + const struct lu_attr *attr, struct thandle *handle) { struct dt_object *next; @@ -576,7 +576,7 @@ __mdd_attr_set(const struct lu_context *ctxt, struct md_object *obj, static int mdd_attr_set(const struct lu_context *ctxt, - struct md_object *obj, struct lu_attr *attr) + struct md_object *obj, const struct lu_attr *attr) { struct mdd_device *mdd = mdo2mdd(obj); struct thandle *handle; @@ -597,7 +597,7 @@ mdd_attr_set(const struct lu_context *ctxt, static int __mdd_xattr_set(const struct lu_context *ctxt, struct mdd_device *mdd, - struct mdd_object *obj, void *buf, + struct mdd_object *obj, const void *buf, int buf_len, const char *name, struct thandle *handle) { struct dt_object *next; @@ -609,7 +609,7 @@ __mdd_xattr_set(const struct lu_context *ctxt, struct mdd_device *mdd, } static int -mdd_xattr_set(const struct lu_context *ctxt, struct md_object *obj, void *buf, +mdd_xattr_set(const struct lu_context *ctxt, struct md_object *obj, const void *buf, int buf_len, const char *name) { struct mdd_device *mdd = mdo2mdd(obj); diff --git a/lustre/mdt/mdt_handler.c b/lustre/mdt/mdt_handler.c index 4e7625e..298567f 100644 --- a/lustre/mdt/mdt_handler.c +++ b/lustre/mdt/mdt_handler.c @@ -211,7 +211,6 @@ static int mdt_getattr_pack_msg(struct mdt_thread_info *info) } } else if (S_ISLNK(la->la_mode) && (body->valid & OBD_MD_LINKNAME)) { /* It also uese the mdt_md to hold symname */ - CERROR("DDDDDDDDDDDDDDDDDD rc = %d\n", rc); int len = min_t(int, la->la_size + 1, body->eadatasize); req_capsule_set_size(pill, &RMF_MDT_MD, RCL_SERVER, len); } @@ -266,17 +265,14 @@ static int mdt_getattr_internal(struct mdt_thread_info *info) RETURN(rc); } - repbody = req_capsule_server_get(&info->mti_pill, - &RMF_MDT_BODY); + repbody = req_capsule_server_get(&info->mti_pill, &RMF_MDT_BODY); mdt_pack_attr2body(repbody, la); repbody->fid1 = *mdt_object_fid(info->mti_object); repbody->valid |= OBD_MD_FLID; #ifdef MDT_CODE - buffer = req_capsule_server_get(&info->mti_pill, - &RMF_MDT_MD); - length = req_capsule_get_size(&info->mti_pill, - &RMF_MDT_MD, + buffer = req_capsule_server_get(&info->mti_pill, &RMF_MDT_MD); + length = req_capsule_get_size(&info->mti_pill, &RMF_MDT_MD, RCL_SERVER); if ((S_ISREG(la->la_mode) && (reqbody->valid & OBD_MD_FLEASIZE)) || @@ -304,7 +300,7 @@ static int mdt_getattr_internal(struct mdt_thread_info *info) repbody->valid |= OBD_MD_LINKNAME; repbody->eadatasize = rc + 1; ((char*)buffer)[rc] = 0; /* NULL terminate */ - CDEBUG(S_MDS, "read symlink dest %s\n", (char*)buffer); + CDEBUG(D_INODE, "read symlink dest %s\n", (char*)buffer); } } @@ -468,11 +464,6 @@ static struct mdt_device *mdt_dev(struct lu_device *d) return container_of0(d, struct mdt_device, mdt_md_dev.md_lu_dev); } -struct ptlrpc_request *mdt_info_req(struct mdt_thread_info *info) -{ - return info->mti_pill.rc_req; -} - static int mdt_connect(struct mdt_thread_info *info) { int result; @@ -555,10 +546,10 @@ static int mdt_reint(struct mdt_thread_info *info) static const struct req_format *reint_fmts[REINT_MAX] = { [REINT_SETATTR] = &RQF_MDS_REINT_SETATTR, [REINT_CREATE] = &RQF_MDS_REINT_CREATE, - [REINT_LINK] = NULL, /* XXX not yet */ + [REINT_LINK] = &RQF_MDS_REINT_LINK, [REINT_UNLINK] = &RQF_MDS_REINT_UNLINK, - [REINT_RENAME] = NULL, /* XXX not yet */ - [REINT_OPEN] = &RQF_MDS_REINT_OPEN /* XXX Huang hua */ + [REINT_RENAME] = &RQF_MDS_REINT_RENAME, + [REINT_OPEN] = &RQF_MDS_REINT_OPEN }; ENTRY; @@ -591,11 +582,6 @@ static int mdt_pin(struct mdt_thread_info *info) return -EOPNOTSUPP; } -static int mdt_sync(struct mdt_thread_info *info) -{ - return -EOPNOTSUPP; -} - #ifdef MDT_CODE static int mdt_device_sync(struct mdt_device *mdt) { @@ -648,6 +634,11 @@ static int mdt_sync(struct mdt_thread_info *info) } RETURN(rc); } +#else +static int mdt_sync(struct mdt_thread_info *info) +{ + return -EOPNOTSUPP; +} #endif @@ -757,7 +748,8 @@ int fid_lock(struct ldlm_namespace *ns, const struct lu_fid *f, ldlm_policy_data_t *policy) { struct ldlm_res_id res_id; - int flags = 0, rc; + int flags = 0; + int rc; ENTRY; LASSERT(ns != NULL); @@ -769,7 +761,7 @@ int fid_lock(struct ldlm_namespace *ns, const struct lu_fid *f, LDLM_IBITS, policy, mode, &flags, ldlm_blocking_ast, ldlm_completion_ast, NULL, NULL, NULL, 0, NULL, lh); - RETURN (rc == ELDLM_OK ? 0 : -EIO); + RETURN(rc == ELDLM_OK ? 0 : -EIO); } void fid_unlock(struct ldlm_namespace *ns, const struct lu_fid *f, @@ -1005,16 +997,16 @@ static int mdt_req_handle(struct mdt_thread_info *info, } if (result == 0 && flags & HABEO_CLAVIS) { - struct ldlm_request *dlm; + struct ldlm_request *dlm_req; LASSERT(h->mh_fmt != NULL); - dlm = req_capsule_client_get(&info->mti_pill, &RMF_DLM_REQ); - if (dlm != NULL) { + dlm_req = req_capsule_client_get(&info->mti_pill, &RMF_DLM_REQ); + if (dlm_req != NULL) { if (info->mti_mdt->mdt_flags & MDT_CL_COMPAT_RESNAME) result = mdt_lock_resname_compat(info->mti_mdt, - dlm); - info->mti_dlm_req = dlm; + dlm_req); + info->mti_dlm_req = dlm_req; } else { CERROR("Can't unpack dlm request\n"); result = -EFAULT; @@ -1039,11 +1031,11 @@ static int mdt_req_handle(struct mdt_thread_info *info, if (result == 0 && flags & HABEO_CLAVIS && info->mti_mdt->mdt_flags & MDT_CL_COMPAT_RESNAME) { - struct ldlm_reply *rep; + struct ldlm_reply *dlm_rep; - rep = lustre_msg_buf(req->rq_repmsg, 0, sizeof *rep); - if (rep != NULL) - result = mdt_lock_reply_compat(info->mti_mdt, rep); + dlm_rep = req_capsule_server_get(&info->mti_pill, &RMF_DLM_REP); + if (dlm_rep != NULL) + result = mdt_lock_reply_compat(info->mti_mdt, dlm_rep); } /* If we're DISCONNECTing, the mds_export_data is already freed */ @@ -1382,51 +1374,52 @@ static struct mdt_it_flavor { } mdt_it_flavor[] = { [MDT_IT_OPEN] = { .it_fmt = &RQF_LDLM_INTENT, - .it_flags = HABEO_REFERO, + /*.it_flags = HABEO_REFERO,*/ + .it_flags = 0, .it_act = mdt_intent_reint, .it_reint = REINT_OPEN }, [MDT_IT_OCREAT] = { .it_fmt = &RQF_LDLM_INTENT, - .it_flags = HABEO_REFERO, + .it_flags = 0, .it_act = mdt_intent_reint, .it_reint = REINT_OPEN }, [MDT_IT_CREATE] = { .it_fmt = &RQF_LDLM_INTENT, - .it_flags = HABEO_REFERO, + .it_flags = 0, .it_act = mdt_intent_reint, .it_reint = REINT_CREATE }, [MDT_IT_GETATTR] = { .it_fmt = &RQF_LDLM_INTENT_GETATTR, - .it_flags = HABEO_CORPUS, + .it_flags = 0, .it_act = mdt_intent_getattr }, [MDT_IT_READDIR] = { .it_fmt = NULL, - .it_flags = HABEO_REFERO, + .it_flags = 0, .it_act = NULL }, [MDT_IT_LOOKUP] = { .it_fmt = &RQF_LDLM_INTENT_GETATTR, - .it_flags = HABEO_CORPUS, + .it_flags = 0, .it_act = mdt_intent_getattr }, [MDT_IT_UNLINK] = { .it_fmt = &RQF_LDLM_INTENT_UNLINK, - .it_flags = HABEO_REFERO, + .it_flags = 0, .it_act = NULL, /* XXX can be mdt_intent_reint, ? */ .it_reint = REINT_UNLINK }, [MDT_IT_TRUNC] = { .it_fmt = NULL, - .it_flags = HABEO_REFERO, + .it_flags = 0, .it_act = NULL }, [MDT_IT_GETXATTR] = { .it_fmt = NULL, - .it_flags = HABEO_REFERO, + .it_flags = 0, .it_act = NULL } }; @@ -1436,13 +1429,13 @@ static int mdt_intent_getattr(enum mdt_it_code opcode, struct ldlm_lock **lockp, int flags) { - __u64 child_bits; + __u64 child_bits; struct ldlm_lock *old_lock = *lockp; struct ldlm_lock *new_lock = NULL; struct ptlrpc_request *req = mdt_info_req(info); struct ldlm_reply *ldlm_rep; struct mdt_lock_handle lhc = {{0}}; - int rc; + int rc; ENTRY; diff --git a/lustre/mdt/mdt_internal.h b/lustre/mdt/mdt_internal.h index a7ae540..f0099a3 100644 --- a/lustre/mdt/mdt_internal.h +++ b/lustre/mdt/mdt_internal.h @@ -123,10 +123,14 @@ enum { struct mdt_reint_record { mdt_reint_t rr_opcode; const struct lu_fid *rr_fid1; - struct lu_fid *rr_fid2; + const struct lu_fid *rr_fid2; const char *rr_name; const char *rr_tgt; - __u32 rr_flags; + int rr_eadatalen; + const void *rr_eadata; + int rr_logcookielen; + const struct llog_cookie *rr_logcookies; + }; struct mdt_reint_reply { @@ -221,7 +225,10 @@ int mdt_reint_unpack(struct mdt_thread_info *info, __u32 op); int mdt_reint_rec(struct mdt_thread_info *); void mdt_pack_attr2body(struct mdt_body *b, struct lu_attr *attr); const struct lu_fid *mdt_object_fid(struct mdt_object *o); -struct ptlrpc_request *mdt_info_req (struct mdt_thread_info *info); +static inline struct ptlrpc_request *mdt_info_req (struct mdt_thread_info *info) +{ + return info->mti_pill.rc_req; +} int mdt_getxattr(struct mdt_thread_info *info); int mdt_setxattr(struct mdt_thread_info *info); diff --git a/lustre/mdt/mdt_lib.c b/lustre/mdt/mdt_lib.c index 078f217..d9fd941 100644 --- a/lustre/mdt/mdt_lib.c +++ b/lustre/mdt/mdt_lib.c @@ -44,6 +44,45 @@ /* unpacking */ static int mdt_setattr_unpack(struct mdt_thread_info *info) { +#ifdef MDT_CODE + struct mdt_rec_setattr *rec; + struct lu_attr *attr = &info->mti_attr; + struct mdt_reint_record *rr = &info->mti_rr; + struct req_capsule *pill = &info->mti_pill; + ENTRY; + + rec = req_capsule_client_get(pill, &RMF_REC_SETATTR); + + if (rec == NULL) + 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; + + 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); + } + 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); + } + + RETURN(0); +#endif ENTRY; RETURN(-EOPNOTSUPP); } @@ -54,7 +93,7 @@ static int mdt_create_unpack(struct mdt_thread_info *info) struct lu_attr *attr = &info->mti_attr; struct mdt_reint_record *rr = &info->mti_rr; struct req_capsule *pill = &info->mti_pill; - int result; + int result = 0; ENTRY; rec = req_capsule_client_get(pill, &RMF_REC_CREATE); @@ -62,9 +101,16 @@ static int mdt_create_unpack(struct mdt_thread_info *info) rr->rr_fid1 = &rec->cr_fid1; rr->rr_fid2 = &rec->cr_fid2; attr->la_mode = rec->cr_mode; - rr->rr_name = req_capsule_client_get(pill, &RMF_NAME); - result = 0; +#ifdef MDT_CODE + attr->la_rdev = rec->cr_rdev; + attr->la_uid = rec->cr_fsuid; + attr->la_gid = rec->cr_fsgid; + attr->la_flags = rec->cr_flags; + attr->la_ctime = rec->cr_time; + if (req_capsule_field_present(pill, &RMF_SYMTGT)) + rr->rr_tgt = req_capsule_client_get(pill, &RMF_SYMTGT); +#endif } else result = -EFAULT; RETURN(result); @@ -72,18 +118,89 @@ static int mdt_create_unpack(struct mdt_thread_info *info) static int mdt_link_unpack(struct mdt_thread_info *info) { +#ifdef MDT_CODE + struct mdt_rec_link *rec; + struct lu_attr *attr = &info->mti_attr; + struct mdt_reint_record *rr = &info->mti_rr; + struct req_capsule *pill = &info->mti_pill; + ENTRY; + + rec = req_capsule_client_get(pill, &RMF_REC_LINK); + if (rec == NULL) + RETURN (-EFAULT); + + attr->la_uid = rec->lk_fsuid; + attr->la_gid = rec->lk_fsgid; + rr->rr_fid1 = &rec->lk_fid1; + rr->rr_fid2 = &rec->lk_fid2; + attr->la_ctime = rec->lk_time; + + rr->rr_name = req_capsule_client_get(pill, &RMF_NAME); + if (rr->rr_name == NULL) + RETURN (-EFAULT); + RETURN(0); +#endif ENTRY; RETURN(-EOPNOTSUPP); } static int mdt_unlink_unpack(struct mdt_thread_info *info) { +#ifdef MDT_CODE + struct mdt_rec_unlink *rec; + struct lu_attr *attr = &info->mti_attr; + struct mdt_reint_record *rr = &info->mti_rr; + struct req_capsule *pill = &info->mti_pill; + ENTRY; + + rec = req_capsule_client_get(pill, &RMF_REC_UNLINK); + if (rec == NULL) + RETURN (-EFAULT); + + attr->la_uid = rec->ul_fsuid; + attr->la_gid = rec->ul_fsgid; + rr->rr_fid1 = &rec->ul_fid1; + rr->rr_fid2 = &rec->ul_fid2; + attr->la_ctime = rec->ul_time; + attr->la_mode = rec->ul_mode; + + rr->rr_name = req_capsule_client_get(pill, &RMF_NAME); + if (rr->rr_name == NULL) + RETURN (-EFAULT); + RETURN(0); +#endif ENTRY; RETURN(-EOPNOTSUPP); } static int mdt_rename_unpack(struct mdt_thread_info *info) { +#ifdef MDT_CODE + struct mdt_rec_rename *rec; + struct lu_attr *attr = &info->mti_attr; + struct mdt_reint_record *rr = &info->mti_rr; + struct req_capsule *pill = &info->mti_pill; + ENTRY; + + rec = req_capsule_client_get(pill, &RMF_REC_RENAME); + if (rec == NULL) + RETURN (-EFAULT); + + attr->la_uid = rec->rn_fsuid; + attr->la_gid = rec->rn_fsgid; + rr->rr_fid1 = &rec->rn_fid1; + rr->rr_fid2 = &rec->rn_fid2; + attr->la_ctime = rec->rn_time; + + rr->rr_name = req_capsule_client_get(pill, &RMF_NAME); + if (rr->rr_name == NULL) + RETURN (-EFAULT); + rr->rr_tgt = req_capsule_client_get(pill, &RMF_SYMTGT); + if (rr->rr_tgt == NULL) + RETURN (-EFAULT); + RETURN(0); +#endif + ENTRY; RETURN(-EOPNOTSUPP); } @@ -102,7 +219,7 @@ static int mdt_open_unpack(struct mdt_thread_info *info) rr->rr_fid1 = &rec->cr_fid1; rr->rr_fid2 = &rec->cr_fid2; attr->la_mode = rec->cr_mode; - rr->rr_flags = rec->cr_flags; + attr->la_flags = rec->cr_flags; rr->rr_name = req_capsule_client_get(pill, &RMF_NAME); if (rr->rr_name == NULL) diff --git a/lustre/mdt/mdt_reint.c b/lustre/mdt/mdt_reint.c index e1df64d..6b09d40 100644 --- a/lustre/mdt/mdt_reint.c +++ b/lustre/mdt/mdt_reint.c @@ -131,6 +131,89 @@ static int mdt_md_mkobj(struct mdt_thread_info *info) static int mdt_reint_setattr(struct mdt_thread_info *info) { +#ifdef MDT_CODE + struct lu_attr *attr = &info->mti_attr; + struct mdt_reint_record *rr = &info->mti_rr; + struct req_capsule *pill = &info->mti_pill; + struct ptlrpc_request *req = mdt_info_req(info); + struct mdt_object *mo; + struct mdt_lock_handle *lh; + struct lu_attr tmp_attr; + struct mdt_body *repbody; + int rc; + int locked = 0; + + ENTRY; + + DEBUG_REQ(D_INODE, req, "setattr "DFID3" %x", PFID3(rr->rr_fid1), + (unsigned int)attr->la_valid); + + /* MDS_CHECK_RESENT */ + + rc = req_capsule_pack(pill); + if (rc) + RETURN(rc); + + if (req->rq_export->exp_connect_flags & OBD_CONNECT_RDONLY) + RETURN(-EROFS); + + if (attr->la_valid & ATTR_FROM_OPEN) { + mo = mdt_object_find(info->mti_ctxt, info->mti_mdt, rr->rr_fid1); + if (IS_ERR(mo)) + RETURN(rc = PTR_ERR(mo)); + } else { + __u64 lockpart = MDS_INODELOCK_UPDATE; + if (attr->la_valid & (ATTR_MODE|ATTR_UID|ATTR_GID)) + lockpart |= MDS_INODELOCK_LOOKUP; + + lh = &info->mti_lh[MDT_LH_PARENT]; + lh->mlh_mode = LCK_EX; + + mo = mdt_object_find_lock(info->mti_ctxt, info->mti_mdt, + rr->rr_fid1, lh, lockpart); + + if (IS_ERR(mo)) + RETURN(rc = PTR_ERR(mo)); + locked = 1; + } + + LASSERT(lu_object_exists(info->mti_ctxt, &mo->mot_obj.mo_lu)); + + rc = mo_attr_set(info->mti_ctxt, mdt_object_child(mo), attr); + if (rc != 0) + GOTO(out_unlock, rc); + + rc = mo_attr_get(info->mti_ctxt, mdt_object_child(mo), &tmp_attr); + if (rc != 0) + GOTO(out_unlock, rc); + + repbody = req_capsule_server_get(&info->mti_pill, &RMF_MDT_BODY); + mdt_pack_attr2body(repbody, &tmp_attr); + repbody->fid1 = *mdt_object_fid(mo); + repbody->valid |= OBD_MD_FLID; + + /* don't return OST-specific attributes if we didn't just set them. */ + if (attr->la_valid & ATTR_SIZE) + repbody->valid |= OBD_MD_FLSIZE | OBD_MD_FLBLOCKS; + if (attr->la_valid & (ATTR_MTIME | ATTR_MTIME_SET)) + repbody->valid |= OBD_MD_FLMTIME; + if (attr->la_valid & (ATTR_ATIME | ATTR_ATIME_SET)) + repbody->valid |= OBD_MD_FLATIME; + + rc = mo_xattr_set(info->mti_ctxt, mdt_object_child(mo), + rr->rr_eadata, rr->rr_eadatalen, "lov"); + if (rc) + GOTO(out_unlock, rc); + + /* FIXME Please deal with logcookies here*/ + +out_unlock: + if (locked) { + mdt_object_unlock(info->mti_mdt->mdt_namespace, mo, lh); + } + mdt_object_put(info->mti_ctxt, mo); + RETURN(rc); +#endif ENTRY; RETURN(-EOPNOTSUPP); } @@ -211,11 +294,13 @@ static int mdt_reint_open(struct mdt_thread_info *info) struct mdt_body *body = info->mti_reint_rep.mrr_body; struct lov_mds_md *lmm = info->mti_reint_rep.mrr_md; int created = 0; + struct lu_fid child_fid; ENTRY; lh = &info->mti_lh[MDT_LH_PARENT]; lh->mlh_mode = LCK_PW; + req_capsule_pack(&info->mti_pill); ldlm_rep = req_capsule_server_get(&info->mti_pill, &RMF_DLM_REP); parent = mdt_object_find_lock(info->mti_ctxt, @@ -226,7 +311,7 @@ static int mdt_reint_open(struct mdt_thread_info *info) RETURN(PTR_ERR(parent)); result = mdo_lookup(info->mti_ctxt, mdt_object_child(parent), - info->mti_rr.rr_name, info->mti_rr.rr_fid2); + info->mti_rr.rr_name, &child_fid); if (result && result != -ENOENT) { GOTO(out_parent, result); } @@ -239,13 +324,13 @@ static int mdt_reint_open(struct mdt_thread_info *info) intent_set_disposition(ldlm_rep, DISP_LOOKUP_POS); if (result == -ENOENT) { - if(!(info->mti_rr.rr_flags & MDS_OPEN_CREAT)) + if(!(info->mti_attr.la_flags & MDS_OPEN_CREAT)) GOTO(out_parent, result); if (req->rq_export->exp_connect_flags & OBD_CONNECT_RDONLY) GOTO(out_parent, result = -EROFS); } - child = mdt_object_find(info->mti_ctxt, mdt, info->mti_rr.rr_fid2); + child = mdt_object_find(info->mti_ctxt, mdt, &child_fid); if (IS_ERR(child)) GOTO(out_parent, result = PTR_ERR(child)); @@ -260,8 +345,8 @@ static int mdt_reint_open(struct mdt_thread_info *info) if (result != 0) GOTO(out_child, result); created = 1; - } else if (info->mti_rr.rr_flags & MDS_OPEN_EXCL && - info->mti_rr.rr_flags & MDS_OPEN_CREAT) { + } else if (info->mti_attr.la_flags & MDS_OPEN_EXCL && + info->mti_attr.la_flags & MDS_OPEN_CREAT) { GOTO(out_child, result = -EEXIST); } diff --git a/lustre/mdt/mdt_xattr.c b/lustre/mdt/mdt_xattr.c index 2ad6f9f..b666082 100644 --- a/lustre/mdt/mdt_xattr.c +++ b/lustre/mdt/mdt_xattr.c @@ -127,16 +127,16 @@ int mdt_getxattr(struct mdt_thread_info *info) if (info->mti_body->valid & OBD_MD_FLXATTR) { char *xattr_name = req_capsule_client_get(&info->mti_pill, &RMF_NAME); - CDEBUG(S_MDS, "getxattr %s\n", xattr_name); + CDEBUG(D_INODE, "getxattr %s\n", xattr_name); rc = mo_xattr_get(info->mti_ctxt, next, buf, buflen, xattr_name); if (rc < 0 && rc != -ENODATA && rc != -EOPNOTSUPP && rc != -ERANGE) - CDEBUG(S_MDS, "getxattr failed: %d\n", rc); + CDEBUG(D_INODE, "getxattr failed: %d\n", rc); } else if (info->mti_body->valid & OBD_MD_FLXATTRLS) { - CDEBUG(S_MDS, "listxattr\n"); + CDEBUG(D_INODE, "listxattr\n"); rc = mo_xattr_list(info->mti_ctxt, next, buf, buflen); if (rc < 0) diff --git a/lustre/ptlrpc/layout.c b/lustre/ptlrpc/layout.c index 802073c..f32655c 100644 --- a/lustre/ptlrpc/layout.c +++ b/lustre/ptlrpc/layout.c @@ -102,11 +102,33 @@ static const struct req_msg_field *mds_reint_open_client[] = { &RMF_EADATA }; +static const struct req_msg_field *mds_reint_open_server[] = { + &RMF_MDT_BODY, + &RMF_MDT_MD, +}; + static const struct req_msg_field *mds_reint_unlink_client[] = { &RMF_REC_UNLINK, &RMF_NAME }; +static const struct req_msg_field *mds_reint_link_client[] = { + &RMF_REC_LINK, + &RMF_NAME +}; + +static const struct req_msg_field *mds_reint_rename_client[] = { + &RMF_REC_RENAME, + &RMF_NAME, + &RMF_SYMTGT +}; + +static const struct req_msg_field *mds_reint_rename_or_unlink_server[] = { + &RMF_MDT_BODY, + &RMF_MDT_MD, + &RMF_LOGCOOKIES +}; + static const struct req_msg_field *mds_reint_setattr_client[] = { &RMF_REC_SETATTR, &RMF_EADATA, @@ -447,14 +469,24 @@ EXPORT_SYMBOL(RQF_MDS_REINT_CREATE); const struct req_format RQF_MDS_REINT_OPEN = DEFINE_REQ_FMT0("MDS_REINT_OPEN", - mds_reint_open_client, mdt_body_only); + mds_reint_open_client, mds_reint_open_server); EXPORT_SYMBOL(RQF_MDS_REINT_OPEN); const struct req_format RQF_MDS_REINT_UNLINK = - DEFINE_REQ_FMT0("MDS_REINT_UNLINK", - mds_reint_unlink_client, mdt_body_only); + DEFINE_REQ_FMT0("MDS_REINT_UNLINK", mds_reint_unlink_client, + mds_reint_rename_or_unlink_server); EXPORT_SYMBOL(RQF_MDS_REINT_UNLINK); +const struct req_format RQF_MDS_REINT_LINK = + DEFINE_REQ_FMT0("MDS_REINT_LINK", + mds_reint_link_client, mdt_body_only); +EXPORT_SYMBOL(RQF_MDS_REINT_LINK); + +const struct req_format RQF_MDS_REINT_RENAME = + DEFINE_REQ_FMT0("MDS_REINT_RENAME", mds_reint_rename_client, + mds_reint_rename_or_unlink_server); +EXPORT_SYMBOL(RQF_MDS_REINT_RENAME); + const struct req_format RQF_MDS_REINT_SETATTR = DEFINE_REQ_FMT0("MDS_REINT_SETATTR", mds_reint_setattr_client, mdt_body_only); -- 1.8.3.1