* 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/
[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;
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;
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);
}
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, bool nonblock)
+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;
struct mdt_lock_handle *lh, __u64 ibits,
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));
* \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)) {
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;
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;
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);
- }
}
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);