* Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
*
- * Copyright (c) 2010, 2014, Intel Corporation.
+ * Copyright (c) 2010, 2015, Intel Corporation.
*/
/*
* This file is part of Lustre, http://www.lustre.org/
#include <lustre_lfsck.h>
#include <lustre_nodemap.h>
+static unsigned int max_mod_rpcs_per_client = 8;
+CFS_MODULE_PARM(max_mod_rpcs_per_client, "i", uint, 0644,
+ "maximum number of modify RPCs in flight allowed per client");
+
mdl_mode_t mdt_mdl_lock_modes[] = {
[LCK_MINMODE] = MDL_MINMODE,
[LCK_EX] = MDL_EX,
[LCK_GROUP] = MDL_GROUP
};
-ldlm_mode_t mdt_dlm_lock_modes[] = {
- [MDL_MINMODE] = LCK_MINMODE,
- [MDL_EX] = LCK_EX,
- [MDL_PW] = LCK_PW,
- [MDL_PR] = LCK_PR,
- [MDL_CW] = LCK_CW,
- [MDL_CR] = LCK_CR,
- [MDL_NL] = LCK_NL,
- [MDL_GROUP] = LCK_GROUP
+enum ldlm_mode mdt_dlm_lock_modes[] = {
+ [MDL_MINMODE] = LCK_MINMODE,
+ [MDL_EX] = LCK_EX,
+ [MDL_PW] = LCK_PW,
+ [MDL_PR] = LCK_PR,
+ [MDL_CW] = LCK_CW,
+ [MDL_CR] = LCK_CR,
+ [MDL_NL] = LCK_NL,
+ [MDL_GROUP] = LCK_GROUP
};
static struct mdt_device *mdt_dev(struct lu_device *d);
rep->lock_policy_res1 |= op_flag;
}
-void mdt_lock_reg_init(struct mdt_lock_handle *lh, ldlm_mode_t lm)
+void mdt_lock_reg_init(struct mdt_lock_handle *lh, enum ldlm_mode lm)
{
- lh->mlh_pdo_hash = 0;
- lh->mlh_reg_mode = lm;
+ lh->mlh_pdo_hash = 0;
+ lh->mlh_reg_mode = lm;
lh->mlh_rreg_mode = lm;
- lh->mlh_type = MDT_REG_LOCK;
+ lh->mlh_type = MDT_REG_LOCK;
}
-void mdt_lock_pdo_init(struct mdt_lock_handle *lh, ldlm_mode_t lock_mode,
+void mdt_lock_pdo_init(struct mdt_lock_handle *lh, enum ldlm_mode lock_mode,
const struct lu_name *lname)
{
lh->mlh_reg_mode = lock_mode;
}
/* if file is released, check if a restore is running */
- if ((ma->ma_valid & MA_HSM) && (ma->ma_hsm.mh_flags & HS_RELEASED) &&
- mdt_hsm_restore_is_running(info, mdt_object_fid(o))) {
- repbody->mbo_t_state = MS_RESTORE;
+ if (ma->ma_valid & MA_HSM) {
repbody->mbo_valid |= OBD_MD_TSTATE;
+ if ((ma->ma_hsm.mh_flags & HS_RELEASED) &&
+ mdt_hsm_restore_is_running(info, mdt_object_fid(o)))
+ repbody->mbo_t_state = MS_RESTORE;
}
is_root = lu_fid_eq(mdt_object_fid(o), &info->mti_mdt->mdt_md_root_fid);
mdt_lock_reg_init(lh2, LCK_EX);
rc = mdt_object_lock(info, o1, lh1, MDS_INODELOCK_LAYOUT |
- MDS_INODELOCK_XATTR, MDT_LOCAL_LOCK);
+ MDS_INODELOCK_XATTR);
if (rc < 0)
GOTO(put, rc);
rc = mdt_object_lock(info, o2, lh2, MDS_INODELOCK_LAYOUT |
- MDS_INODELOCK_XATTR, MDT_LOCAL_LOCK);
+ MDS_INODELOCK_XATTR);
if (rc < 0)
GOTO(unlock1, rc);
MDS_INODELOCK_LAYOUT);
child_bits |= MDS_INODELOCK_PERM | MDS_INODELOCK_UPDATE;
- rc = mdt_object_lock(info, child, lhc, child_bits,
- MDT_LOCAL_LOCK);
+ rc = mdt_object_lock(info, child, lhc, child_bits);
if (rc < 0)
RETURN(rc);
}
if (S_ISDIR(lu_object_attr(&parent->mot_obj))) {
lhp = &info->mti_lh[MDT_LH_PARENT];
mdt_lock_pdo_init(lhp, LCK_PR, lname);
- rc = mdt_object_lock(info, parent, lhp,
- MDS_INODELOCK_UPDATE,
- MDT_LOCAL_LOCK);
- if (unlikely(rc != 0))
- RETURN(rc);
- }
+ rc = mdt_object_lock(info, parent, lhp,
+ MDS_INODELOCK_UPDATE);
+ if (unlikely(rc != 0))
+ RETURN(rc);
+ }
/* step 2: lookup child's fid by name */
fid_zero(child_fid);
GOTO(out_parent, rc = PTR_ERR(child));
OBD_FAIL_TIMEOUT(OBD_FAIL_MDS_RESEND, obd_timeout * 2);
+ if (!mdt_object_exists(child)) {
+ LU_OBJECT_DEBUG(D_INODE, info->mti_env,
+ &child->mot_obj,
+ "Object doesn't exist!\n");
+ GOTO(out_child, rc = -ENOENT);
+ }
+
rc = mdt_check_resent_lock(info, child, lhc);
if (rc < 0) {
GOTO(out_child, rc);
mdt_lock_reg_init(lhc, LCK_PR);
try_layout = false;
- if (!mdt_object_exists(child)) {
- LU_OBJECT_DEBUG(D_INODE, info->mti_env,
- &child->mot_obj,
- "Object doesn't exist!\n");
- GOTO(out_child, rc = -ENOENT);
- }
-
if (!(child_bits & MDS_INODELOCK_UPDATE) &&
mdt_object_exists(child) && !mdt_object_remote(child)) {
struct md_attr *ma = &info->mti_attr;
child_bits |= MDS_INODELOCK_LAYOUT;
/* try layout lock, it may fail to be granted due to
* contention at LOOKUP or UPDATE */
- if (!mdt_object_lock_try(info, child, lhc, child_bits,
- MDT_CROSS_LOCK)) {
+ if (!mdt_object_lock_try(info, child, lhc,
+ child_bits)) {
child_bits &= ~MDS_INODELOCK_LAYOUT;
LASSERT(child_bits != 0);
rc = mdt_object_lock(info, child, lhc,
- child_bits, MDT_CROSS_LOCK);
+ child_bits);
} else {
ma_need |= MA_LOV;
}
* client will enqueue the lock to the remote MDT */
if (mdt_object_remote(child))
child_bits &= ~MDS_INODELOCK_UPDATE;
- rc = mdt_object_lock(info, child, lhc, child_bits,
- MDT_CROSS_LOCK);
+ rc = mdt_object_lock(info, child, lhc, child_bits);
}
if (unlikely(rc != 0))
GOTO(out_child, rc);
rc = mdt_iocontrol(OBD_IOC_CHANGELOG_CLEAR, req->rq_export,
vallen, val, NULL);
+ } else if (KEY_IS(KEY_EVICT_BY_NID)) {
+ if (vallen > 0)
+ obd_export_evict_by_nid(req->rq_export->exp_obd, val);
} else {
RETURN(-EINVAL);
}
if (rc != 0)
GOTO(out_ucred, rc = err_serious(rc));
- if (mdt_check_resent(info, mdt_reconstruct, lhc)) {
+ rc = mdt_check_resent(info, mdt_reconstruct, lhc);
+ if (rc < 0) {
+ GOTO(out_ucred, rc);
+ } else if (rc == 1) {
DEBUG_REQ(D_INODE, mdt_info_req(info), "resent opt.");
rc = lustre_msg_get_status(mdt_info_req(info)->rq_repmsg);
GOTO(out_ucred, rc);
return 1;
}
-int mdt_remote_object_lock(struct mdt_thread_info *mti,
- struct mdt_object *o, const struct lu_fid *fid,
- struct lustre_handle *lh, ldlm_mode_t mode,
- __u64 ibits)
+int mdt_remote_object_lock(struct mdt_thread_info *mti, struct mdt_object *o,
+ const struct lu_fid *fid, struct lustre_handle *lh,
+ enum ldlm_mode mode, __u64 ibits, bool nonblock)
{
struct ldlm_enqueue_info *einfo = &mti->mti_einfo;
- ldlm_policy_data_t *policy = &mti->mti_policy;
+ union ldlm_policy_data *policy = &mti->mti_policy;
struct ldlm_res_id *res_id = &mti->mti_res_id;
int rc = 0;
ENTRY;
einfo->ei_cb_cp = ldlm_completion_ast;
einfo->ei_enq_slave = 0;
einfo->ei_res_id = res_id;
+ if (nonblock)
+ einfo->ei_nonblock = 1;
memset(policy, 0, sizeof(*policy));
policy->l_inodebits.bits = ibits;
static int mdt_object_local_lock(struct mdt_thread_info *info,
struct mdt_object *o,
struct mdt_lock_handle *lh, __u64 ibits,
- bool nonblock, int locality)
+ bool nonblock)
{
- struct ldlm_namespace *ns = info->mti_mdt->mdt_namespace;
- ldlm_policy_data_t *policy = &info->mti_policy;
- struct ldlm_res_id *res_id = &info->mti_res_id;
+ struct ldlm_namespace *ns = info->mti_mdt->mdt_namespace;
+ union ldlm_policy_data *policy = &info->mti_policy;
+ struct ldlm_res_id *res_id = &info->mti_res_id;
__u64 dlmflags;
- int rc;
- ENTRY;
+ int rc;
+ ENTRY;
LASSERT(!lustre_handle_is_used(&lh->mlh_reg_lh));
LASSERT(!lustre_handle_is_used(&lh->mlh_pdo_lh));
static int
mdt_object_lock_internal(struct mdt_thread_info *info, struct mdt_object *o,
struct mdt_lock_handle *lh, __u64 ibits,
- bool nonblock, int locality)
+ bool nonblock)
{
+ struct mdt_lock_handle *local_lh = NULL;
int rc;
ENTRY;
if (!mdt_object_remote(o))
- return mdt_object_local_lock(info, o, lh, ibits, nonblock,
- locality);
-
- if (locality == MDT_LOCAL_LOCK) {
- CERROR("%s: try to get local lock for remote object"
- DFID".\n", mdt_obd_name(info->mti_mdt),
- PFID(mdt_object_fid(o)));
- RETURN(-EPROTO);
- }
+ return mdt_object_local_lock(info, o, lh, ibits, nonblock);
/* XXX do not support PERM/LAYOUT/XATTR lock for remote object yet */
ibits &= ~(MDS_INODELOCK_PERM | MDS_INODELOCK_LAYOUT |
MDS_INODELOCK_XATTR);
+
+ /* Only enqueue LOOKUP lock for remote object */
+ if (ibits & MDS_INODELOCK_LOOKUP) {
+ rc = mdt_object_local_lock(info, o, lh,
+ MDS_INODELOCK_LOOKUP,
+ nonblock);
+ if (rc != ELDLM_OK)
+ RETURN(rc);
+
+ local_lh = lh;
+ }
+
if (ibits & MDS_INODELOCK_UPDATE) {
/* Sigh, PDO needs to enqueue 2 locks right now, but
* enqueue RPC can only request 1 lock, to avoid extra
rc = mdt_remote_object_lock(info, o, mdt_object_fid(o),
&lh->mlh_rreg_lh,
lh->mlh_rreg_mode,
- MDS_INODELOCK_UPDATE);
- if (rc != ELDLM_OK)
- RETURN(rc);
- }
-
- /* Only enqueue LOOKUP lock for remote object */
- if (ibits & MDS_INODELOCK_LOOKUP) {
- rc = mdt_object_local_lock(info, o, lh,
- MDS_INODELOCK_LOOKUP,
- nonblock, locality);
- if (rc != ELDLM_OK)
+ MDS_INODELOCK_UPDATE, nonblock);
+ if (rc != ELDLM_OK) {
+ if (local_lh != NULL)
+ mdt_object_unlock(info, o, local_lh, rc);
RETURN(rc);
+ }
}
RETURN(0);
}
int mdt_object_lock(struct mdt_thread_info *info, struct mdt_object *o,
- struct mdt_lock_handle *lh, __u64 ibits, int locality)
+ struct mdt_lock_handle *lh, __u64 ibits)
{
- return mdt_object_lock_internal(info, o, lh, ibits, false, locality);
+ return mdt_object_lock_internal(info, o, lh, ibits, false);
}
int mdt_object_lock_try(struct mdt_thread_info *info, struct mdt_object *o,
- struct mdt_lock_handle *lh, __u64 ibits, int locality)
+ struct mdt_lock_handle *lh, __u64 ibits)
{
struct mdt_lock_handle tmp = *lh;
int rc;
- rc = mdt_object_lock_internal(info, o, &tmp, ibits, true, locality);
+ rc = mdt_object_lock_internal(info, o, &tmp, ibits, true);
if (rc == 0)
*lh = tmp;
* \param mode lock mode
* \param decref force immediate lock releasing
*/
-static
-void mdt_save_lock(struct mdt_thread_info *info, struct lustre_handle *h,
- ldlm_mode_t mode, int decref)
+static void mdt_save_lock(struct mdt_thread_info *info, struct lustre_handle *h,
+ enum ldlm_mode mode, int decref)
{
- ENTRY;
+ ENTRY;
- if (lustre_handle_is_used(h)) {
- if (decref || !info->mti_has_trans ||
- !(mode & (LCK_PW | LCK_EX))){
- mdt_fid_unlock(h, mode);
- } else {
- struct mdt_device *mdt = info->mti_mdt;
- struct ldlm_lock *lock = ldlm_handle2lock(h);
- struct ptlrpc_request *req = mdt_info_req(info);
- int no_ack = 0;
+ if (lustre_handle_is_used(h)) {
+ if (decref || !info->mti_has_trans ||
+ !(mode & (LCK_PW | LCK_EX))) {
+ mdt_fid_unlock(h, mode);
+ } else {
+ struct mdt_device *mdt = info->mti_mdt;
+ struct ldlm_lock *lock = ldlm_handle2lock(h);
+ struct ptlrpc_request *req = mdt_info_req(info);
+ int no_ack = 0;
- LASSERTF(lock != NULL, "no lock for cookie "LPX64"\n",
- h->cookie);
+ LASSERTF(lock != NULL, "no lock for cookie "LPX64"\n",
+ h->cookie);
/* there is no request if mdt_object_unlock() is called
* from mdt_export_cleanup()->mdt_add_dirty_flag() */
if (likely(req != NULL)) {
if (!IS_ERR(o)) {
int rc;
- rc = mdt_object_lock(info, o, lh, ibits,
- MDT_LOCAL_LOCK);
+ rc = mdt_object_lock(info, o, lh, ibits);
if (rc != 0) {
mdt_object_put(info->mti_env, o);
o = ERR_PTR(rc);
info->mti_spec.no_create = 0;
info->mti_spec.sp_rm_entry = 0;
info->mti_spec.sp_permitted = 0;
+ info->mti_spec.sp_migrate_close = 0;
info->mti_spec.u.sp_ea.eadata = NULL;
info->mti_spec.u.sp_ea.eadatalen = 0;
return;
}
- /*
- * If the xid matches, then we know this is a resent request, and allow
- * it. (It's probably an OPEN, for which we don't send a lock.
- */
- if (req_xid_is_last(req))
- return;
+ /*
+ * If the xid matches, then we know this is a resent request, and allow
+ * it. (It's probably an OPEN, for which we don't send a lock.
+ */
+ if (req_can_reconstruct(req, NULL))
+ return;
/*
* This remote handle isn't enqueued, so we never received or processed
if (!lustre_handle_is_used(&lhc->mlh_reg_lh)) {
mdt_lock_reg_init(lhc, (*lockp)->l_req_mode);
rc = mdt_object_lock(info, info->mti_object, lhc,
- MDS_INODELOCK_XATTR,
- MDT_LOCAL_LOCK);
+ MDS_INODELOCK_XATTR);
if (rc)
return rc;
}
GOTO(out_shrink, rc = -EINVAL);
}
- rc = mdt_init_ucred(info, reqbody);
- if (rc)
- GOTO(out_shrink, rc);
+ rc = mdt_init_ucred_intent_getattr(info, reqbody);
+ if (rc)
+ GOTO(out_shrink, rc);
ldlm_rep = req_capsule_server_get(info->mti_pill, &RMF_DLM_REP);
mdt_set_disposition(info, ldlm_rep, DISP_IT_EXECD);
RETURN(ELDLM_LOCK_ABORTED);
}
-static int mdt_intent_code(long itcode)
+static int mdt_intent_code(enum ldlm_intent_flags itcode)
{
- int rc;
+ int rc;
- switch(itcode) {
- case IT_OPEN:
- rc = MDT_IT_OPEN;
- break;
- case IT_OPEN|IT_CREAT:
- rc = MDT_IT_OCREAT;
- break;
- case IT_CREAT:
- rc = MDT_IT_CREATE;
- break;
- case IT_READDIR:
- rc = MDT_IT_READDIR;
- break;
- case IT_GETATTR:
- rc = MDT_IT_GETATTR;
- break;
- case IT_LOOKUP:
- rc = MDT_IT_LOOKUP;
- break;
- case IT_UNLINK:
- rc = MDT_IT_UNLINK;
- break;
- case IT_TRUNC:
- rc = MDT_IT_TRUNC;
- break;
- case IT_GETXATTR:
- rc = MDT_IT_GETXATTR;
- break;
- case IT_LAYOUT:
- rc = MDT_IT_LAYOUT;
- break;
+ switch (itcode) {
+ case IT_OPEN:
+ rc = MDT_IT_OPEN;
+ break;
+ case IT_OPEN|IT_CREAT:
+ rc = MDT_IT_OCREAT;
+ break;
+ case IT_CREAT:
+ rc = MDT_IT_CREATE;
+ break;
+ case IT_READDIR:
+ rc = MDT_IT_READDIR;
+ break;
+ case IT_GETATTR:
+ rc = MDT_IT_GETATTR;
+ break;
+ case IT_LOOKUP:
+ rc = MDT_IT_LOOKUP;
+ break;
+ case IT_UNLINK:
+ rc = MDT_IT_UNLINK;
+ break;
+ case IT_TRUNC:
+ rc = MDT_IT_TRUNC;
+ break;
+ case IT_GETXATTR:
+ rc = MDT_IT_GETXATTR;
+ break;
+ case IT_LAYOUT:
+ rc = MDT_IT_LAYOUT;
+ break;
case IT_QUOTA_DQACQ:
case IT_QUOTA_CONN:
rc = MDT_IT_QUOTA;
break;
- default:
- CERROR("Unknown intent opcode: %ld\n", itcode);
- rc = -EINVAL;
- break;
- }
- return rc;
+ default:
+ CERROR("Unknown intent opcode: 0x%08x\n", itcode);
+ rc = -EINVAL;
+ break;
+ }
+ return rc;
}
-static int mdt_intent_opc(long itopc, struct mdt_thread_info *info,
+static int mdt_intent_opc(enum ldlm_intent_flags itopc,
+ struct mdt_thread_info *info,
struct ldlm_lock **lockp, __u64 flags)
{
struct req_capsule *pill = info->mti_pill;
if (flv->it_act != NULL) {
struct ldlm_reply *rep;
+ OBD_FAIL_TIMEOUT(OBD_FAIL_MDS_INTENT_DELAY, 10);
+
/* execute policy */
rc = flv->it_act(opc, info, lockp, flags);
}
static int mdt_intent_policy(struct ldlm_namespace *ns,
- struct ldlm_lock **lockp, void *req_cookie,
- ldlm_mode_t mode, __u64 flags, void *data)
+ struct ldlm_lock **lockp, void *req_cookie,
+ enum ldlm_mode mode, __u64 flags, void *data)
{
struct tgt_session_info *tsi;
struct mdt_thread_info *info;
lcfg = lustre_cfg_new(LCFG_ATTACH, bufs);
if (lcfg == NULL)
- GOTO(free_bufs, rc = -ENOMEM);
+ GOTO(put_profile, rc = -ENOMEM);
rc = class_attach(lcfg);
if (rc)
class_detach(obd, lcfg);
lcfg_cleanup:
lustre_cfg_free(lcfg);
+put_profile:
+ class_put_profile(lprof);
free_bufs:
OBD_FREE_PTR(bufs);
cleanup_mem:
lcfg = lustre_cfg_new(LCFG_ATTACH, bufs);
if (lcfg == NULL)
- GOTO(cleanup_mem, rc = -ENOMEM);
+ GOTO(put_profile, rc = -ENOMEM);
rc = class_attach(lcfg);
if (rc)
class_detach(obd, lcfg);
lcfg_cleanup:
lustre_cfg_free(lcfg);
+put_profile:
+ class_put_profile(lprof);
cleanup_mem:
if (bufs)
OBD_FREE_PTR(bufs);
stop.ls_flags = 0;
next->md_ops->mdo_iocontrol(env, next, OBD_IOC_STOP_LFSCK, 0, &stop);
+ mdt_stack_pre_fini(env, m, md2lu_dev(m->mdt_child));
target_recovery_fini(obd);
ping_evictor_stop();
- mdt_stack_pre_fini(env, m, md2lu_dev(m->mdt_child));
if (m->mdt_opts.mo_coordinator)
mdt_hsm_cdt_stop(m);
mdt_llog_ctxt_unclone(env, m, LLOG_AGENT_ORIG_CTXT);
mdt_llog_ctxt_unclone(env, m, LLOG_CHANGELOG_ORIG_CTXT);
+
+ if (m->mdt_namespace != NULL)
+ ldlm_namespace_free_prior(m->mdt_namespace, NULL,
+ d->ld_obd->obd_force);
+
obd_exports_barrier(obd);
obd_zombie_barrier();
upcall_cache_cleanup(m->mdt_identity_cache);
m->mdt_identity_cache = NULL;
- if (m->mdt_namespace != NULL) {
- ldlm_namespace_free(m->mdt_namespace, NULL,
- d->ld_obd->obd_force);
- d->ld_obd->obd_namespace = m->mdt_namespace = NULL;
- }
+ if (m->mdt_namespace != NULL) {
+ ldlm_namespace_free_post(m->mdt_namespace);
+ d->ld_obd->obd_namespace = m->mdt_namespace = NULL;
+ }
mdt_quota_fini(env, m);
LASSERT(obd != NULL);
m->mdt_max_mdsize = MAX_MD_SIZE; /* 4 stripes */
-
+ m->mdt_opts.mo_evict_tgt_nids = 1;
m->mdt_opts.mo_cos = MDT_COS_DEFAULT;
/* default is coordinator off, it is started through conf_param
LASSERT(num);
node_id = simple_strtol(num, NULL, 10);
obd->u.obt.obt_magic = OBT_MAGIC;
+ if (lsi->lsi_lmd != NULL &&
+ lsi->lsi_lmd->lmd_flags & LMD_FLG_SKIP_LFSCK)
+ m->mdt_skip_lfsck = 1;
}
m->mdt_squash.rsi_uid = 0;
data->ocd_max_easize = mdt->mdt_max_ea_size;
+ /* NB: Disregard the rule against updating
+ * exp_connect_data.ocd_connect_flags in this case, since
+ * tgt_client_new() needs to know if this is client supports
+ * multiple modify RPCs, and it is safe to expose this flag before
+ * connection processing completes. */
+ if (data->ocd_connect_flags & OBD_CONNECT_MULTIMODRPCS) {
+ data->ocd_maxmodrpcs = max_mod_rpcs_per_client;
+ spin_lock(&exp->exp_lock);
+ *exp_connect_flags_ptr(exp) |= OBD_CONNECT_MULTIMODRPCS;
+ spin_unlock(&exp->exp_lock);
+ }
+
return 0;
}
LASSERT(exp);
class_export_get(exp);
- nodemap_del_member(exp);
rc = server_disconnect_export(exp);
if (rc != 0)
CDEBUG(D_IOCTL, "server disconnect error: rc = %d\n", rc);
rc = mdt_export_cleanup(exp);
+ nodemap_del_member(exp);
class_export_put(exp);
RETURN(rc);
}
lexp = class_conn2export(&conn);
LASSERT(lexp != NULL);
+ rc = nodemap_add_member(*client_nid, lexp);
+ if (rc != 0 && rc != -EEXIST)
+ GOTO(out, rc);
+
rc = mdt_connect_internal(lexp, mdt, data);
if (rc == 0) {
struct lsd_client_data *lcd = lexp->exp_target_data.ted_lcd;
LASSERT(lcd);
memcpy(lcd->lcd_uuid, cluuid, sizeof lcd->lcd_uuid);
rc = tgt_client_new(env, lexp);
- if (rc == 0) {
- rc = nodemap_add_member(*client_nid, lexp);
- if (rc != 0 && rc != -EEXIST)
- goto out;
-
+ if (rc == 0)
mdt_export_stats_init(obd, lexp, localdata);
- }
-
- /* For phase I, sync for cross-ref operation. */
- spin_lock(&lexp->exp_lock);
- lexp->exp_keep_sync = 1;
- spin_unlock(&lexp->exp_lock);
}
out:
if (rc != 0) {
class_disconnect(lexp);
+ nodemap_del_member(lexp);
*exp = NULL;
} else {
*exp = lexp;
if (exp == NULL || obd == NULL || cluuid == NULL)
RETURN(-EINVAL);
+ rc = nodemap_add_member(*client_nid, exp);
+ if (rc != 0 && rc != -EEXIST)
+ RETURN(rc);
+
rc = mdt_connect_internal(exp, mdt_dev(obd->obd_lu_dev), data);
- if (rc == 0) {
- rc = nodemap_add_member(*client_nid, exp);
- if (rc == 0 || rc == -EEXIST)
- mdt_export_stats_init(obd, exp, localdata);
- }
+ if (rc == 0)
+ mdt_export_stats_init(obd, exp, localdata);
+ else
+ nodemap_del_member(exp);
RETURN(rc);
}
static int mdt_postrecov(const struct lu_env *env, struct mdt_device *mdt)
{
struct lu_device *ld = md2lu_dev(mdt->mdt_child);
- struct lfsck_start_param lsp;
int rc;
ENTRY;
- lsp.lsp_start = NULL;
- lsp.lsp_index_valid = 0;
- rc = mdt->mdt_child->md_ops->mdo_iocontrol(env, mdt->mdt_child,
- OBD_IOC_START_LFSCK,
- 0, &lsp);
- if (rc != 0 && rc != -EALREADY)
- CWARN("%s: auto trigger paused LFSCK failed: rc = %d\n",
- mdt_obd_name(mdt), rc);
+ if (!mdt->mdt_skip_lfsck) {
+ struct lfsck_start_param lsp;
+
+ lsp.lsp_start = NULL;
+ lsp.lsp_index_valid = 0;
+ rc = mdt->mdt_child->md_ops->mdo_iocontrol(env, mdt->mdt_child,
+ OBD_IOC_START_LFSCK,
+ 0, &lsp);
+ if (rc != 0 && rc != -EALREADY)
+ CWARN("%s: auto trigger paused LFSCK failed: rc = %d\n",
+ mdt_obd_name(mdt), rc);
+ }
rc = ld->ld_ops->ldo_recovery_complete(env, ld);
RETURN(rc);
.ldt_ctx_tags = LCT_MD_THREAD
};
-static int __init mdt_mod_init(void)
+static int __init mdt_init(void)
{
int rc;
return rc;
}
-static void __exit mdt_mod_exit(void)
+static void __exit mdt_exit(void)
{
class_unregister_type(LUSTRE_MDT_NAME);
mds_mod_exit();
lu_kmem_fini(mdt_caches);
}
-MODULE_AUTHOR("Sun Microsystems, Inc. <http://www.lustre.org/>");
+MODULE_AUTHOR("OpenSFS, Inc. <http://www.lustre.org/>");
MODULE_DESCRIPTION("Lustre Metadata Target ("LUSTRE_MDT_NAME")");
MODULE_VERSION(LUSTRE_VERSION_STRING);
MODULE_LICENSE("GPL");
-module_init(mdt_mod_init);
-module_exit(mdt_mod_exit);
+module_init(mdt_init);
+module_exit(mdt_exit);