From: huanghua Date: Thu, 27 Apr 2006 12:11:57 +0000 (+0000) Subject: 1. modified the code to #colibri coding guideline. X-Git-Tag: v1_8_0_110~486^2~1915 X-Git-Url: https://git.whamcloud.com/gitweb?a=commitdiff_plain;h=171c430aadf99e39d1d25ce2103c39574bbd1390;p=fs%2Flustre-release.git 1. modified the code to #colibri coding guideline. 2. put mdt_reint_record into mdt_thread_info to avoid dynamic memory allocation. --- diff --git a/lustre/include/linux/lustre_mdt.h b/lustre/include/linux/lustre_mdt.h index 8b9af68..23206ab 100644 --- a/lustre/include/linux/lustre_mdt.h +++ b/lustre/include/linux/lustre_mdt.h @@ -24,47 +24,22 @@ struct mdt_reint_record { - __u32 ur_opcode; - struct lu_fid *ur_fid1; - struct lu_fid *ur_fid2; - int ur_namelen; - char *ur_name; - int ur_tgtlen; - char *ur_tgt; - int ur_eadatalen; - void *ur_eadata; - int ur_cookielen; - struct llog_cookie *ur_logcookies; - struct iattr ur_iattr; - struct lvfs_ucred ur_uc; - __u64 ur_rdev; - __u64 ur_time; - __u32 ur_mode; - __u32 ur_flags; - struct lvfs_grp_hash_entry *ur_grp_entry; + __u32 rr_opcode; + struct lu_fid *rr_fid1; + struct lu_fid *rr_fid2; + int rr_namelen; + char *rr_name; + int rr_tgtlen; + char *rr_tgt; + int rr_eadatalen; + void *rr_eadata; + int rr_cookielen; + struct llog_cookie *rr_logcookies; + struct lvfs_ucred rr_uc; + __u64 rr_rdev; + __u64 rr_time; + __u32 rr_mode; + __u32 rr_flags; }; -/* file data for open files on MDT */ -struct mdt_file_data { - struct portals_handle mfd_handle; /* must be first */ - atomic_t mfd_refcount; - struct list_head mfd_list; /* protected by med_open_lock */ - __u64 mfd_xid; - int mfd_mode; - struct dentry *mfd_dentry; -}; - - -/* ioctls for trying requests */ -#define IOC_REQUEST_TYPE 'f' -#define IOC_REQUEST_MIN_NR 30 - -#define IOC_REQUEST_GETATTR _IOWR('f', 30, long) -#define IOC_REQUEST_READPAGE _IOWR('f', 31, long) -#define IOC_REQUEST_SETATTR _IOWR('f', 32, long) -#define IOC_REQUEST_CREATE _IOWR('f', 33, long) -#define IOC_REQUEST_OPEN _IOWR('f', 34, long) -#define IOC_REQUEST_CLOSE _IOWR('f', 35, long) -#define IOC_REQUEST_MAX_NR 35 - #endif diff --git a/lustre/mdt/mdt_handler.c b/lustre/mdt/mdt_handler.c index 0ce79af..473ace2 100644 --- a/lustre/mdt/mdt_handler.c +++ b/lustre/mdt/mdt_handler.c @@ -77,22 +77,21 @@ static int mdt_getstatus(struct mdt_thread_info *info, struct ptlrpc_request *req, int offset) { struct md_device *next = info->mti_mdt->mdt_child; - struct mdt_body *body; - int size = sizeof *body; int result; ENTRY; - result = lustre_pack_reply(req, 1, &size, NULL); + info->mti_rep_buf_size[0] = sizeof (struct mdt_body); + result = lustre_pack_reply(req, 1, info->mti_rep_buf_size, NULL); if (result) CERROR(LUSTRE_MDT0_NAME" out of memory for message: size=%d\n", - size); + sizeof (struct mdt_body)); else if (OBD_FAIL_CHECK(OBD_FAIL_MDS_GETSTATUS_PACK)) result = -ENOMEM; else { - body = lustre_msg_buf(req->rq_repmsg, 0, sizeof *body); + info->mti_body = lustre_msg_buf(req->rq_repmsg, 0, sizeof (struct mdt_body)); result = next->md_ops->mdo_root_get(info->mti_ctxt, - next, &body->fid1); + next, &info->mti_body->fid1); } /* the last_committed and last_xid fields are filled in for all @@ -106,24 +105,28 @@ static int mdt_statfs(struct mdt_thread_info *info, { struct md_device *next = info->mti_mdt->mdt_child; struct obd_statfs *osfs; - struct kstatfs sfs; + struct kstatfs *sfs; int result; - int size = sizeof(struct obd_statfs); ENTRY; - result = lustre_pack_reply(req, 1, &size, NULL); + info->mti_rep_buf_size[0] = sizeof(struct obd_statfs); + result = lustre_pack_reply(req, 1, info->mti_rep_buf_size, NULL); if (result) CERROR(LUSTRE_MDT0_NAME" out of memory for statfs: size=%d\n", - size); + sizeof(struct obd_statfs)); else if (OBD_FAIL_CHECK(OBD_FAIL_MDS_STATFS_PACK)) { CERROR(LUSTRE_MDT0_NAME": statfs lustre_pack_reply failed\n"); result = -ENOMEM; } else { - osfs = lustre_msg_buf(req->rq_repmsg, 0, size); + osfs = lustre_msg_buf(req->rq_repmsg, 0, sizeof(struct obd_statfs)); + OBD_ALLOC_PTR(sfs); + if(sfs == NULL) + RETURN(-ENOMEM); /* XXX max_age optimisation is needed here. See mds_statfs */ - result = next->md_ops->mdo_statfs(info->mti_ctxt, next, &sfs); - statfs_pack(osfs, &sfs); + result = next->md_ops->mdo_statfs(info->mti_ctxt, next, sfs); + statfs_pack(osfs, sfs); + OBD_FREE_PTR(sfs); } RETURN(result); @@ -154,18 +157,17 @@ static void mdt_pack_attr2body(struct mdt_body *b, struct lu_attr *attr) static int mdt_getattr(struct mdt_thread_info *info, struct ptlrpc_request *req, int offset) { - struct mdt_body *body; - int size = sizeof (*body); int result; LASSERT(info->mti_object != NULL); ENTRY; - result = lustre_pack_reply(req, 1, &size, NULL); + info->mti_rep_buf_size[0] = sizeof(struct mdt_body); + result = lustre_pack_reply(req, 1, info->mti_rep_buf_size, NULL); if (result) CERROR(LUSTRE_MDT0_NAME" cannot pack size=%d, rc=%d\n", - size, result); + sizeof(struct mdt_body), result); else if (OBD_FAIL_CHECK(OBD_FAIL_MDS_GETATTR_PACK)) { CERROR(LUSTRE_MDT0_NAME": statfs lustre_pack_reply failed\n"); result = -ENOMEM; @@ -175,9 +177,9 @@ static int mdt_getattr(struct mdt_thread_info *info, result = next->mo_ops->moo_attr_get(info->mti_ctxt, next, &info->mti_attr); if (result == 0) { - body = lustre_msg_buf(req->rq_repmsg, 0, size); - mdt_pack_attr2body(body, &info->mti_attr); - body->fid1 = *mdt_object_fid(info->mti_object); + 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); } } RETURN(result); @@ -249,27 +251,19 @@ static int mdt_readpage(struct mdt_thread_info *info, return -EOPNOTSUPP; } -int mdt_reint_internal(struct mdt_thread_info *info, +static int mdt_reint_internal(struct mdt_thread_info *info, struct ptlrpc_request *req, int offset, struct lustre_handle *lockh) { - struct mdt_reint_record *rec; /* 116 bytes on the stack? no sir! */ int rc; - OBD_ALLOC(rec, sizeof(*rec)); - if (rec == NULL) - RETURN(-ENOMEM); - - rc = mdt_reint_unpack(info, req, offset, rec); + rc = mdt_reint_unpack(info, req, offset); if (rc || OBD_FAIL_CHECK(OBD_FAIL_MDS_REINT_UNPACK)) { CERROR("invalid record\n"); - GOTO(out, rc = -EINVAL); + RETURN(rc = -EINVAL); } - - rc = mdt_reint_rec(info, rec, offset, req, lockh); -out: - OBD_FREE(rec, sizeof(*rec)); + rc = mdt_reint_rec(info, lockh); RETURN(rc); } @@ -279,9 +273,7 @@ static int mdt_reint(struct mdt_thread_info *info, __u32 *opcp = lustre_msg_buf(req->rq_reqmsg, MDS_REQ_REC_OFF, sizeof (*opcp)); __u32 opc; - int size[] = { sizeof(struct mdt_body), sizeof(struct lov_mds_md), /*FIXME*/ - sizeof(struct llog_cookie)}; - int bufcount,rc; + int rc; ENTRY; @@ -299,10 +291,15 @@ static int mdt_reint(struct mdt_thread_info *info, OBD_FAIL_RETURN(OBD_FAIL_MDS_REINT_NET, 0); if (opc == REINT_UNLINK || opc == REINT_RENAME) - bufcount = 3; + info->mti_rep_buf_nr = 3; else if (opc == REINT_OPEN) - bufcount = 2; - rc = lustre_pack_reply(req, bufcount, size, NULL); + info->mti_rep_buf_nr = 2; + else + info->mti_rep_buf_nr = 1; + info->mti_rep_buf_size[0] = sizeof(struct mdt_body); + info->mti_rep_buf_size[1] = sizeof(struct lov_mds_md); /*FIXME:See mds*/ + info->mti_rep_buf_size[2] = sizeof(struct llog_cookie);/*FIXME:See mds*/ + rc = lustre_pack_reply(req, info->mti_rep_buf_nr, info->mti_rep_buf_size, NULL); if (rc) RETURN (rc); rc = mdt_reint_internal(info, req, offset, NULL); @@ -1050,20 +1047,19 @@ static int mdt_intent_policy(struct ldlm_namespace *ns, struct lustre_handle lockh = { 0 }; struct ldlm_lock *new_lock = NULL; int getattr_part = MDS_INODELOCK_UPDATE; - int repsize[4] = {sizeof(*rep), - sizeof(struct mdt_body), - sizeof(struct lov_mds_md)};/*FIXME:See mds*/ - int repbufcnt = 3, offset = MDS_REQ_INTENT_REC_OFF; + int offset = MDS_REQ_INTENT_REC_OFF; int rc; - struct mdt_thread_info *info = NULL; - /*FIXME:How to get this pointer? - from the request? or passed in by @data*/ - + struct mdt_thread_info *info; ENTRY; LASSERT(req != NULL); + /* We already got it in mdt_handle. But we have to do it again*/ + info = lu_context_key_get(req->rq_svc_thread->t_ctx, &mdt_thread_key); + mdt_thread_info_init(info); + + if (req->rq_reqmsg->bufcount <= MDS_REQ_INTENT_IT_OFF) { /* No intent was provided */ int size = sizeof(struct ldlm_reply); @@ -1080,15 +1076,25 @@ static int mdt_intent_policy(struct ldlm_namespace *ns, } LDLM_DEBUG(lock, "intent policy, opc: %s", ldlm_it2str(it->opc)); + info->mti_rep_buf_nr = 3; + info->mti_rep_buf_size[0] = sizeof(*rep); + info->mti_rep_buf_size[1] = sizeof(struct mdt_body); + info->mti_rep_buf_size[2] = sizeof(struct lov_mds_md);/*FIXME:See mds*/ if ((req->rq_export->exp_connect_flags & OBD_CONNECT_ACL) && - (it->opc & (IT_OPEN | IT_GETATTR | IT_LOOKUP))) + (it->opc & (IT_OPEN | IT_GETATTR | IT_LOOKUP))){ /* we should never allow OBD_CONNECT_ACL if not configured */ - repsize[repbufcnt++] = LUSTRE_POSIX_ACL_MAX_SIZE; - else if (it->opc & IT_UNLINK) - repsize[repbufcnt++] = sizeof(struct llog_cookie); /*FIXME:See mds*/ + info->mti_rep_buf_size[info->mti_rep_buf_nr++] = + LUSTRE_POSIX_ACL_MAX_SIZE; + } + else if (it->opc & IT_UNLINK){ + info->mti_rep_buf_size[info->mti_rep_buf_nr++] = + sizeof(struct llog_cookie); + /*FIXME:See mds*/ + } - rc = lustre_pack_reply(req, repbufcnt, repsize, NULL); + rc = lustre_pack_reply(req, info->mti_rep_buf_nr, + info->mti_rep_buf_size, NULL); if (rc) RETURN(req->rq_status = rc); diff --git a/lustre/mdt/mdt_internal.h b/lustre/mdt/mdt_internal.h index e2f85e2..a2b375a 100644 --- a/lustre/mdt/mdt_internal.h +++ b/lustre/mdt/mdt_internal.h @@ -155,6 +155,10 @@ struct mdt_thread_info { */ struct lu_attr mti_attr; /* + * some addtional attributes for reint. + */ + struct mdt_reint_record mti_rr; + /* * Additional fail id that can be set by handler. Passed to * target_send_reply(). */ @@ -186,11 +190,11 @@ void mdt_object_unlock(struct ldlm_namespace *, struct mdt_object *, struct mdt_object *mdt_object_find_lock(struct lu_context *, struct mdt_device *, struct lu_fid *, struct mdt_lock_handle *, __u64); -int mdt_reint_unpack(struct mdt_thread_info *info, struct ptlrpc_request *req, int offset, - struct mdt_reint_record *rec); +int mdt_reint_unpack(struct mdt_thread_info *, + struct ptlrpc_request *, + int); -int mdt_reint_rec(struct mdt_thread_info *, struct mdt_reint_record *, - int, struct ptlrpc_request *, +int mdt_reint_rec(struct mdt_thread_info *, struct lustre_handle *); #endif /* __KERNEL__ */ diff --git a/lustre/mdt/mdt_lib.c b/lustre/mdt/mdt_lib.c index 189de80..ffd83c7 100644 --- a/lustre/mdt/mdt_lib.c +++ b/lustre/mdt/mdt_lib.c @@ -1,7 +1,17 @@ /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- * vim:expandtab:shiftwidth=8:tabstop=8: * - * Copyright (c) 2003 Cluster File Systems, Inc. + * lustre/mdt/mdt_lib.c + * Lustre Metadata Target (mdt) request unpacking helper. + * + * Copyright (c) 2006 Cluster File Systems, Inc. + * Author: Peter Braam + * Author: Andreas Dilger + * Author: Phil Schwan + * Author: Mike Shaver + * Author: Nikita Danilov + * Author: Huang Hua + * * * This file is part of the Lustre file system, http://www.lustre.org * Lustre is a trademark of Cluster File Systems, Inc. @@ -28,106 +38,90 @@ #endif #define DEBUG_SUBSYSTEM S_MDS -#include - -/* LUSTRE_VERSION_CODE */ -#include -/* - * struct OBD_{ALLOC,FREE}*() - * OBD_FAIL_CHECK - */ -#include -/* struct ptlrpc_request */ -#include -/* struct obd_export */ -#include -/* struct obd_device */ -#include -/* lu2dt_dev() */ -#include - - -#include "../mds/mds_internal.h" #include "mdt_internal.h" /* unpacking */ -static int mdt_setattr_unpack(struct ptlrpc_request *req, int offset, - struct mdt_reint_record *r) +static int mdt_setattr_unpack(struct mdt_thread_info *info, + struct ptlrpc_request *req, + int offset) { - struct iattr *attr = &r->ur_iattr; + struct lu_attr *attr = &info->mti_attr; + struct mdt_reint_record *r = &info->mti_rr; struct mdt_rec_setattr *rec; ENTRY; rec = lustre_swab_reqbuf(req, offset, sizeof(*rec), lustre_swab_mdt_rec_setattr); if (rec == NULL) - RETURN (-EFAULT); - - r->ur_uc.luc_fsuid = rec->sa_fsuid; - r->ur_uc.luc_fsgid = rec->sa_fsgid; - r->ur_uc.luc_cap = rec->sa_cap; - r->ur_uc.luc_suppgid1 = rec->sa_suppgid; - r->ur_uc.luc_suppgid2 = -1; - r->ur_fid1 = &rec->sa_fid; - attr->ia_valid = rec->sa_valid; - attr->ia_mode = rec->sa_mode; - attr->ia_uid = rec->sa_uid; - attr->ia_gid = rec->sa_gid; - attr->ia_size = rec->sa_size; - LTIME_S(attr->ia_atime) = rec->sa_atime; - LTIME_S(attr->ia_mtime) = rec->sa_mtime; - LTIME_S(attr->ia_ctime) = rec->sa_ctime; - attr->ia_attr_flags = rec->sa_attr_flags; + RETURN(-EFAULT); + + r->rr_uc.luc_fsuid = rec->sa_fsuid; + r->rr_uc.luc_fsgid = rec->sa_fsgid; + r->rr_uc.luc_cap = rec->sa_cap; + r->rr_uc.luc_suppgid1 = rec->sa_suppgid; + r->rr_uc.luc_suppgid2 = -1; + r->rr_fid1 = &rec->sa_fid; +/*FIXME 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_atime = rec->sa_atime; + attr->la_mtime = rec->sa_mtime; + attr->la_ctime = rec->sa_ctime; +/*FIXME attr->la_attr_flags = rec->sa_attr_flags;*/ LASSERT_REQSWAB (req, offset + 1); if (req->rq_reqmsg->bufcount > offset + 1) { - r->ur_eadata = lustre_msg_buf (req->rq_reqmsg, + r->rr_eadata = lustre_msg_buf (req->rq_reqmsg, offset + 1, 0); - if (r->ur_eadata == NULL) - RETURN (-EFAULT); - r->ur_eadatalen = req->rq_reqmsg->buflens[offset + 1]; + if (r->rr_eadata == NULL) + RETURN(-EFAULT); + r->rr_eadatalen = req->rq_reqmsg->buflens[offset + 1]; } if (req->rq_reqmsg->bufcount > offset + 2) { - r->ur_logcookies = lustre_msg_buf(req->rq_reqmsg, offset + 2,0); - if (r->ur_eadata == NULL) - RETURN (-EFAULT); + r->rr_logcookies = lustre_msg_buf(req->rq_reqmsg, offset + 2,0); + if (r->rr_logcookies == NULL) + RETURN(-EFAULT); - r->ur_cookielen = req->rq_reqmsg->buflens[offset + 2]; + r->rr_cookielen = req->rq_reqmsg->buflens[offset + 2]; } RETURN(0); } -static int mdt_create_unpack(struct ptlrpc_request *req, int offset, - struct mdt_reint_record *r) +static int mdt_create_unpack(struct mdt_thread_info *info, + struct ptlrpc_request *req, + int offset) { struct mdt_rec_create *rec; + struct mdt_reint_record *r = &info->mti_rr; ENTRY; rec = lustre_swab_reqbuf (req, offset, sizeof (*rec), lustre_swab_mdt_rec_create); if (rec == NULL) - RETURN (-EFAULT); - - r->ur_uc.luc_fsuid = rec->cr_fsuid; - r->ur_uc.luc_fsgid = rec->cr_fsgid; - r->ur_uc.luc_cap = rec->cr_cap; - r->ur_uc.luc_suppgid1 = rec->cr_suppgid; - r->ur_uc.luc_suppgid2 = -1; - r->ur_fid1 = &rec->cr_fid; - r->ur_fid2 = &rec->cr_replayfid; - r->ur_mode = rec->cr_mode; - r->ur_rdev = rec->cr_rdev; - r->ur_time = rec->cr_time; - r->ur_flags = rec->cr_flags; + RETURN(-EFAULT); + + r->rr_uc.luc_fsuid = rec->cr_fsuid; + r->rr_uc.luc_fsgid = rec->cr_fsgid; + r->rr_uc.luc_cap = rec->cr_cap; + r->rr_uc.luc_suppgid1 = rec->cr_suppgid; + r->rr_uc.luc_suppgid2 = -1; + r->rr_fid1 = &rec->cr_fid; + r->rr_fid2 = &rec->cr_replayfid; + r->rr_mode = rec->cr_mode; + r->rr_rdev = rec->cr_rdev; + r->rr_time = rec->cr_time; + r->rr_flags = rec->cr_flags; LASSERT_REQSWAB (req, offset + 1); - r->ur_name = lustre_msg_string (req->rq_reqmsg, offset + 1, 0); - if (r->ur_name == NULL) - RETURN (-EFAULT); - r->ur_namelen = req->rq_reqmsg->buflens[offset + 1]; + r->rr_name = lustre_msg_string (req->rq_reqmsg, offset + 1, 0); + if (r->rr_name == NULL) + RETURN(-EFAULT); + r->rr_namelen = req->rq_reqmsg->buflens[offset + 1]; LASSERT_REQSWAB (req, offset + 2); if (req->rq_reqmsg->bufcount > offset + 2) { @@ -136,48 +130,52 @@ static int mdt_create_unpack(struct ptlrpc_request *req, int offset, * to stop checking for a buffer filled completely with a * NULL terminated string here, and make the callers check * depending on what they expect. We should probably stash - * it in r->ur_eadata in that case, so it's obvious... -eeb + * it in r->rr_eadata in that case, so it's obvious... -eeb */ - r->ur_tgt = lustre_msg_string(req->rq_reqmsg, offset + 2, 0); - if (r->ur_tgt == NULL) - RETURN (-EFAULT); - r->ur_tgtlen = req->rq_reqmsg->buflens[offset + 2]; + r->rr_tgt = lustre_msg_string(req->rq_reqmsg, offset + 2, 0); + if (r->rr_tgt == NULL) + RETURN(-EFAULT); + r->rr_tgtlen = req->rq_reqmsg->buflens[offset + 2]; } RETURN(0); } -static int mdt_link_unpack(struct ptlrpc_request *req, int offset, - struct mdt_reint_record *r) +static int mdt_link_unpack(struct mdt_thread_info *info, + struct ptlrpc_request *req, + int offset) { struct mdt_rec_link *rec; + struct mdt_reint_record *r = &info->mti_rr; ENTRY; rec = lustre_swab_reqbuf (req, offset, sizeof (*rec), lustre_swab_mdt_rec_link); if (rec == NULL) - RETURN (-EFAULT); + RETURN(-EFAULT); - r->ur_uc.luc_fsuid = rec->lk_fsuid; - r->ur_uc.luc_fsgid = rec->lk_fsgid; - r->ur_uc.luc_cap = rec->lk_cap; - r->ur_uc.luc_suppgid1 = rec->lk_suppgid1; - r->ur_uc.luc_suppgid2 = rec->lk_suppgid2; - r->ur_fid1 = &rec->lk_fid1; - r->ur_fid2 = &rec->lk_fid2; - r->ur_time = rec->lk_time; + r->rr_uc.luc_fsuid = rec->lk_fsuid; + r->rr_uc.luc_fsgid = rec->lk_fsgid; + r->rr_uc.luc_cap = rec->lk_cap; + r->rr_uc.luc_suppgid1 = rec->lk_suppgid1; + r->rr_uc.luc_suppgid2 = rec->lk_suppgid2; + r->rr_fid1 = &rec->lk_fid1; + r->rr_fid2 = &rec->lk_fid2; + r->rr_time = rec->lk_time; LASSERT_REQSWAB (req, offset + 1); - r->ur_name = lustre_msg_string (req->rq_reqmsg, offset + 1, 0); - if (r->ur_name == NULL) - RETURN (-EFAULT); - r->ur_namelen = req->rq_reqmsg->buflens[offset + 1]; + r->rr_name = lustre_msg_string (req->rq_reqmsg, offset + 1, 0); + if (r->rr_name == NULL) + RETURN(-EFAULT); + r->rr_namelen = req->rq_reqmsg->buflens[offset + 1]; RETURN(0); } -static int mdt_unlink_unpack(struct ptlrpc_request *req, int offset, - struct mdt_reint_record *r) +static int mdt_unlink_unpack(struct mdt_thread_info *info, + struct ptlrpc_request *req, + int offset) { struct mdt_rec_unlink *rec; + struct mdt_reint_record *r = &info->mti_rr; ENTRY; rec = lustre_swab_reqbuf (req, offset, sizeof (*rec), @@ -185,28 +183,30 @@ static int mdt_unlink_unpack(struct ptlrpc_request *req, int offset, if (rec == NULL) RETURN(-EFAULT); - r->ur_uc.luc_fsuid = rec->ul_fsuid; - r->ur_uc.luc_fsgid = rec->ul_fsgid; - r->ur_uc.luc_cap = rec->ul_cap; - r->ur_uc.luc_suppgid1 = rec->ul_suppgid; - r->ur_uc.luc_suppgid2 = -1; - r->ur_mode = rec->ul_mode; - r->ur_fid1 = &rec->ul_fid1; - r->ur_fid2 = &rec->ul_fid2; - r->ur_time = rec->ul_time; + r->rr_uc.luc_fsuid = rec->ul_fsuid; + r->rr_uc.luc_fsgid = rec->ul_fsgid; + r->rr_uc.luc_cap = rec->ul_cap; + r->rr_uc.luc_suppgid1 = rec->ul_suppgid; + r->rr_uc.luc_suppgid2 = -1; + r->rr_mode = rec->ul_mode; + r->rr_fid1 = &rec->ul_fid1; + r->rr_fid2 = &rec->ul_fid2; + r->rr_time = rec->ul_time; LASSERT_REQSWAB (req, offset + 1); - r->ur_name = lustre_msg_string(req->rq_reqmsg, offset + 1, 0); - if (r->ur_name == NULL) + r->rr_name = lustre_msg_string(req->rq_reqmsg, offset + 1, 0); + if (r->rr_name == NULL) RETURN(-EFAULT); - r->ur_namelen = req->rq_reqmsg->buflens[offset + 1]; + r->rr_namelen = req->rq_reqmsg->buflens[offset + 1]; RETURN(0); } -static int mdt_rename_unpack(struct ptlrpc_request *req, int offset, - struct mdt_reint_record *r) +static int mdt_rename_unpack(struct mdt_thread_info *info, + struct ptlrpc_request *req, + int offset) { struct mdt_rec_rename *rec; + struct mdt_reint_record *r = &info->mti_rr; ENTRY; rec = lustre_swab_reqbuf (req, offset, sizeof (*rec), @@ -214,84 +214,89 @@ static int mdt_rename_unpack(struct ptlrpc_request *req, int offset, if (rec == NULL) RETURN(-EFAULT); - r->ur_uc.luc_fsuid = rec->rn_fsuid; - r->ur_uc.luc_fsgid = rec->rn_fsgid; - r->ur_uc.luc_cap = rec->rn_cap; - r->ur_uc.luc_suppgid1 = rec->rn_suppgid1; - r->ur_uc.luc_suppgid2 = rec->rn_suppgid2; - r->ur_fid1 = &rec->rn_fid1; - r->ur_fid2 = &rec->rn_fid2; - r->ur_time = rec->rn_time; + r->rr_uc.luc_fsuid = rec->rn_fsuid; + r->rr_uc.luc_fsgid = rec->rn_fsgid; + r->rr_uc.luc_cap = rec->rn_cap; + r->rr_uc.luc_suppgid1 = rec->rn_suppgid1; + r->rr_uc.luc_suppgid2 = rec->rn_suppgid2; + r->rr_fid1 = &rec->rn_fid1; + r->rr_fid2 = &rec->rn_fid2; + r->rr_time = rec->rn_time; LASSERT_REQSWAB (req, offset + 1); - r->ur_name = lustre_msg_string(req->rq_reqmsg, offset + 1, 0); - if (r->ur_name == NULL) + r->rr_name = lustre_msg_string(req->rq_reqmsg, offset + 1, 0); + if (r->rr_name == NULL) RETURN(-EFAULT); - r->ur_namelen = req->rq_reqmsg->buflens[offset + 1]; + r->rr_namelen = req->rq_reqmsg->buflens[offset + 1]; LASSERT_REQSWAB (req, offset + 2); - r->ur_tgt = lustre_msg_string(req->rq_reqmsg, offset + 2, 0); - if (r->ur_tgt == NULL) + r->rr_tgt = lustre_msg_string(req->rq_reqmsg, offset + 2, 0); + if (r->rr_tgt == NULL) RETURN(-EFAULT); - r->ur_tgtlen = req->rq_reqmsg->buflens[offset + 2]; + r->rr_tgtlen = req->rq_reqmsg->buflens[offset + 2]; RETURN(0); } -static int mdt_open_unpack(struct ptlrpc_request *req, int offset, - struct mdt_reint_record *r) +static int mdt_open_unpack(struct mdt_thread_info *info, + struct ptlrpc_request *req, + int offset) { struct mdt_rec_create *rec; + struct mdt_reint_record *r = &info->mti_rr; ENTRY; rec = lustre_swab_reqbuf (req, offset, sizeof (*rec), lustre_swab_mdt_rec_create); if (rec == NULL) - RETURN (-EFAULT); - - r->ur_uc.luc_fsuid = rec->cr_fsuid; - r->ur_uc.luc_fsgid = rec->cr_fsgid; - r->ur_uc.luc_cap = rec->cr_cap; - r->ur_uc.luc_suppgid1 = rec->cr_suppgid; - r->ur_uc.luc_suppgid2 = -1; - r->ur_fid1 = &rec->cr_fid; - r->ur_fid2 = &rec->cr_replayfid; - r->ur_mode = rec->cr_mode; - r->ur_rdev = rec->cr_rdev; - r->ur_time = rec->cr_time; - r->ur_flags = rec->cr_flags; + RETURN(-EFAULT); + + r->rr_uc.luc_fsuid = rec->cr_fsuid; + r->rr_uc.luc_fsgid = rec->cr_fsgid; + r->rr_uc.luc_cap = rec->cr_cap; + r->rr_uc.luc_suppgid1 = rec->cr_suppgid; + r->rr_uc.luc_suppgid2 = -1; + r->rr_fid1 = &rec->cr_fid; + r->rr_fid2 = &rec->cr_replayfid; + r->rr_mode = rec->cr_mode; + r->rr_rdev = rec->cr_rdev; + r->rr_time = rec->cr_time; + r->rr_flags = rec->cr_flags; LASSERT_REQSWAB (req, offset + 1); - r->ur_name = lustre_msg_string (req->rq_reqmsg, offset + 1, 0); - if (r->ur_name == NULL) - RETURN (-EFAULT); - r->ur_namelen = req->rq_reqmsg->buflens[offset + 1]; + r->rr_name = lustre_msg_string (req->rq_reqmsg, offset + 1, 0); + if (r->rr_name == NULL) + RETURN(-EFAULT); + r->rr_namelen = req->rq_reqmsg->buflens[offset + 1]; LASSERT_REQSWAB (req, offset + 2); if (req->rq_reqmsg->bufcount > offset + 2) { - r->ur_eadata = lustre_msg_buf(req->rq_reqmsg, offset + 2, 0); - if (r->ur_eadata == NULL) - RETURN (-EFAULT); - r->ur_eadatalen = req->rq_reqmsg->buflens[offset + 2]; + r->rr_eadata = lustre_msg_buf(req->rq_reqmsg, offset + 2, 0); + if (r->rr_eadata == NULL) + RETURN(-EFAULT); + r->rr_eadatalen = req->rq_reqmsg->buflens[offset + 2]; } RETURN(0); } -typedef int (*reint_unpacker)(struct ptlrpc_request *req, int offset, - struct mdt_reint_record *r); +typedef int (*reint_unpacker)(struct mdt_thread_info *info, + struct ptlrpc_request *req, + int offset); static reint_unpacker mdt_reint_unpackers[REINT_MAX] = { - [REINT_SETATTR] mdt_setattr_unpack, - [REINT_CREATE] mdt_create_unpack, - [REINT_LINK] mdt_link_unpack, - [REINT_UNLINK] mdt_unlink_unpack, - [REINT_RENAME] mdt_rename_unpack, - [REINT_OPEN] mdt_open_unpack, + [REINT_SETATTR] = mdt_setattr_unpack, + [REINT_CREATE] = mdt_create_unpack, + [REINT_LINK] = mdt_link_unpack, + [REINT_UNLINK] = mdt_unlink_unpack, + [REINT_RENAME] = mdt_rename_unpack, + [REINT_OPEN] = mdt_open_unpack }; -int mdt_reint_unpack(struct mdt_thread_info *info, struct ptlrpc_request *req, int offset, - struct mdt_reint_record *rec) +int mdt_reint_unpack(struct mdt_thread_info *info, + struct ptlrpc_request *req, + int offset) { - mdt_reint_t opcode, *opcodep; + mdt_reint_t opcode; + mdt_reint_t *opcodep; int rc; ENTRY; @@ -311,8 +316,8 @@ int mdt_reint_unpack(struct mdt_thread_info *info, struct ptlrpc_request *req, i RETURN(-EFAULT); } - rec->ur_opcode = opcode; - rc = mdt_reint_unpackers[opcode](req, offset, rec); + info->mti_rr.rr_opcode = opcode; + rc = mdt_reint_unpackers[opcode](info, req, offset); RETURN(rc); } diff --git a/lustre/mdt/mdt_reint.c b/lustre/mdt/mdt_reint.c index 42a13da..1d54c35 100644 --- a/lustre/mdt/mdt_reint.c +++ b/lustre/mdt/mdt_reint.c @@ -2,12 +2,13 @@ * vim:expandtab:shiftwidth=8:tabstop=8: * * linux/mdt/mdt_reint.c - * Lustre Metadata Server (mds) reintegration routines + * Lustre Metadata Target (mdt) reintegration routines * - * Copyright (C) 2002-2005 Cluster File Systems, Inc. + * Copyright (C) 2002-2006 Cluster File Systems, Inc. * Author: Peter Braam * Author: Andreas Dilger * Author: Phil Schwan + * Author: Huang Hua * * This file is part of the Lustre file system, http://www.lustre.org * Lustre is a trademark of Cluster File Systems, Inc. @@ -33,34 +34,13 @@ #endif #define DEBUG_SUBSYSTEM S_MDS -#include - -/* LUSTRE_VERSION_CODE */ -#include -/* - * struct OBD_{ALLOC,FREE}*() - * OBD_FAIL_CHECK - */ -#include -/* struct ptlrpc_request */ -#include -/* struct obd_export */ -#include -/* struct obd_device */ -#include -/* lu2dt_dev() */ -#include - - -#include "../mds/mds_internal.h" #include "mdt_internal.h" /* object operations */ -static int mdt_md_mkdir(struct mdt_thread_info *info, - struct mdt_reint_record *rec) +static int mdt_md_mkdir(struct mdt_thread_info *info) { - struct mdt_device *mdt= info->mti_mdt; + struct mdt_device *mdt = info->mti_mdt; struct mdt_object *parent; struct mdt_object *child; struct mdt_lock_handle *lh; @@ -71,15 +51,15 @@ static int mdt_md_mkdir(struct mdt_thread_info *info, lh->mlh_mode = LCK_PW; parent = mdt_object_find_lock(info->mti_ctxt, - mdt, rec->ur_fid1, lh, MDS_INODELOCK_UPDATE); + 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, rec->ur_fid2); + 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 = next->mo_ops->moo_mkdir(info->mti_ctxt, next, rec->ur_name, + result = next->mo_ops->moo_mkdir(info->mti_ctxt, next, info->mti_rr.rr_name, mdt_object_child(child)); mdt_object_put(info->mti_ctxt, child); } else @@ -91,112 +71,97 @@ static int mdt_md_mkdir(struct mdt_thread_info *info, static int mdt_reint_setattr(struct mdt_thread_info *info, - struct mdt_reint_record *rec, int offset, - struct ptlrpc_request *req, struct lustre_handle *lh) { ENTRY; - RETURN (-EOPNOTSUPP); + RETURN(-EOPNOTSUPP); } static int mdt_reint_create(struct mdt_thread_info *info, - struct mdt_reint_record *rec, int offset, - struct ptlrpc_request *req, struct lustre_handle *lh) { - int rc = 0, type = rec->ur_mode & S_IFMT; - + int rc; ENTRY; - switch (type) { + switch (info->mti_rr.rr_mode & S_IFMT) { case S_IFREG:{ - RETURN (rc = -EOPNOTSUPP); + rc = -EOPNOTSUPP; break; } case S_IFDIR:{ - rc = mdt_md_mkdir(info, rec); + rc = mdt_md_mkdir(info); break; } case S_IFLNK:{ - RETURN (rc = -EOPNOTSUPP); + rc = -EOPNOTSUPP; break; } case S_IFCHR: case S_IFBLK: case S_IFIFO: case S_IFSOCK:{ - RETURN (rc = -EOPNOTSUPP); + rc = -EOPNOTSUPP; break; } default: - CERROR("bad file type %o creating %s\n", type, rec->ur_name); + rc = -EOPNOTSUPP; } - RETURN (rc); + RETURN(rc); } static int mdt_reint_unlink(struct mdt_thread_info *info, - struct mdt_reint_record *rec, int offset, - struct ptlrpc_request *req, struct lustre_handle *lh) { ENTRY; - RETURN (-EOPNOTSUPP); + RETURN(-EOPNOTSUPP); } static int mdt_reint_link(struct mdt_thread_info *info, - struct mdt_reint_record *rec, int offset, - struct ptlrpc_request *req, struct lustre_handle *lh) { ENTRY; - RETURN (-EOPNOTSUPP); + RETURN(-EOPNOTSUPP); } static int mdt_reint_rename(struct mdt_thread_info *info, - struct mdt_reint_record *rec, int offset, - struct ptlrpc_request *req, struct lustre_handle *lockh) { ENTRY; - RETURN (-EOPNOTSUPP); + RETURN(-EOPNOTSUPP); } static int mdt_reint_open(struct mdt_thread_info *info, - struct mdt_reint_record *rec, int offset, - struct ptlrpc_request *req, - struct lustre_handle *lockh) + struct lustre_handle *lockh) { ENTRY; - RETURN (-EOPNOTSUPP); + RETURN(-EOPNOTSUPP); } typedef int (*mdt_reinter)(struct mdt_thread_info *info, - struct mdt_reint_record *, int offset, - struct ptlrpc_request *, struct lustre_handle *); + struct lustre_handle *); static mdt_reinter reinters[REINT_MAX] = { - [REINT_SETATTR] mdt_reint_setattr, - [REINT_CREATE] mdt_reint_create, - [REINT_LINK] mdt_reint_link, - [REINT_UNLINK] mdt_reint_unlink, - [REINT_RENAME] mdt_reint_rename, - [REINT_OPEN] mdt_reint_open + [REINT_SETATTR] = mdt_reint_setattr, + [REINT_CREATE] = mdt_reint_create, + [REINT_LINK] = mdt_reint_link, + [REINT_UNLINK] = mdt_reint_unlink, + [REINT_RENAME] = mdt_reint_rename, + [REINT_OPEN] = mdt_reint_open }; -int mdt_reint_rec(struct mdt_thread_info *info, struct mdt_reint_record *rec, - int offset, struct ptlrpc_request *req, +int mdt_reint_rec(struct mdt_thread_info *info, struct lustre_handle *lockh) { int rc; ENTRY; /* checked by unpacker */ - LASSERT(rec->ur_opcode < REINT_MAX && reinters[rec->ur_opcode] != NULL); + LASSERT(info->mti_rr.rr_opcode < REINT_MAX && reinters[info->mti_rr.rr_opcode] != NULL); - rc = reinters[rec->ur_opcode] (info, rec, offset, req, lockh); + rc = reinters[info->mti_rr.rr_opcode] (info, lockh); RETURN(rc); }