/* this should sync this object */
static int mdt_object_sync(struct mdt_thread_info *info)
{
- struct md_object *next;
- int rc;
- ENTRY;
+ struct md_object *next;
+ int rc;
+ ENTRY;
- if (!mdt_object_exists(info->mti_object)) {
- CWARN("Non existing object "DFID"!\n",
- PFID(mdt_object_fid(info->mti_object)));
- RETURN(-ESTALE);
- }
- next = mdt_object_child(info->mti_object);
- rc = mo_object_sync(info->mti_env, next);
+ if (!mdt_object_exists(info->mti_object)) {
+ CWARN("%s: non existing object "DFID": rc = %d\n",
+ mdt_obd_name(info->mti_mdt),
+ PFID(mdt_object_fid(info->mti_object)), -ESTALE);
+ RETURN(-ESTALE);
+ }
+ next = mdt_object_child(info->mti_object);
+ rc = mo_object_sync(info->mti_env, next);
- RETURN(rc);
+ RETURN(rc);
}
static int mdt_sync(struct tgt_session_info *tsi)
static void mdt_device_commit_async(const struct lu_env *env,
struct mdt_device *mdt)
{
- struct dt_device *dt = mdt->mdt_bottom;
- int rc;
+ struct dt_device *dt = mdt->mdt_bottom;
+ int rc;
- rc = dt->dd_ops->dt_commit_async(env, dt);
- if (unlikely(rc != 0))
- CWARN("async commit start failed with rc = %d", rc);
+ rc = dt->dd_ops->dt_commit_async(env, dt);
+ if (unlikely(rc != 0))
+ CWARN("%s: async commit start failed: rc = %d\n",
+ mdt_obd_name(mdt), rc);
}
/**
if (lock->l_req_mode == LCK_COS && lock->l_blocking_lock != NULL) {
struct lu_env env;
- rc = lu_env_init(&env, LCT_LOCAL);
- if (unlikely(rc != 0))
- CWARN("lu_env initialization failed with rc = %d,"
- "cannot start asynchronous commit\n", rc);
+ rc = lu_env_init(&env, LCT_LOCAL);
+ if (unlikely(rc != 0))
+ CWARN("%s: lu_env initialization failed, cannot "
+ "start asynchronous commit: rc = %d\n",
+ obd->obd_name, rc);
else
mdt_device_commit_async(&env, mdt);
lu_env_fini(&env);
ENTRY;
+ if (OBD_FAIL_CHECK(OBD_FAIL_TGT_DELAY_CONDITIONAL) &&
+ cfs_fail_val ==
+ tsi2mdt_info(tsi)->mti_mdt->mdt_seq_site.ss_node_id)
+ schedule_timeout_and_set_state(TASK_UNINTERRUPTIBLE, HZ * 3);
+
rc = tgt_connect(tsi);
if (rc != 0)
RETURN(rc);
struct ldlm_lock **lockp,
__u64 flags)
{
+ struct mdt_lock_handle *lhc = &info->mti_lh[MDT_LH_LAYOUT];
struct layout_intent *layout;
struct lu_fid *fid;
struct mdt_object *obj = NULL;
fid = &info->mti_tmp_fid2;
fid_extract_from_res_name(fid, &(*lockp)->l_resource->lr_name);
+ /* Get lock from request for possible resent case. */
+ mdt_intent_fixup_resent(info, *lockp, lhc, flags);
+
obj = mdt_object_find(info->mti_env, info->mti_mdt, fid);
if (IS_ERR(obj))
RETURN(PTR_ERR(obj));
if (mdt_object_exists(obj) && !mdt_object_remote(obj)) {
/* get the length of lsm */
rc = mdt_attr_get_eabuf_size(info, obj);
- if (rc < 0)
+ if (rc < 0) {
+ mdt_object_put(info->mti_env, obj);
RETURN(rc);
+ }
if (rc > info->mti_mdt->mdt_max_mdsize)
info->mti_mdt->mdt_max_mdsize = rc;
if (rc != 0)
RETURN(-EINVAL);
+ if (lustre_handle_is_used(&lhc->mlh_reg_lh))
+ rc = mdt_intent_lock_replace(info, lockp, lhc, flags);
+
layout = req_capsule_client_get(info->mti_pill, &RMF_LAYOUT_INTENT);
LASSERT(layout != NULL);
if (layout->li_opc == LAYOUT_INTENT_ACCESS)
- /* return to normal ldlm handling */
- RETURN(0);
+ /* return to normal/resent ldlm handling */
+ RETURN(rc);
CERROR("%s: Unsupported layout intent (%d)\n",
mdt_obd_name(info->mti_mdt), layout->li_opc);
lustre_cfg_bufs_set_string(bufs, 1, NULL);
lcfg = lustre_cfg_new(LCFG_PRE_CLEANUP, bufs);
if (!lcfg) {
- CERROR("%s:Cannot alloc lcfg!\n", mdt_obd_name(m));
+ CERROR("%s: cannot alloc lcfg\n", mdt_obd_name(m));
return;
}
top->ld_ops->ldo_process_config(env, top, lcfg);
data->ocd_connect_flags &= MDT_CONNECT_SUPPORTED;
data->ocd_ibits_known &= MDS_INODELOCK_FULL;
- /* If no known bits (which should not happen, probably,
- as everybody should support LOOKUP and UPDATE bits at least)
- revert to compat mode with plain locks. */
- if (!data->ocd_ibits_known &&
- data->ocd_connect_flags & OBD_CONNECT_IBITS)
- data->ocd_connect_flags &= ~OBD_CONNECT_IBITS;
+ if (!(data->ocd_connect_flags & OBD_CONNECT_MDS_MDS) &&
+ !(data->ocd_connect_flags & OBD_CONNECT_IBITS)) {
+ CWARN("%s: client %s does not support ibits lock, either "
+ "very old or an invalid client: flags "LPX64"\n",
+ mdt_obd_name(mdt), exp->exp_client_uuid.uuid,
+ data->ocd_connect_flags);
+ return -EBADE;
+ }
if (!mdt->mdt_opts.mo_acl)
data->ocd_connect_flags &= ~OBD_CONNECT_ACL;
LASSERT(exp);
class_export_get(exp);
- rc = server_disconnect_export(exp);
- if (rc != 0)
- CDEBUG(D_IOCTL, "server disconnect error: %d\n", rc);
+ rc = server_disconnect_export(exp);
+ if (rc != 0)
+ CDEBUG(D_IOCTL, "server disconnect error: rc = %d\n", rc);
- rc = mdt_export_cleanup(exp);
- class_export_put(exp);
- RETURN(rc);
+ rc = mdt_export_cleanup(exp);
+ class_export_put(exp);
+ RETURN(rc);
}
/* FIXME: Can we avoid using these two interfaces? */
if (IS_ERR(mdt_obj))
GOTO(out, rc = PTR_ERR(mdt_obj));
- if (mdt_object_remote(mdt_obj)) {
+ if (!mdt_object_exists(mdt_obj)) {
mdt_object_put(info->mti_env, mdt_obj);
- GOTO(remote_out, rc = -EREMOTE);
- }
-
- lmv_buf.lb_buf = info->mti_xattr_buf;
- lmv_buf.lb_len = sizeof(info->mti_xattr_buf);
-
- /* Check if it is slave stripes */
- rc = mo_xattr_get(info->mti_env, mdt_object_child(mdt_obj),
- &lmv_buf, XATTR_NAME_LMV);
- if (rc > 0) {
- union lmv_mds_md *lmm = lmv_buf.lb_buf;
-
- /* For slave stripes, get its master */
- if (le32_to_cpu(lmm->lmv_magic) == LMV_MAGIC_STRIPE) {
- struct lmv_mds_md_v1 *lmm1 = &lmm->lmv_md_v1;
-
- fid_le_to_cpu(tmpfid, &lmm1->lmv_master_fid);
- if (!fid_is_sane(tmpfid)) {
- mdt_object_put(info->mti_env, mdt_obj);
- GOTO(out, rc = -EINVAL);
- }
- mdt_object_put(info->mti_env, mdt_obj);
- pli->pli_fids[pli->pli_fidcount] = *tmpfid;
- continue;
- }
+ GOTO(out, rc = -ENOENT);
}
- if (!mdt_object_exists(mdt_obj)) {
+ if (mdt_object_remote(mdt_obj)) {
mdt_object_put(info->mti_env, mdt_obj);
- GOTO(out, rc = -ENOENT);
+ GOTO(remote_out, rc = -EREMOTE);
}
rc = mdt_links_read(info, mdt_obj, &ldata);
- mdt_object_put(info->mti_env, mdt_obj);
- if (rc != 0)
+ if (rc != 0) {
+ mdt_object_put(info->mti_env, mdt_obj);
GOTO(out, rc);
+ }
leh = buf->lb_buf;
lee = (struct link_ea_entry *)(leh + 1); /* link #0 */
pli->pli_linkno++;
}
+ lmv_buf.lb_buf = info->mti_xattr_buf;
+ lmv_buf.lb_len = sizeof(info->mti_xattr_buf);
+ /* Check if it is slave stripes */
+ rc = mo_xattr_get(info->mti_env, mdt_object_child(mdt_obj),
+ &lmv_buf, XATTR_NAME_LMV);
+ mdt_object_put(info->mti_env, mdt_obj);
+ if (rc > 0) {
+ union lmv_mds_md *lmm = lmv_buf.lb_buf;
+
+ /* For slave stripes, get its master */
+ if (le32_to_cpu(lmm->lmv_magic) == LMV_MAGIC_STRIPE) {
+ pli->pli_fids[pli->pli_fidcount] = *tmpfid;
+ continue;
+ }
+ } else if (rc < 0 && rc != -ENODATA) {
+ GOTO(out, rc);
+ }
+
+ rc = 0;
+
/* Pack the name in the end of the buffer */
ptr -= tmpname->ln_namelen;
if (ptr - 1 <= pli->pli_path)
if (rc < 0) {
mdt_object_put(info->mti_env, obj);
- CDEBUG(D_IOCTL, "nonlocal object "DFID": %d\n",
+ CDEBUG(D_IOCTL, "nonlocal object "DFID": rc = %d\n",
PFID(&fp->gf_fid), rc);
RETURN(rc);
}
key = req_capsule_client_get(tsi->tsi_pill, &RMF_GETINFO_KEY);
if (key == NULL) {
- CDEBUG(D_IOCTL, "No GETINFO key");
+ CDEBUG(D_IOCTL, "No GETINFO key\n");
RETURN(err_serious(-EFAULT));
}
keylen = req_capsule_get_size(tsi->tsi_pill, &RMF_GETINFO_KEY,
vallen = req_capsule_client_get(tsi->tsi_pill, &RMF_GETINFO_VALLEN);
if (vallen == NULL) {
- CDEBUG(D_IOCTL, "Unable to get RMF_GETINFO_VALLEN buffer");
+ CDEBUG(D_IOCTL, "%s: cannot get RMF_GETINFO_VALLEN buffer\n",
+ tgt_name(tsi->tsi_tgt));
RETURN(err_serious(-EFAULT));
}
valout = req_capsule_server_get(tsi->tsi_pill, &RMF_GETINFO_VAL);
if (valout == NULL) {
- CDEBUG(D_IOCTL, "Unable to get get-info RPC out buffer");
+ CDEBUG(D_IOCTL, "%s: cannot get get-info RPC out buffer\n",
+ tgt_name(tsi->tsi_tgt));
RETURN(err_serious(-EFAULT));
}
mdt->mdt_opts.mo_cos = !!val;
rc = lu_env_init(&env, LCT_LOCAL);
- if (unlikely(rc != 0)) {
- CWARN("lu_env initialization failed with rc = %d,"
- "cannot sync\n", rc);
- return;
- }
- mdt_device_sync(&env, mdt);
- lu_env_fini(&env);
+ if (unlikely(rc != 0)) {
+ CWARN("%s: lu_env initialization failed, cannot "
+ "sync: rc = %d\n", mdt_obd_name(mdt), rc);
+ return;
+ }
+ mdt_device_sync(&env, mdt);
+ lu_env_fini(&env);
}
/**