if (OBD_FAIL_CHECK(OBD_FAIL_MDS_GETSTATUS_PACK))
RETURN(err_serious(-ENOMEM));
- repbody = req_capsule_server_get(&info->mti_pill, &RMF_MDT_BODY);
+ repbody = req_capsule_server_get(info->mti_pill, &RMF_MDT_BODY);
rc = next->md_ops->mdo_root_get(info->mti_env, next, &repbody->fid1);
if (rc != 0)
RETURN(rc);
if (IS_ERR(root))
RETURN(PTR_ERR(root));
- capa = req_capsule_server_get(&info->mti_pill, &RMF_CAPA1);
+ capa = req_capsule_server_get(info->mti_pill, &RMF_CAPA1);
LASSERT(capa);
capa->lc_opc = CAPA_OPC_MDS_DEFAULT;
if (OBD_FAIL_CHECK(OBD_FAIL_MDS_STATFS_PACK)) {
rc = err_serious(-ENOMEM);
} else {
- osfs = req_capsule_server_get(&info->mti_pill,&RMF_OBD_STATFS);
+ osfs = req_capsule_server_get(info->mti_pill, &RMF_OBD_STATFS);
rc = next->md_ops->mdo_statfs(info->mti_env, next,
&info->mti_u.ksfs);
statfs_pack(osfs, &info->mti_u.ksfs);
{
struct mdt_body *b;
struct lu_attr *attr = &info->mti_attr.ma_attr;
-
- b = req_capsule_server_get(&info->mti_pill, &RMF_MDT_BODY);
+
+ b = req_capsule_server_get(info->mti_pill, &RMF_MDT_BODY);
/* Check if Size-on-MDS is enabled. */
if ((mdt_conn_flags(info) & OBD_CONNECT_SOM) &&
if (fid) {
b->fid1 = *fid;
b->valid |= OBD_MD_FLID;
- CDEBUG(D_INODE, ""DFID": nlink=%d, mode=%o, size="LPU64"\n",
+
+ /* FIXME: these should be fixed when new igif ready.*/
+ b->ino = fid_oid(fid); /* 1.6 compatibility */
+ b->generation = fid_ver(fid); /* 1.6 compatibility */
+ b->valid |= OBD_MD_FLGENER; /* 1.6 compatibility */
+
+ CDEBUG(D_INODE, DFID": nlink=%d, mode=%o, size="LPU64"\n",
PFID(fid), b->nlink, b->mode, b->size);
}
struct mdt_export_data *med = &req->rq_export->exp_mdt_data;
struct md_attr *ma = &info->mti_attr;
struct lu_attr *la = &ma->ma_attr;
- struct req_capsule *pill = &info->mti_pill;
+ struct req_capsule *pill = info->mti_pill;
const struct lu_env *env = info->mti_env;
struct mdt_body *repbody;
struct lu_buf *buffer = &info->mti_buf;
ma->ma_need = MA_LOV | MA_INODE;
}
+ if (S_ISDIR(lu_object_attr(&next->mo_lu)) &&
+ reqbody->valid & OBD_MD_FLDIREA &&
+ lustre_msg_get_opc(req->rq_reqmsg) == MDS_GETATTR) {
+ /* get default stripe info for this dir. */
+ ma->ma_need |= MA_LOV_DEF;
+ }
rc = mo_attr_get(env, next, ma);
if (unlikely(rc)) {
CERROR("getattr error for "DFID": %d\n",
info->mti_mdt->mdt_opts.mo_mds_capa) {
struct lustre_capa *capa;
- capa = req_capsule_server_get(&info->mti_pill, &RMF_CAPA1);
+ capa = req_capsule_server_get(pill, &RMF_CAPA1);
LASSERT(capa);
capa->lc_opc = CAPA_OPC_MDS_DEFAULT;
rc = mo_capa_get(env, next, capa, 0);
if (!obj || !mdt->mdt_opts.mo_mds_capa)
RETURN(0);
- body = req_capsule_server_get(&info->mti_pill, &RMF_MDT_BODY);
+ body = req_capsule_server_get(info->mti_pill, &RMF_MDT_BODY);
LASSERT(body != NULL);
- c = req_capsule_client_get(&info->mti_pill, &RMF_CAPA1);
+ c = req_capsule_client_get(info->mti_pill, &RMF_CAPA1);
LASSERT(c);
- capa = req_capsule_server_get(&info->mti_pill, &RMF_CAPA1);
+ capa = req_capsule_server_get(info->mti_pill, &RMF_CAPA2);
LASSERT(capa);
*capa = *c;
rc = mo_capa_get(info->mti_env, mdt_object_child(obj), capa, 1);
if (rc == 0)
body->valid |= OBD_MD_FLOSSCAPA;
-
RETURN(rc);
}
static int mdt_getattr(struct mdt_thread_info *info)
{
struct mdt_object *obj = info->mti_object;
- struct req_capsule *pill = &info->mti_pill;
+ struct req_capsule *pill = info->mti_pill;
struct mdt_body *reqbody;
struct mdt_body *repbody;
mode_t mode;
LASSERT(reqbody);
if (reqbody->valid & OBD_MD_FLOSSCAPA) {
- rc = req_capsule_pack(pill);
+ rc = req_capsule_server_pack(pill);
if (unlikely(rc))
- rc = err_serious(rc);
- else {
- rc = mdt_renew_capa(info);
- mdt_shrink_reply(info);
- }
- GOTO(out, rc);
+ RETURN(err_serious(rc));
+ rc = mdt_renew_capa(info);
+ GOTO(out_shrink, rc);
}
LASSERT(obj != NULL);
req_capsule_set_size(pill, &RMF_MDT_MD, RCL_SERVER, md_size);
- rc = req_capsule_pack(pill);
+ rc = req_capsule_server_pack(pill);
if (unlikely(rc != 0))
- GOTO(out, rc = err_serious(rc));
+ RETURN(err_serious(rc));
repbody = req_capsule_server_get(pill, &RMF_MDT_BODY);
LASSERT(repbody != NULL);
EXIT;
out_shrink:
mdt_shrink_reply(info);
-out:
return rc;
}
static int mdt_is_subdir(struct mdt_thread_info *info)
{
struct mdt_object *o = info->mti_object;
- struct req_capsule *pill = &info->mti_pill;
+ struct req_capsule *pill = info->mti_pill;
const struct mdt_body *body = info->mti_body;
struct mdt_body *repbody;
int rc;
} else
mdt_set_disposition(info, ldlm_rep, DISP_LOOKUP_POS);
- repbody = req_capsule_server_get(&info->mti_pill, &RMF_MDT_BODY);
+ repbody = req_capsule_server_get(info->mti_pill, &RMF_MDT_BODY);
#endif
if (rc == 0) {
- repbody = req_capsule_server_get(&info->mti_pill,
- &RMF_MDT_BODY);
+ repbody = req_capsule_server_get(info->mti_pill, &RMF_MDT_BODY);
repbody->fid1 = *child_fid;
repbody->valid = OBD_MD_FLID;
}
lustre_msg_get_flags(req->rq_reqmsg) & MSG_RESENT));
LASSERT(parent != NULL);
- name = req_capsule_client_get(&info->mti_pill, &RMF_NAME);
+ name = req_capsule_client_get(info->mti_pill, &RMF_NAME);
if (name == NULL)
RETURN(err_serious(-EFAULT));
- namelen = req_capsule_get_size(&info->mti_pill, &RMF_NAME,
+ namelen = req_capsule_get_size(info->mti_pill, &RMF_NAME,
RCL_CLIENT) - 1;
LASSERT(namelen >= 0);
* otherwise do not allow empty name, that is the name must contain
* at least one character and the terminating '\0'*/
if (namelen == 0) {
- reqbody =req_capsule_client_get(&info->mti_pill, &RMF_MDT_BODY);
+ reqbody =req_capsule_client_get(info->mti_pill, &RMF_MDT_BODY);
LASSERT(fid_is_sane(&reqbody->fid2));
name = NULL;
if (unlikely(rc != 0))
mdt_object_unlock(info, child, lhc, 1);
}
- GOTO(out, rc);
+ RETURN(rc);
}
/* step 1: lock parent */
* Pack Size-on-MDS inode attributes to the body if
* update lock is given.
*/
- repbody = req_capsule_server_get(&info->mti_pill,
+ repbody = req_capsule_server_get(info->mti_pill,
&RMF_MDT_BODY);
ma = &info->mti_attr.ma_attr;
if (lock->l_policy_data.l_inodebits.bits &
mdt_object_put(info->mti_env, child);
out_parent:
mdt_object_unlock(info, parent, lhp, 1);
-out:
return rc;
}
int rc;
ENTRY;
- reqbody = req_capsule_client_get(&info->mti_pill, &RMF_MDT_BODY);
+ reqbody = req_capsule_client_get(info->mti_pill, &RMF_MDT_BODY);
LASSERT(reqbody != NULL);
- repbody = req_capsule_server_get(&info->mti_pill, &RMF_MDT_BODY);
+ repbody = req_capsule_server_get(info->mti_pill, &RMF_MDT_BODY);
LASSERT(repbody != NULL);
info->mti_spec.sp_ck_split = !!(reqbody->valid & OBD_MD_FLCKSPLIT);
rc = mdt_init_ucred(info, reqbody);
if (unlikely(rc))
- GOTO(out, rc);
+ GOTO(out_shrink, rc);
rc = mdt_getattr_name_lock(info, lhc, MDS_INODELOCK_UPDATE, NULL);
if (lustre_handle_is_used(&lhc->mlh_reg_lh)) {
}
mdt_exit_ucred(info);
EXIT;
-out:
+out_shrink:
mdt_shrink_reply(info);
return rc;
}
int keylen, rc = 0;
ENTRY;
- rc = lustre_pack_reply(req, 1, NULL, NULL);
+ rc = req_capsule_server_pack(info->mti_pill);
if (rc)
RETURN(rc);
- key = req_capsule_client_get(&info->mti_pill, &RMF_SETINFO_KEY);
+ key = req_capsule_client_get(info->mti_pill, &RMF_SETINFO_KEY);
if (key == NULL) {
DEBUG_REQ(D_HA, req, "no set_info key");
RETURN(-EFAULT);
}
- keylen = req_capsule_get_size(&info->mti_pill, &RMF_SETINFO_KEY,
+ keylen = req_capsule_get_size(info->mti_pill, &RMF_SETINFO_KEY,
RCL_CLIENT);
- val = req_capsule_client_get(&info->mti_pill, &RMF_SETINFO_VAL);
+ val = req_capsule_client_get(info->mti_pill, &RMF_SETINFO_VAL);
if (val == NULL) {
DEBUG_REQ(D_HA, req, "no set_info val");
RETURN(-EFAULT);
desc = ptlrpc_prep_bulk_exp(req, rdpg->rp_npages, BULK_PUT_SOURCE,
MDS_BULK_PORTAL);
if (desc == NULL)
- GOTO(out, rc = -ENOMEM);
+ RETURN(-ENOMEM);
for (i = 0, tmpcount = rdpg->rp_count;
i < rdpg->rp_npages; i++, tmpcount -= tmpsize) {
ptlrpc_abort_bulk(desc);
free_desc:
ptlrpc_free_bulk(desc);
-out:
return rc;
}
ENTRY;
- reqbody = req_capsule_client_get(&info->mti_pill, &RMF_MDT_BODY);
+ reqbody = req_capsule_client_get(info->mti_pill, &RMF_MDT_BODY);
if (reqbody == NULL)
RETURN(err_serious(-EFAULT));
if (OBD_FAIL_CHECK(OBD_FAIL_MDS_READPAGE_PACK))
RETURN(err_serious(-ENOMEM));
- reqbody = req_capsule_client_get(&info->mti_pill, &RMF_MDT_BODY);
- repbody = req_capsule_server_get(&info->mti_pill, &RMF_MDT_BODY);
+ reqbody = req_capsule_client_get(info->mti_pill, &RMF_MDT_BODY);
+ repbody = req_capsule_server_get(info->mti_pill, &RMF_MDT_BODY);
if (reqbody == NULL || repbody == NULL)
RETURN(err_serious(-EFAULT));
- rc = mdt_check_ucred(info);
- if (rc)
- RETURN(err_serious(rc));
-
/*
* prepare @rdpg before calling lower layers and transfer itself. Here
* reqbody->size contains offset of where to start to read and
__cfs_free_page(rdpg->rp_pages[i]);
OBD_FREE(rdpg->rp_pages, rdpg->rp_npages * sizeof rdpg->rp_pages[0]);
- OBD_FAIL_RETURN(OBD_FAIL_MDS_SENDPAGE, 0);
+ if (OBD_FAIL_CHECK(OBD_FAIL_MDS_SENDPAGE))
+ RETURN(0);
return rc;
}
struct mdt_lock_handle *lhc,
__u32 op)
{
- struct req_capsule *pill = &info->mti_pill;
+ struct req_capsule *pill = info->mti_pill;
struct mdt_device *mdt = info->mti_mdt;
struct mdt_body *repbody;
- int need_shrink = 0;
- int rc;
+ int rc = 0;
ENTRY;
/* pack reply */
- if (req_capsule_has_field(pill, &RMF_MDT_MD, RCL_SERVER)) {
+ if (req_capsule_has_field(pill, &RMF_MDT_MD, RCL_SERVER))
req_capsule_set_size(pill, &RMF_MDT_MD, RCL_SERVER,
mdt->mdt_max_mdsize);
- need_shrink = 1;
- }
- if (req_capsule_has_field(pill, &RMF_LOGCOOKIES, RCL_SERVER)) {
+ if (req_capsule_has_field(pill, &RMF_LOGCOOKIES, RCL_SERVER))
req_capsule_set_size(pill, &RMF_LOGCOOKIES, RCL_SERVER,
mdt->mdt_max_cookiesize);
- need_shrink = 1;
- }
- rc = req_capsule_pack(pill);
+
+ rc = req_capsule_server_pack(pill);
if (rc != 0) {
CERROR("Can't pack response, rc %d\n", rc);
RETURN(err_serious(rc));
if (rc != 0)
GOTO(out_ucred, rc = err_serious(rc));
- need_shrink = 0;
if (mdt_check_resent(info, mdt_reconstruct, lhc)) {
rc = lustre_msg_get_status(mdt_info_req(info)->rq_repmsg);
GOTO(out_ucred, rc);
}
-
rc = mdt_reint_rec(info, lhc);
EXIT;
out_ucred:
mdt_exit_ucred(info);
out_shrink:
- if (need_shrink)
- mdt_shrink_reply(info);
+ mdt_shrink_reply(info);
return rc;
}
static long mdt_reint_opcode(struct mdt_thread_info *info,
const struct req_format **fmt)
{
- __u32 *ptr;
+ struct mdt_rec_reint *rec;
long opc;
opc = err_serious(-EFAULT);
- ptr = req_capsule_client_get(&info->mti_pill, &RMF_REINT_OPC);
- if (ptr != NULL) {
- opc = *ptr;
+ rec = req_capsule_client_get(info->mti_pill, &RMF_REC_REINT);
+ if (rec != NULL) {
+ opc = rec->rr_opcode;
DEBUG_REQ(D_INODE, mdt_info_req(info), "reint opt = %ld", opc);
if (opc < REINT_MAX && fmt[opc] != NULL)
- req_capsule_extend(&info->mti_pill, fmt[opc]);
+ req_capsule_extend(info->mti_pill, fmt[opc]);
else {
CERROR("Unsupported opc: %ld\n", opc);
opc = err_serious(opc);
int rc;
static const struct req_format *reint_fmts[REINT_MAX] = {
- [REINT_SETATTR] = &RQF_MDS_REINT_SETATTR,
- [REINT_CREATE] = &RQF_MDS_REINT_CREATE,
- [REINT_LINK] = &RQF_MDS_REINT_LINK,
- [REINT_UNLINK] = &RQF_MDS_REINT_UNLINK,
- [REINT_RENAME] = &RQF_MDS_REINT_RENAME,
- [REINT_OPEN] = &RQF_MDS_REINT_OPEN
+ [REINT_SETATTR] = &RQF_MDS_REINT_SETATTR,
+ [REINT_CREATE] = &RQF_MDS_REINT_CREATE,
+ [REINT_LINK] = &RQF_MDS_REINT_LINK,
+ [REINT_UNLINK] = &RQF_MDS_REINT_UNLINK,
+ [REINT_RENAME] = &RQF_MDS_REINT_RENAME,
+ [REINT_OPEN] = &RQF_MDS_REINT_OPEN,
+ [REINT_SETXATTR] = &RQF_MDS_REINT_SETXATTR
};
ENTRY;
+ if (OBD_FAIL_CHECK_RESET(OBD_FAIL_MDS_REINT_NET,
+ OBD_FAIL_MDS_REINT_NET)) {
+ info->mti_fail_id = OBD_FAIL_MDS_REINT_NET;
+ RETURN(0);
+ }
+
opc = mdt_reint_opcode(info, reint_fmts);
if (opc >= 0) {
/*
static int mdt_sync(struct mdt_thread_info *info)
{
- struct req_capsule *pill = &info->mti_pill;
+ struct req_capsule *pill = info->mti_pill;
struct mdt_body *body;
int rc;
ENTRY;
if (fid_seq(&body->fid1) == 0) {
/* sync the whole device */
- rc = req_capsule_pack(pill);
+ rc = req_capsule_server_pack(pill);
if (rc == 0)
rc = mdt_device_sync(info);
else
{
int rc;
ENTRY;
+
+ req_capsule_set(info->mti_pill, &RQF_OBD_PING);
+
rc = target_handle_ping(mdt_info_req(info));
if (rc < 0)
rc = err_serious(rc);
* bits get corrupted somewhere in mdt_intent_policy().
*/
req_bits = info->mti_dlm_req->lock_desc.l_policy_data.l_inodebits.bits;
- LASSERT(req_bits != 0);
+ /* This is disabled because we need to support liblustre flock.
+ * LASSERT(req_bits != 0);
+ */
rc = ldlm_handle_enqueue0(info->mti_mdt->mdt_namespace,
req, info->mti_dlm_req, &cbs);
struct mdt_object *m;
ENTRY;
+ CDEBUG(D_INFO, "Find object for "DFID"\n", PFID(f));
o = lu_object_find(env, d->mdt_md_dev.md_lu_dev.ld_site, f);
if (unlikely(IS_ERR(o)))
m = (struct mdt_object *)o;
const struct lu_env *env;
struct req_capsule *pill;
int rc;
+ ENTRY;
env = info->mti_env;
- pill = &info->mti_pill;
+ pill = info->mti_pill;
body = info->mti_body = req_capsule_client_get(pill, &RMF_MDT_BODY);
if (body == NULL)
- return -EFAULT;
+ RETURN(-EFAULT);
+
+ if (!(body->valid & OBD_MD_FLID))
+ RETURN(0);
if (!fid_is_sane(&body->fid1)) {
CERROR("Invalid fid: "DFID"\n", PFID(&body->fid1));
- return -EINVAL;
+ RETURN(-EINVAL);
}
/*
} else
rc = PTR_ERR(obj);
- return rc;
+ RETURN(rc);
}
static int mdt_unpack_req_pack_rep(struct mdt_thread_info *info, __u32 flags)
{
- struct req_capsule *pill;
+ struct req_capsule *pill = info->mti_pill;
int rc;
-
ENTRY;
- pill = &info->mti_pill;
if (req_capsule_has_field(pill, &RMF_MDT_BODY, RCL_CLIENT))
rc = mdt_body_unpack(info, flags);
req_capsule_set_size(pill, &RMF_LOGCOOKIES, RCL_SERVER,
mdt->mdt_max_cookiesize);
- rc = req_capsule_pack(pill);
+ rc = req_capsule_server_pack(pill);
}
RETURN(rc);
}
/*
* Mask out OBD_FAIL_ONCE, because that will stop
* correct handling of failed req later in ldlm due to doing
- * obd_fail_loc |= OBD_FAIL_ONCE | OBD_FAILED without actually
+ * obd_fail_loc |= OBD_FAIL_ONCE without actually
* correct actions like it is done in target_send_reply_msg().
*/
if (h->mh_fail_id != 0) {
* Set to info->mti_fail_id to handler fail_id, it will be used
* later, and better than use default fail_id.
*/
- if (OBD_FAIL_CHECK(h->mh_fail_id && OBD_FAIL_MASK_LOC)) {
+ if (OBD_FAIL_CHECK_RESET(h->mh_fail_id && OBD_FAIL_MASK_LOC,
+ h->mh_fail_id & ~OBD_FAILED)) {
info->mti_fail_id = h->mh_fail_id;
RETURN(0);
}
LASSERT(ergo(flags & (HABEO_CORPUS|HABEO_REFERO), h->mh_fmt != NULL));
if (h->mh_fmt != NULL) {
- req_capsule_set(&info->mti_pill, h->mh_fmt);
+ req_capsule_set(info->mti_pill, h->mh_fmt);
rc = mdt_unpack_req_pack_rep(info, flags);
}
LASSERT(h->mh_fmt != NULL);
- dlm_req = req_capsule_client_get(&info->mti_pill, &RMF_DLM_REQ);
+ dlm_req = req_capsule_client_get(info->mti_pill, &RMF_DLM_REQ);
if (dlm_req != NULL) {
if (info->mti_mdt->mdt_opts.mo_compat_resname)
rc = mdt_lock_resname_compat(info->mti_mdt,
dlm_req);
info->mti_dlm_req = dlm_req;
} else {
- CERROR("Can't unpack dlm request\n");
rc = -EFAULT;
}
}
info->mti_mdt->mdt_opts.mo_compat_resname) {
struct ldlm_reply *dlmrep;
- dlmrep = req_capsule_server_get(&info->mti_pill, &RMF_DLM_REP);
+ dlmrep = req_capsule_server_get(info->mti_pill, &RMF_DLM_REP);
if (dlmrep != NULL)
rc = mdt_lock_reply_compat(info->mti_mdt, dlmrep);
}
int i;
struct md_capainfo *ci;
- info->mti_rep_buf_nr = ARRAY_SIZE(info->mti_rep_buf_size);
- for (i = 0; i < ARRAY_SIZE(info->mti_rep_buf_size); i++)
- info->mti_rep_buf_size[i] = -1;
- req_capsule_init(&info->mti_pill, req, RCL_SERVER,
- info->mti_rep_buf_size);
+ req_capsule_init(&req->rq_pill, req, RCL_SERVER);
+ info->mti_pill = &req->rq_pill;
/* lock handle */
for (i = 0; i < ARRAY_SIZE(info->mti_lh); i++)
{
int i;
- req_capsule_fini(&info->mti_pill);
+ req_capsule_fini(info->mti_pill);
if (info->mti_object != NULL) {
mdt_object_put(info->mti_env, info->mti_object);
info->mti_object = NULL;
ENTRY;
- OBD_FAIL_RETURN(OBD_FAIL_MDS_ALL_REQUEST_NET | OBD_FAIL_ONCE, 0);
+ if (OBD_FAIL_CHECK_ORSET(OBD_FAIL_MDS_ALL_REQUEST_NET, OBD_FAIL_ONCE))
+ RETURN(0);
LASSERT(current->journal_info == NULL);
if (!(lustre_msg_get_flags(req->rq_reqmsg) & MSG_RESENT))
return;
- dlmreq = req_capsule_client_get(&info->mti_pill, &RMF_DLM_REQ);
+ dlmreq = req_capsule_client_get(info->mti_pill, &RMF_DLM_REQ);
remote_hdl = dlmreq->lock_handle[0];
spin_lock(&exp->exp_ldlm_data.led_lock);
int rc;
ENTRY;
- reqbody = req_capsule_client_get(&info->mti_pill, &RMF_MDT_BODY);
+ reqbody = req_capsule_client_get(info->mti_pill, &RMF_MDT_BODY);
LASSERT(reqbody);
- repbody = req_capsule_server_get(&info->mti_pill, &RMF_MDT_BODY);
+ repbody = req_capsule_server_get(info->mti_pill, &RMF_MDT_BODY);
LASSERT(repbody);
info->mti_spec.sp_ck_split = !!(reqbody->valid & OBD_MD_FLCKSPLIT);
break;
default:
CERROR("Unhandled till now");
- GOTO(out, rc = -EINVAL);
+ GOTO(out_shrink, rc = -EINVAL);
}
rc = mdt_init_ucred(info, reqbody);
if (rc)
- GOTO(out, rc);
+ GOTO(out_shrink, rc);
- req = info->mti_pill.rc_req;
- ldlm_rep = req_capsule_server_get(&info->mti_pill, &RMF_DLM_REP);
+ req = info->mti_pill->rc_req;
+ ldlm_rep = req_capsule_server_get(info->mti_pill, &RMF_DLM_REP);
mdt_set_disposition(info, ldlm_rep, DISP_IT_EXECD);
/* Get lock from request for possible resent case. */
EXIT;
out_ucred:
mdt_exit_ucred(info);
-out:
+out_shrink:
mdt_shrink_reply(info);
return rc;
}
opc = mdt_reint_opcode(info, intent_fmts);
if (opc < 0)
- GOTO(out, rc = opc);
+ RETURN(opc);
if (mdt_it_flavor[opcode].it_reint != opc) {
CERROR("Reint code %ld doesn't match intent: %d\n",
opc, opcode);
- GOTO(out, rc = err_serious(-EPROTO));
+ RETURN(err_serious(-EPROTO));
}
/* Get lock from request for possible resent case. */
/* Check whether the reply has been packed successfully. */
if (mdt_info_req(info)->rq_repmsg != NULL)
- rep = req_capsule_server_get(&info->mti_pill, &RMF_DLM_REP);
+ rep = req_capsule_server_get(info->mti_pill, &RMF_DLM_REP);
if (rep == NULL)
- GOTO(out, rc = err_serious(-EFAULT));
+ RETURN(err_serious(-EFAULT));
/* MDC expects this in any case */
if (rc != 0)
LASSERT(lustre_handle_is_used(&lhc->mlh_reg_lh));
rep->lock_policy_res2 = 0;
rc = mdt_intent_lock_replace(info, lockp, NULL, lhc, flags);
- GOTO(out, rc);
+ RETURN(rc);
}
rep->lock_policy_res2 = clear_serious(rc);
lhc->mlh_reg_lh.cookie = 0ull;
rc = ELDLM_LOCK_ABORTED;
- EXIT;
-out:
- return rc;
+ RETURN(rc);
}
static int mdt_intent_code(long itcode)
if (opc < 0)
RETURN(-EINVAL);
- pill = &info->mti_pill;
+ pill = info->mti_pill;
flv = &mdt_it_flavor[opc];
if (flv->it_fmt != NULL)
struct ptlrpc_request *req = mdt_info_req(info);
if (flv->it_flags & MUTABOR &&
req->rq_export->exp_connect_flags & OBD_CONNECT_RDONLY)
- rc = -EROFS;
+ RETURN(-EROFS);
}
if (rc == 0 && flv->it_act != NULL) {
/* execute policy */
rc = flv->it_act(opc, info, lockp, flags);
- } else
+ } else {
rc = -EOPNOTSUPP;
+ }
RETURN(rc);
}
info = lu_context_key_get(&req->rq_svc_thread->t_env->le_ctx,
&mdt_thread_key);
LASSERT(info != NULL);
- pill = &info->mti_pill;
+ pill = info->mti_pill;
LASSERT(pill->rc_req == req);
if (req->rq_reqmsg->lm_bufcount > DLM_INTENT_IT_OFF) {
} else {
/* No intent was provided */
LASSERT(pill->rc_fmt == &RQF_LDLM_ENQUEUE);
- rc = req_capsule_pack(pill);
+ rc = req_capsule_server_pack(pill);
if (rc)
rc = err_serious(rc);
}
lu_site_purge(env, top->ld_site, ~0);
while (d != NULL) {
- struct obd_type *type;
struct lu_device_type *ldt = d->ld_type;
/* each fini() returns next device in stack of layers
- * * so we can avoid the recursion */
+ * so we can avoid the recursion */
n = ldt->ldt_ops->ldto_device_fini(env, d);
lu_device_put(d);
- ldt->ldt_ops->ldto_device_free(env, d);
+
+ /* switch to the next device in the layer */
+ d = n;
+ }
+
+ /* purge again. */
+ lu_site_purge(env, top->ld_site, ~0);
+
+ if (!list_empty(&top->ld_site->ls_lru) || top->ld_site->ls_total != 0) {
+ /*
+ * Uh-oh, objects still exist.
+ */
+ static DECLARE_LU_CDEBUG_PRINT_INFO(cookie, D_ERROR);
+
+ lu_site_print(env, top->ld_site, &cookie, lu_cdebug_printer);
+ }
+
+ d = top;
+ while (d != NULL) {
+ struct obd_type *type;
+ struct lu_device_type *ldt = d->ld_type;
+
+ /* each free() returns next device in stack of layers
+ * so we can avoid the recursion */
+ n = ldt->ldt_ops->ldto_device_free(env, d);
type = ldt->ldt_obd_type;
type->typ_refcnt--;
class_put_type(type);
ENTRY;
ping_evictor_stop();
-
+
target_recovery_fini(obd);
mdt_stop_ptlrpc_service(m);
mdt_fs_cleanup(env, m);
- upcall_cache_cleanup(m->mdt_rmtacl_cache);
- m->mdt_rmtacl_cache = NULL;
-
upcall_cache_cleanup(m->mdt_identity_cache);
m->mdt_identity_cache = NULL;
ptlrpc_lprocfs_unregister_obd(d->ld_obd);
lprocfs_obd_cleanup(d->ld_obd);
- if (m->mdt_rootsquash_info) {
- OBD_FREE_PTR(m->mdt_rootsquash_info);
- m->mdt_rootsquash_info = NULL;
- }
+ sptlrpc_rule_set_free(&m->mdt_sptlrpc_rset);
next->md_ops->mdo_init_capa_ctxt(env, next, 0, 0, 0, NULL);
del_timer(&m->mdt_ck_timer);
mdt_stack_fini(env, m, md2lu_dev(m->mdt_child));
if (ls) {
- if (!list_empty(&ls->ls_lru) || ls->ls_total != 0) {
- /*
- * Uh-oh, objects still exist.
- */
- static DECLARE_LU_CDEBUG_PRINT_INFO(cookie, D_ERROR);
-
- lu_site_print(env, ls, &cookie, lu_cdebug_printer);
- }
-
lu_site_fini(ls);
OBD_FREE_PTR(ls);
d->ld_site = NULL;
{
char *p = options;
+#ifdef CONFIG_FS_POSIX_ACL
+ /* ACLs should be enabled by default (b=13829) */
+ m->mdt_opts.mo_acl = 1;
+ LCONSOLE_INFO("Enabling ACL\n");
+#else
+ m->mdt_opts.mo_acl = 0;
+ LCONSOLE_INFO("Disabling ACL\n");
+#endif
+
if (!options)
return;
(memcmp(options, "nouser_xattr", len) == 0)) {
m->mdt_opts.mo_user_xattr = 0;
LCONSOLE_INFO("Disabling user_xattr\n");
- } else if ((len == sizeof("acl") - 1) &&
- (memcmp(options, "acl", len) == 0)) {
-#ifdef CONFIG_FS_POSIX_ACL
- m->mdt_opts.mo_acl = 1;
- LCONSOLE_INFO("Enabling ACL\n");
-#else
- m->mdt_opts.mo_acl = 0;
- CWARN("ignoring unsupported acl mount option\n");
- LCONSOLE_INFO("Disabling ACL\n");
-#endif
} else if ((len == sizeof("noacl") - 1) &&
(memcmp(options, "noacl", len) == 0)) {
m->mdt_opts.mo_acl = 0;
struct lustre_mount_info *lmi;
struct lustre_sb_info *lsi;
struct lu_site *s;
+ const char *identity_upcall = "NONE";
int rc;
ENTRY;
server_put_mount_2(dev, lmi->lmi_mnt);
}
+ m->mdt_sptlrpc_lock = RW_LOCK_UNLOCKED;
+ sptlrpc_rule_set_init(&m->mdt_sptlrpc_rset);
+
spin_lock_init(&m->mdt_ioepoch_lock);
m->mdt_opts.mo_compat_resname = 0;
m->mdt_capa_timeout = CAPA_TIMEOUT;
GOTO(err_free_site, rc);
}
- lprocfs_init_vars(mdt, &lvars);
+ lprocfs_mdt_init_vars(&lvars);
rc = lprocfs_obd_setup(obd, lvars.obd_vars);
if (rc) {
CERROR("Can't init lprocfs, rc %d\n", rc);
/* set obd_namespace for compatibility with old code */
obd->obd_namespace = m->mdt_namespace;
- m->mdt_identity_cache = upcall_cache_init(obd->obd_name,
- "NONE",
+ /* XXX: to support suppgid for ACL, we enable identity_upcall
+ * by default, otherwise, maybe got unexpected -EACCESS. */
+ if (m->mdt_opts.mo_acl)
+ identity_upcall = MDT_IDENTITY_UPCALL_PATH;
+
+ m->mdt_identity_cache = upcall_cache_init(obd->obd_name, identity_upcall,
&mdt_identity_upcall_cache_ops);
if (IS_ERR(m->mdt_identity_cache)) {
rc = PTR_ERR(m->mdt_identity_cache);
GOTO(err_free_ns, rc);
}
- m->mdt_rmtacl_cache = upcall_cache_init(obd->obd_name,
- MDT_RMTACL_UPCALL_PATH,
- &mdt_rmtacl_upcall_cache_ops);
- if (IS_ERR(m->mdt_rmtacl_cache)) {
- rc = PTR_ERR(m->mdt_rmtacl_cache);
- m->mdt_rmtacl_cache = NULL;
- GOTO(err_free_ns, rc);
- }
-
m->mdt_ck_timer.function = mdt_ck_timer_callback;
m->mdt_ck_timer.data = (unsigned long)m;
init_timer(&m->mdt_ck_timer);
del_timer(&m->mdt_ck_timer);
mdt_ck_thread_stop(m);
err_free_ns:
- upcall_cache_cleanup(m->mdt_rmtacl_cache);
- m->mdt_rmtacl_cache = NULL;
upcall_cache_cleanup(m->mdt_identity_cache);
m->mdt_identity_cache = NULL;
ldlm_namespace_free(m->mdt_namespace, 0);
ENTRY;
switch (cfg->lcfg_command) {
+ case LCFG_SPTLRPC_CONF: {
+ struct sptlrpc_conf_log *log;
+ struct sptlrpc_rule_set tmp_rset;
+
+ log = sptlrpc_conf_log_extract(cfg);
+ if (IS_ERR(log)) {
+ rc = PTR_ERR(log);
+ break;
+ }
+
+ sptlrpc_rule_set_init(&tmp_rset);
+
+ rc = sptlrpc_rule_set_from_log(&tmp_rset, log);
+ if (rc) {
+ CERROR("mdt %p: failed get sptlrpc rules: %d\n", m, rc);
+ break;
+ }
+
+ write_lock(&m->mdt_sptlrpc_lock);
+ sptlrpc_rule_set_free(&m->mdt_sptlrpc_rset);
+ m->mdt_sptlrpc_rset = tmp_rset;
+ write_unlock(&m->mdt_sptlrpc_lock);
+
+ sptlrpc_target_update_exp_flavor(
+ md2lu_dev(&m->mdt_md_dev)->ld_obd, &tmp_rset);
+
+ break;
+ }
case LCFG_PARAM: {
struct lprocfs_static_vars lvars;
struct obd_device *obd = d->ld_obd;
- lprocfs_init_vars(mdt, &lvars);
+ lprocfs_mdt_init_vars(&lvars);
rc = class_process_proc_param(PARAM_MDT, lvars.obd_vars, cfg, obd);
if (rc)
/* others are passed further */
return -EBADE;
}
+ if ((exp->exp_connect_flags & OBD_CONNECT_FID) == 0) {
+ CWARN("%s: MDS requires FID support, but client not\n",
+ mdt->mdt_md_dev.md_lu_dev.ld_obd->obd_name);
+ return -EBADE;
+ }
+
return 0;
}
struct obd_uuid *cluuid,
struct obd_connect_data *data)
{
+ struct mdt_thread_info *info;
struct mdt_client_data *mcd;
struct obd_export *exp;
struct mdt_device *mdt;
+ struct ptlrpc_request *req;
int rc;
ENTRY;
if (!conn || !obd || !cluuid)
RETURN(-EINVAL);
+ info = lu_context_key_get(&env->le_ctx, &mdt_thread_key);
+ req = info->mti_pill->rc_req;
mdt = mdt_dev(obd->obd_lu_dev);
rc = class_connect(conn, obd, cluuid);
exp = class_conn2export(conn);
LASSERT(exp != NULL);
+ CDEBUG(D_SEC, "from %s\n", sptlrpc_part2name(req->rq_sp_from));
+
+ spin_lock(&exp->exp_lock);
+ exp->exp_sp_peer = req->rq_sp_from;
+
+ read_lock(&mdt->mdt_sptlrpc_lock);
+ sptlrpc_rule_set_choose(&mdt->mdt_sptlrpc_rset, exp->exp_sp_peer,
+ req->rq_peer.nid, &exp->exp_flvr);
+ read_unlock(&mdt->mdt_sptlrpc_lock);
+
+ if (exp->exp_flvr.sf_rpc != req->rq_flvr.sf_rpc) {
+ CERROR("invalid rpc flavor %x, expect %x, from %s\n",
+ req->rq_flvr.sf_rpc, exp->exp_flvr.sf_rpc,
+ libcfs_nid2str(req->rq_peer.nid));
+ exp->exp_flvr.sf_rpc = SPTLRPC_FLVR_INVALID;
+ spin_unlock(&exp->exp_lock);
+ RETURN(-EACCES);
+ }
+ spin_unlock(&exp->exp_lock);
+
rc = mdt_connect_internal(exp, mdt, data);
if (rc == 0) {
OBD_ALLOC_PTR(mcd);
RETURN(rc);
}
-static int mdt_obd_reconnect(struct obd_export *exp, struct obd_device *obd,
+static int mdt_obd_reconnect(const struct lu_env *env,
+ struct obd_export *exp, struct obd_device *obd,
struct obd_uuid *cluuid,
struct obd_connect_data *data)
{
- int rc;
+ struct mdt_thread_info *info;
+ struct mdt_device *mdt;
+ struct ptlrpc_request *req;
+ int rc;
ENTRY;
if (exp == NULL || obd == NULL || cluuid == NULL)
RETURN(-EINVAL);
+ info = lu_context_key_get(&env->le_ctx, &mdt_thread_key);
+ req = info->mti_pill->rc_req;
+ mdt = mdt_dev(obd->obd_lu_dev);
+
+ CDEBUG(D_SEC, "from %s\n", sptlrpc_part2name(req->rq_sp_from));
+
+ spin_lock(&exp->exp_lock);
+ if (exp->exp_flvr.sf_rpc == SPTLRPC_FLVR_INVALID) {
+ exp->exp_sp_peer = req->rq_sp_from;
+
+ read_lock(&mdt->mdt_sptlrpc_lock);
+ sptlrpc_rule_set_choose(&mdt->mdt_sptlrpc_rset,
+ exp->exp_sp_peer,
+ req->rq_peer.nid, &exp->exp_flvr);
+ read_unlock(&mdt->mdt_sptlrpc_lock);
+
+ if (exp->exp_flvr.sf_rpc != req->rq_flvr.sf_rpc) {
+ CERROR("invalid rpc flavor %x, expect %x, from %s\n",
+ req->rq_flvr.sf_rpc, exp->exp_flvr.sf_rpc,
+ libcfs_nid2str(req->rq_peer.nid));
+ exp->exp_flvr.sf_rpc = SPTLRPC_FLVR_INVALID;
+ spin_unlock(&exp->exp_lock);
+ RETURN(-EACCES);
+ }
+ }
+ spin_unlock(&exp->exp_lock);
+
rc = mdt_connect_internal(exp, mdt_dev(obd->obd_lu_dev), data);
RETURN(rc);
INIT_LIST_HEAD(&med->med_open_head);
spin_lock_init(&med->med_open_lock);
+ sema_init(&med->med_idmap_sem, 1);
+ med->med_idmap = NULL;
spin_lock(&exp->exp_lock);
exp->exp_connecting = 1;
spin_unlock(&exp->exp_lock);
struct obd_device *obd = mdt->mdt_md_dev.md_lu_dev.ld_obd;
int rc, lost;
ENTRY;
- /* if some clients didn't participate in recovery then we can possibly
+ /* if some clients didn't participate in recovery then we can possibly
* lost sequence. Now we should increase sequence for safe value */
lost = obd->obd_max_recoverable_clients - obd->obd_connected_clients;
mdt_seq_adjust(env, mdt, lost);
-
+
rc = ld->ld_ops->ldo_recovery_complete(env, ld);
RETURN(rc);
}
RETURN(NULL);
}
-static void mdt_device_free(const struct lu_env *env, struct lu_device *d)
+static struct lu_device *mdt_device_free(const struct lu_env *env,
+ struct lu_device *d)
{
struct mdt_device *m = mdt_dev(d);
+ ENTRY;
OBD_FREE_PTR(m);
+ RETURN(NULL);
}
static struct lu_device *mdt_device_alloc(const struct lu_env *env,
return l;
}
-/*
- * context key constructor/destructor
- */
+/* context key constructor/destructor: mdt_key_init, mdt_key_fini */
LU_KEY_INIT_FINI(mdt, struct mdt_thread_info);
+/* context key: mdt_thread_key */
LU_CONTEXT_KEY_DEFINE(mdt, LCT_MD_THREAD);
+/* context key constructor/destructor: mdt_txn_key_init, mdt_txn_key_fini */
LU_KEY_INIT_FINI(mdt_txn, struct mdt_txn_info);
struct lu_context_key mdt_txn_key = {
return md_ucred(info->mti_env);
}
+/* type constructor/destructor: mdt_type_init, mdt_type_fini */
LU_TYPE_INIT_FINI(mdt, &mdt_thread_key, &mdt_txn_key);
static struct lu_device_type_operations mdt_device_type_ops = {
int rc;
mdt_num_threads = MDT_NUM_THREADS;
- lprocfs_init_vars(mdt, &lvars);
+ lprocfs_mdt_init_vars(&lvars);
rc = class_register_type(&mdt_obd_device_ops, NULL,
lvars.module_vars, LUSTRE_MDT_NAME,
&mdt_device_type);
DEF_MDT_HNDL_F(0 |HABEO_REFERO, GETSTATUS, mdt_getstatus),
DEF_MDT_HNDL_F(HABEO_CORPUS, GETATTR, mdt_getattr),
DEF_MDT_HNDL_F(HABEO_CORPUS|HABEO_REFERO, GETATTR_NAME, mdt_getattr_name),
-DEF_MDT_HNDL_F(HABEO_CORPUS|MUTABOR, SETXATTR, mdt_setxattr),
DEF_MDT_HNDL_F(HABEO_CORPUS, GETXATTR, mdt_getxattr),
DEF_MDT_HNDL_F(0 |HABEO_REFERO, STATFS, mdt_statfs),
DEF_MDT_HNDL_F(0 |MUTABOR, REINT, mdt_reint),
DEF_MDT_HNDL_F(0 |HABEO_REFERO, PIN, mdt_pin),
DEF_MDT_HNDL_0(0, SYNC, mdt_sync),
DEF_MDT_HNDL_F(HABEO_CORPUS|HABEO_REFERO, IS_SUBDIR, mdt_is_subdir),
-DEF_MDT_HNDL_0(0, QUOTACHECK, mdt_quotacheck_handle),
-DEF_MDT_HNDL_0(0, QUOTACTL, mdt_quotactl_handle)
+DEF_MDT_HNDL_F(0, QUOTACHECK, mdt_quotacheck_handle),
+DEF_MDT_HNDL_F(0, QUOTACTL, mdt_quotactl_handle)
};
#define DEF_OBD_HNDL(flags, name, fn) \
.mos_hs = mdt_obd_ops
},
{
+ .mos_opc_start = SEC_CTX_INIT,
+ .mos_opc_end = SEC_LAST_OPC,
+ .mos_hs = mdt_sec_ctx_ops
+ },
+ {
.mos_hs = NULL
}
};