relock:
ma = &info->mti_attr;
+ OBD_FAIL_TIMEOUT(OBD_FAIL_MDS_RESEND, obd_timeout*2);
mdt_lock_handle_init(lhc);
mdt_lock_reg_init(lhc, LCK_PR);
/* Debugging code. */
res_id = &lock->l_resource->lr_name;
- LDLM_DEBUG(lock, "Returning lock to client\n");
+ LDLM_DEBUG(lock, "Returning lock to client");
LASSERTF(fid_res_name_eq(mdt_object_fid(child),
&lock->l_resource->lr_name),
"Lock res_id: %lu/%lu/%lu, Fid: "DFID".\n",
vallen = req_capsule_get_size(info->mti_pill, &RMF_SETINFO_VAL,
RCL_CLIENT);
+ /* Swab any part of val you need to here */
if (KEY_IS(KEY_READ_ONLY)) {
req->rq_status = 0;
lustre_msg_set_status(req->rq_repmsg, 0);
CERROR("Bad changelog_clear setinfo size %d\n", vallen);
RETURN(-EINVAL);
}
- if (lustre_msg_swabbed(req->rq_reqmsg)) {
+ if (ptlrpc_req_need_swab(req)) {
__swab64s(&cs->cs_recno);
__swab32s(&cs->cs_id);
}
int rc;
ENTRY;
- if (OBD_FAIL_CHECK(OBD_FAIL_MDS_QUOTACHECK_NET))
- RETURN(0);
-
oqctl = req_capsule_client_get(pill, &RMF_OBD_QUOTACTL);
if (oqctl == NULL)
RETURN(-EPROTO);
int id, rc;
ENTRY;
- if (OBD_FAIL_CHECK(OBD_FAIL_MDS_QUOTACTL_NET))
- RETURN(0);
-
oqctl = req_capsule_client_get(pill, &RMF_OBD_QUOTACTL);
if (oqctl == NULL)
RETURN(-EPROTO);
*
* \param info thread info object
* \param o mdt object
- * \param h mdt lock handle referencing regular and PDO locks
+ * \param lh mdt lock handle referencing regular and PDO locks
* \param decref force immediate lock releasing
*/
void mdt_object_unlock(struct mdt_thread_info *info, struct mdt_object *o,
* Checking for various OBD_FAIL_$PREF_$OPC_NET codes. _Do_ not try
* to put same checks into handlers like mdt_close(), mdt_reint(),
* etc., without talking to mdt authors first. Checking same thing
- * there again is useless and returning 0 error wihtout packing reply
+ * there again is useless and returning 0 error without packing reply
* is buggy! Handlers either pack reply or return error.
*
* We return 0 here and do not send any reply in order to emulate
switch (lustre_msg_get_opc(msg)) {
case MDS_CONNECT:
case MDS_DISCONNECT:
+ case MDS_SET_INFO:
case OBD_PING:
case SEC_CTX_INIT:
case SEC_CTX_INIT_CONT:
case MDS_SYNC:
case MDS_GETXATTR:
case MDS_SETXATTR:
- case MDS_SET_INFO:
case MDS_GET_INFO:
case MDS_QUOTACHECK:
case MDS_QUOTACTL:
if (likely(rc == 0)) {
rc = mdt_recovery(info);
if (likely(rc == +1)) {
- switch (lustre_msg_get_opc(msg)) {
- case MDS_READPAGE:
- req->rq_bulk_read = 1;
- break;
- case MDS_WRITEPAGE:
- req->rq_bulk_write = 1;
- break;
- }
-
h = mdt_handler_find(lustre_msg_get_opc(msg),
supported);
if (likely(h != NULL)) {
if (!mdt->mdt_som_conf)
data->ocd_connect_flags &= ~OBD_CONNECT_SOM;
-
+
spin_lock(&exp->exp_lock);
exp->exp_connect_flags = data->ocd_connect_flags;
spin_unlock(&exp->exp_lock);
fpin = key + size_round(sizeof(KEY_FID2PATH));
fpout = val;
- if (lustre_msg_swabbed(mdt_info_req(info)->rq_reqmsg))
+ if (ptlrpc_req_need_swab(info->mti_pill->rc_req))
lustre_swab_fid2path(fpin);
memcpy(fpout, fpin, sizeof(*fpin));
RETURN(rc);
}
+static int mdt_ioc_version_get(struct mdt_thread_info *mti, void *karg)
+{
+ struct obd_ioctl_data *data = karg;
+ struct lu_fid *fid = (struct lu_fid *)data->ioc_inlbuf1;
+ __u64 version;
+ struct mdt_object *obj;
+ struct mdt_lock_handle *lh;
+ int rc;
+ ENTRY;
+ CDEBUG(D_IOCTL, "getting version for "DFID"\n", PFID(fid));
+ if (!fid_is_sane(fid))
+ RETURN(-EINVAL);
+
+ lh = &mti->mti_lh[MDT_LH_PARENT];
+ mdt_lock_reg_init(lh, LCK_CR);
+
+ obj = mdt_object_find_lock(mti, fid, lh, MDS_INODELOCK_UPDATE);
+ if (IS_ERR(obj))
+ RETURN(PTR_ERR(obj));
+
+ rc = mdt_object_exists(obj);
+ if (rc < 0) {
+ rc = -EREMOTE;
+ /**
+ * before calling version get the correct MDS should be
+ * fid, this is error to find remote object here
+ */
+ CERROR("nonlocal object "DFID"\n", PFID(fid));
+ } else if (rc == 0) {
+ rc = -ENOENT;
+ CDEBUG(D_IOCTL, "no such object: "DFID"\n", PFID(fid));
+ } else {
+ version = mo_version_get(mti->mti_env, mdt_object_child(obj));
+ if (version < 0) {
+ rc = (int)version;
+ } else {
+ *(__u64 *)data->ioc_inlbuf2 = version;
+ rc = 0;
+ }
+ }
+ mdt_object_unlock_put(mti, obj, lh, 1);
+ RETURN(rc);
+}
+
/* ioctls on obd dev */
static int mdt_iocontrol(unsigned int cmd, struct obd_export *exp, int len,
void *karg, void *uarg)
case OBD_IOC_CHANGELOG_CLEAR:
rc = mdt_ioc_child(&env, mdt, cmd, len, karg);
break;
+ case OBD_IOC_GET_OBJ_VERSION: {
+ struct mdt_thread_info *mti;
+ mti = lu_context_key_get(&env.le_ctx, &mdt_thread_key);
+ memset(mti, 0, sizeof *mti);
+ mti->mti_env = &env;
+ mti->mti_mdt = mdt;
+ mti->mti_exp = exp;
+
+ rc = mdt_ioc_version_get(mti, karg);
+ break;
+ }
default:
CERROR("Not supported cmd = %d for device %s\n",
cmd, obd->obd_name);
return rc;
}
+/**
+ * Send a copytool req to a client
+ * Note this sends a request RPC from a server (MDT) to a client (MDC),
+ * backwards of normal comms.
+ */
+int mdt_hsm_copytool_send(struct obd_export *exp)
+{
+ struct lnl_hdr *lh;
+ struct hsm_action_list *hal;
+ struct hsm_action_item *hai;
+ int rc, len;
+ ENTRY;
+
+ CWARN("%s: writing to mdc at %s\n", exp->exp_obd->obd_name,
+ libcfs_nid2str(exp->exp_connection->c_peer.nid));
+
+ len = sizeof(*lh) + sizeof(*hal) + MTI_NAME_MAXLEN +
+ /* for mockup below */ 2 * size_round(sizeof(*hai));
+ OBD_ALLOC(lh, len);
+ if (lh == NULL)
+ RETURN(-ENOMEM);
+
+ lh->lnl_magic = LNL_MAGIC;
+ lh->lnl_transport = LNL_TRANSPORT_HSM;
+ lh->lnl_msgtype = HMT_ACTION_LIST;
+ lh->lnl_msglen = len;
+
+ hal = (struct hsm_action_list *)(lh + 1);
+ hal->hal_version = HAL_VERSION;
+ hal->hal_archive_num = 1;
+ obd_uuid2fsname(hal->hal_fsname, exp->exp_obd->obd_name,
+ MTI_NAME_MAXLEN);
+
+ /* mock up an action list */
+ hal->hal_count = 2;
+ hai = hai_zero(hal);
+ hai->hai_action = HSMA_ARCHIVE;
+ hai->hai_fid.f_oid = 0xA00A;
+ hai->hai_len = sizeof(*hai);
+ hai = hai_next(hai);
+ hai->hai_action = HSMA_RESTORE;
+ hai->hai_fid.f_oid = 0xB00B;
+ hai->hai_len = sizeof(*hai);
+
+ /* Uses the ldlm reverse import; this rpc will be seen by
+ the ldlm_callback_handler */
+ rc = target_set_info_rpc(exp->exp_imp_reverse, LDLM_SET_INFO,
+ sizeof(KEY_HSM_COPYTOOL_SEND),
+ KEY_HSM_COPYTOOL_SEND,
+ len, lh, NULL);
+
+ OBD_FREE(lh, len);
+
+ RETURN(rc);
+}
+
static struct obd_ops mdt_obd_device_ops = {
.o_owner = THIS_MODULE,
.o_set_info_async = mdt_obd_set_info_async,
}
/**
- * Enable/disable COS.
+ * Enable/disable COS (Commit On Sharing).
*
* Set/Clear the COS flag in mdt options.
*
}
/**
- * Check COS status.
+ * Check COS (Commit On Sharing) status.
*
- * Return COS flag status/
+ * Return COS flag status.
*
* \param mdt mdt device
*/
static struct mdt_handler mdt_mds_ops[] = {
DEF_MDT_HNDL_F(0, CONNECT, mdt_connect),
DEF_MDT_HNDL_F(0, DISCONNECT, mdt_disconnect),
-DEF_MDT_HNDL_F(0, SET_INFO, mdt_set_info),
+DEF_MDT_HNDL (0, SET_INFO, mdt_set_info,
+ &RQF_OBD_SET_INFO),
DEF_MDT_HNDL_F(0, GET_INFO, mdt_get_info),
DEF_MDT_HNDL_F(0 |HABEO_REFERO, GETSTATUS, mdt_getstatus),
DEF_MDT_HNDL_F(HABEO_CORPUS, GETATTR, mdt_getattr),