#define OBD_FAIL_PTLRPC_LONG_BOTH_UNLINK 0x51c
#define OBD_FAIL_PTLRPC_CLIENT_BULK_CB3 0x520
#define OBD_FAIL_PTLRPC_BULK_ATTACH 0x521
+#define OBD_FAIL_PTLRPC_CONNECT_RACE 0x531
#define OBD_FAIL_OBD_PING_NET 0x600
/* OBD_FAIL_OBD_LOG_CANCEL_NET 0x601 obsolete since 1.5 */
#define DEBUG_SUBSYSTEM S_RPC
#include <linux/kthread.h>
+#include <linux/delay.h>
#include <obd_support.h>
#include <lustre_ha.h>
#include <lustre_net.h>
if (!imp->imp_invalid || imp->imp_obd->obd_no_recov)
ptlrpc_deactivate_import(imp);
+ if (OBD_FAIL_PRECHECK(OBD_FAIL_PTLRPC_CONNECT_RACE)) {
+ OBD_RACE(OBD_FAIL_PTLRPC_CONNECT_RACE);
+ msleep(10 * MSEC_PER_SEC);
+ }
CFS_FAIL_TIMEOUT(OBD_FAIL_MGS_CONNECT_NET, 3 * cfs_fail_val / 2);
LASSERT(imp->imp_invalid);
CERROR("already connected\n");
RETURN(0);
} else if (imp->imp_state == LUSTRE_IMP_CONNECTING ||
+ imp->imp_state == LUSTRE_IMP_EVICTED ||
imp->imp_connected) {
spin_unlock(&imp->imp_lock);
CERROR("already connecting\n");
if (rc)
GOTO(out, rc);
+ OBD_RACE(OBD_FAIL_PTLRPC_CONNECT_RACE);
+
rc = ptlrpc_connect_import(imp);
if (rc)
GOTO(out, rc);
}
run_test 65 "lock enqueue for destroyed export"
+test_67()
+{
+#define OBD_FAIL_PTLRPC_CONNECT_RACE 0x531
+ $LCTL set_param fail_loc=0x80000531
+
+ local mdtname="MDT0000"
+ local mdccli=$($LCTL dl | grep "${mdtname}-mdc" | awk '{print $4;}')
+ local conn_uuid=$($LCTL get_param -n mdc.${mdccli}.mds_conn_uuid)
+ $LCTL set_param "mdc.${mdccli}.import=connection=${conn_uuid}" &
+ sleep 2
+
+ mds_evict_client
+ sleep 1
+
+ client_reconnect
+ wait
+}
+run_test 67 "connect vs import invalidate race"
+
check_cli_ir_state()
{
local NODE=${1:-$HOSTNAME}