* GPL HEADER END
*/
/*
- * Copyright 2008 Sun Microsystems, Inc. All rights reserved
+ * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
*/
/*
+ * Copyright (c) 2011 Whamcloud, Inc.
+ */
+/*
* This file is part of Lustre, http://www.lustre.org/
* Lustre is a trademark of Sun Microsystems, Inc.
*
imp->imp_obd->obd_name,
libcfs_nid2str(conn->oic_conn->c_peer.nid),
conn->oic_last_attempt);
- /* Don't thrash connections */
- if (cfs_time_before_64(cfs_time_current_64(),
- conn->oic_last_attempt +
- cfs_time_seconds(CONNECTION_SWITCH_MIN))) {
- continue;
- }
/* If we have not tried this connection since
the last successful attempt, go with this one */
static void ptlrpc_maybe_ping_import_soon(struct obd_import *imp)
{
#ifdef __KERNEL__
- struct obd_import_conn *imp_conn;
-#endif
- int wake_pinger = 0;
-
- ENTRY;
-
- cfs_spin_lock(&imp->imp_lock);
- if (cfs_list_empty(&imp->imp_conn_list))
- GOTO(unlock, 0);
-
-#ifdef __KERNEL__
- imp_conn = cfs_list_entry(imp->imp_conn_list.prev,
- struct obd_import_conn,
- oic_item);
-
- /* XXX: When the failover node is the primary node, it is possible
- * to have two identical connections in imp_conn_list. We must
- * compare not conn's pointers but NIDs, otherwise we can defeat
- * connection throttling. (See bug 14774.) */
- if (imp->imp_conn_current->oic_conn->c_peer.nid !=
- imp_conn->oic_conn->c_peer.nid) {
- ptlrpc_ping_import_soon(imp);
- wake_pinger = 1;
- }
+ /* the pinger takes care of issuing the next reconnect request */
+ return;
#else
/* liblustre has no pinger thread, so we wakeup pinger anyway */
- wake_pinger = 1;
+ ptlrpc_pinger_wake_up();
#endif
-
- unlock:
- cfs_spin_unlock(&imp->imp_lock);
-
- if (wake_pinger)
- ptlrpc_pinger_wake_up();
-
- EXIT;
}
static int ptlrpc_busy_reconnect(int rc)
/* Sigh, some compilers do not like #ifdef in the middle
of macro arguments */
#ifdef __KERNEL__
- const char *older =
- "older. Consider upgrading this client";
+ const char *older = "older. Consider upgrading server "
+ "or downgrading client";
#else
- const char *older =
- "older. Consider recompiling this application";
+ const char *older = "older. Consider recompiling this "
+ "application";
#endif
- const char *newer = "newer than client version";
+ const char *newer = "newer than client version. "
+ "Consider upgrading client";
LCONSOLE_WARN("Server %s version (%d.%d.%d.%d) "
"is much %s (%s)\n",
cli->cl_cksum_type = OBD_CKSUM_CRC32;
}
- if (ocd->ocd_connect_flags & OBD_CONNECT_BRW_SIZE) {
+ if (ocd->ocd_connect_flags & OBD_CONNECT_BRW_SIZE)
cli->cl_max_pages_per_rpc =
ocd->ocd_brw_size >> CFS_PAGE_SHIFT;
- }
+ else if (imp->imp_connect_op == MDS_CONNECT ||
+ imp->imp_connect_op == MGS_CONNECT)
+ cli->cl_max_pages_per_rpc = 1;
/* Reset ns_connect_flags only for initial connect. It might be
* changed in while using FS and if we reset it in reconnect
struct ptlrpc_request *req;
ENTRY;
+ if (unlikely(OBD_FAIL_CHECK(OBD_FAIL_PTLRPC_FINISH_REPLAY)))
+ RETURN(0);
+
LASSERT(cfs_atomic_read(&imp->imp_replay_inflight) == 0);
cfs_atomic_inc(&imp->imp_replay_inflight);
* If we came to server that is in recovery, we enter IMP_REPLAY import state.
* We go through our list of requests to replay and send them to server one by
* one.
- * After sending all request from the list we change import state to
+ * After sending all request from the list we change import state to
* IMP_REPLAY_LOCKS and re-request all the locks we believe we have from server
* and also all the locks we don't yet have and wait for server to grant us.
* After that we send a special "replay completed" request and change import
* invalidate thread without reference to import and import can
* be freed at same time. */
class_import_get(imp);
- rc = cfs_kernel_thread(ptlrpc_invalidate_import_thread, imp,
- CLONE_VM | CLONE_FILES);
+ rc = cfs_create_thread(ptlrpc_invalidate_import_thread, imp,
+ CFS_DAEMON_FLAGS);
if (rc < 0) {
class_import_put(imp);
CERROR("error starting invalidate thread: %d\n", rc);