* set as 0 (false)
*/
exp_old_falloc:1,
- exp_hashed:1;
+ exp_hashed:1,
+ exp_not_timed:1;
/* also protected by exp_lock */
enum lustre_sec_part exp_sp_peer;
struct sptlrpc_flavor exp_flvr; /* current */
#define OBD_FAIL_OBD_STOP_MDS_RACE 0x60c
#define OBD_FAIL_OBD_SETUP 0x60d
#define OBD_FAIL_OBD_CLEANUP 0x60e
+#define OBD_FAIL_OBD_PAUSE_EVICTOR 0x60f
#define OBD_FAIL_TGT_REPLY_NET 0x700
#define OBD_FAIL_TGT_CONN_RACE 0x701
int rc = 0;
ENTRY;
- hdl = &exp->exp_imp_reverse->imp_remote_handle;
- if (!exp->exp_connection || !lustre_handle_is_used(hdl)) {
+
+ if (!exp->exp_connection ||
+ !lustre_handle_is_used(&exp->exp_imp_reverse->imp_remote_handle)) {
conn->cookie = exp->exp_handle.h_cookie;
CDEBUG(D_HA,
"connect export for UUID '%s' at %p, cookie %#llx\n",
}
target = exp->exp_obd;
+ hdl = &exp->exp_imp_reverse->imp_remote_handle;
/* Might be a re-connect after a partition. */
if (memcmp(&conn->cookie, &hdl->cookie, sizeof(conn->cookie))) {
spin_unlock(&export->exp_lock);
class_import_put(revimp);
+ if (!export->exp_not_timed) {
+ spin_lock(&obd->obd_dev_lock);
+ list_add_tail(&export->exp_obd_chain_timed,
+ &obd->obd_exports_timed);
+ spin_unlock(&obd->obd_dev_lock);
+ }
return 0;
}
EXPORT_SYMBOL(rev_import_init);
rc = obd_reconnect(req->rq_svc_thread->t_env,
export, target, &cluuid, data,
&req->rq_peer.nid);
- if (rc == 0)
+ if (rc == 0) {
reconnected = true;
+ /*
+ * In case of recovery,
+ * tgt_clients_data_init() created the export,
+ * exp_imp_reverse is still needed.
+ */
+ if (export->exp_imp_reverse == NULL)
+ rc = rev_import_init(export);
+ }
}
if (rc)
GOTO(out, rc);
* for each connect called disconnect
* should be called to cleanup stuff
*/
+ spin_lock(&target->obd_dev_lock);
+ list_del_init(&export->exp_obd_chain_timed);
+ spin_unlock(&target->obd_dev_lock);
+
class_export_get(export);
obd_disconnect(export);
}
if (OCD_HAS_FLAG(data, PINGLESS)) {
if (ptlrpc_pinger_suppress_pings()) {
- spin_lock(&exp->exp_obd->obd_dev_lock);
- list_del_init(&exp->exp_obd_chain_timed);
- spin_unlock(&exp->exp_obd->obd_dev_lock);
+ spin_lock(&exp->exp_lock);
+ exp->exp_not_timed = 1;
+ spin_unlock(&exp->exp_lock);
} else {
data->ocd_connect_flags &= ~OBD_CONNECT_PINGLESS;
}
* let's not add this export to the timed chain list.
*/
if (data->ocd_connect_flags & OBD_CONNECT_MDS_MDS) {
- spin_lock(&lexp->exp_obd->obd_dev_lock);
- list_del_init(&lexp->exp_obd_chain_timed);
- spin_unlock(&lexp->exp_obd->obd_dev_lock);
+ spin_lock(&lexp->exp_lock);
+ lexp->exp_not_timed = 1;
+ spin_unlock(&lexp->exp_lock);
}
}
else
nodemap_del_member(exp);
+ if (data->ocd_connect_flags & OBD_CONNECT_MDS_MDS) {
+ spin_lock(&exp->exp_lock);
+ exp->exp_not_timed = 1;
+ spin_unlock(&exp->exp_lock);
+ }
+
RETURN(rc);
}
spin_lock_init(&export->exp_bl_list_lock);
INIT_LIST_HEAD(&export->exp_bl_list);
INIT_LIST_HEAD(&export->exp_stale_list);
+ INIT_LIST_HEAD(&export->exp_obd_chain_timed);
INIT_WORK(&export->exp_zombie_work, obd_zombie_exp_cull);
export->exp_sp_peer = LUSTRE_SP_ANY;
if (!is_self) {
class_incref(obd, "export", export);
- list_add_tail(&export->exp_obd_chain_timed,
- &obd->obd_exports_timed);
list_add(&export->exp_obd_chain, &obd->obd_exports);
obd->obd_num_exports++;
} else {
- INIT_LIST_HEAD(&export->exp_obd_chain_timed);
INIT_LIST_HEAD(&export->exp_obd_chain);
}
spin_unlock(&obd->obd_dev_lock);
}
obd->obd_self_export = exp;
- list_del_init(&exp->exp_obd_chain_timed);
+ spin_lock(&exp->exp_lock);
+ exp->exp_not_timed = 1;
+ spin_unlock(&exp->exp_lock);
class_export_put(exp);
rc = class_register_device(obd);
rc = obd_connect(env, &ec->ec_exp, tgt, &echo_uuid, ocd, NULL);
if (rc == 0) {
/* Turn off pinger because it connects to tgt obd directly. */
- spin_lock(&tgt->obd_dev_lock);
- list_del_init(&ec->ec_exp->exp_obd_chain_timed);
- spin_unlock(&tgt->obd_dev_lock);
+ spin_lock(&ec->ec_exp->exp_lock);
+ ec->ec_exp->exp_not_timed = 1;
+ spin_unlock(&ec->ec_exp->exp_lock);
}
OBD_FREE(ocd, sizeof(*ocd));
if (OCD_HAS_FLAG(data, PINGLESS)) {
if (ptlrpc_pinger_suppress_pings()) {
- spin_lock(&exp->exp_obd->obd_dev_lock);
- list_del_init(&exp->exp_obd_chain_timed);
- spin_unlock(&exp->exp_obd->obd_dev_lock);
+ spin_lock(&exp->exp_lock);
+ exp->exp_not_timed = 1;
+ spin_unlock(&exp->exp_lock);
} else {
data->ocd_connect_flags &= ~OBD_CONNECT_PINGLESS;
}
obd_evict_list);
spin_unlock(&pet_lock);
+ if (!strcmp(obd->obd_type->typ_name, LUSTRE_OSP_NAME))
+ CFS_FAIL_TIMEOUT(OBD_FAIL_OBD_PAUSE_EVICTOR,
+ PING_INTERVAL + PING_EVICT_TIMEOUT);
+
expire_time = ktime_get_real_seconds() - PING_EVICT_TIMEOUT;
CDEBUG(D_HA, "evicting all exports of obd %s older than %lld\n",
class_export_put(exp);
- rc = rev_import_init(exp);
- if (rc != 0) {
- class_unlink_export(exp);
- GOTO(err_out, rc);
- }
-
/* Need to check last_rcvd even for duplicated exports. */
CDEBUG(D_OTHER, "client at idx %d has last_transno = %llu\n",
cl_idx, last_transno);
}
run_test 160 "MDT destroys are blocked by grouplocks"
+test_161() {
+ [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs"
+ local ping_interval=$($LCTL get_param -n ping_interval)
+ local evict_multiplier=$($LCTL get_param -n evict_multiplier)
+ local pause=$((ping_interval * (evict_multiplier + 2)))
+
+ #define OBD_FAIL_OBD_PAUSE_EVICTOR 0x60f
+ do_facet mds1 $LCTL set_param fail_loc=0x8000060f
+
+ $LFS mkdir -i 1 $DIR/$tdir || error "mkdir $tdir"
+ $LFS mkdir -i 0 $DIR/$tdir/remote || error "mkdir $tdir/remote"
+
+ echo sleep $pause seconds
+ sleep $pause
+ rmdir $DIR/$tdir/remote || error "rmdir $tdir/remote"
+}
+run_test 161 "evict osp by ping evictor"
+
complete_test $SECONDS
check_and_cleanup_lustre
exit_status