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
{
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);
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;
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);
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);
}
__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;
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);
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);
}
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);
/* -*- 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 <braam@clusterfs.com>
+ * Author: Andreas Dilger <adilger@clusterfs.com>
+ * Author: Phil Schwan <phil@clusterfs.com>
+ * Author: Mike Shaver <shaver@clusterfs.com>
+ * Author: Nikita Danilov <nikita@clusterfs.com>
+ * Author: Huang Hua <huanghua@clusterfs.com>
+ *
*
* This file is part of the Lustre file system, http://www.lustre.org
* Lustre is a trademark of Cluster File Systems, Inc.
#endif
#define DEBUG_SUBSYSTEM S_MDS
-#include <linux/module.h>
-
-/* LUSTRE_VERSION_CODE */
-#include <linux/lustre_ver.h>
-/*
- * struct OBD_{ALLOC,FREE}*()
- * OBD_FAIL_CHECK
- */
-#include <linux/obd_support.h>
-/* struct ptlrpc_request */
-#include <linux/lustre_net.h>
-/* struct obd_export */
-#include <linux/lustre_export.h>
-/* struct obd_device */
-#include <linux/obd.h>
-/* lu2dt_dev() */
-#include <linux/dt_object.h>
-
-
-#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) {
* 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),
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),
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;
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);
}
* 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 <braam@clusterfs.com>
* Author: Andreas Dilger <adilger@clusterfs.com>
* Author: Phil Schwan <phil@clusterfs.com>
+ * Author: Huang Hua <huanghua@clusterfs.com>
*
* This file is part of the Lustre file system, http://www.lustre.org
* Lustre is a trademark of Cluster File Systems, Inc.
#endif
#define DEBUG_SUBSYSTEM S_MDS
-#include <linux/module.h>
-
-/* LUSTRE_VERSION_CODE */
-#include <linux/lustre_ver.h>
-/*
- * struct OBD_{ALLOC,FREE}*()
- * OBD_FAIL_CHECK
- */
-#include <linux/obd_support.h>
-/* struct ptlrpc_request */
-#include <linux/lustre_net.h>
-/* struct obd_export */
-#include <linux/lustre_export.h>
-/* struct obd_device */
-#include <linux/obd.h>
-/* lu2dt_dev() */
-#include <linux/dt_object.h>
-
-
-#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;
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
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);
}