X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fptlrpc%2Fimport.c;h=6ede5d6e086bdc4c98c9807855b2d38b479820bf;hb=a532fdcec226fc51e102f2f79793b93beba35cdf;hp=b8bcf5a18579fee8dbb16183ffe1ffc7dc1594fe;hpb=fbb7ead129258897f5a5d5c9ce28d31fbbe5bca2;p=fs%2Flustre-release.git diff --git a/lustre/ptlrpc/import.c b/lustre/ptlrpc/import.c index b8bcf5a..6ede5d6 100644 --- a/lustre/ptlrpc/import.c +++ b/lustre/ptlrpc/import.c @@ -101,6 +101,7 @@ int ptlrpc_set_import_discon(struct obd_import *imp) imp->imp_obd->obd_name, imp->imp_target_uuid.uuid, imp->imp_connection->c_remote_uuid.uuid); + ptlrpc_deactivate_timeouts(); IMPORT_SET_STATE_NOLOCK(imp, LUSTRE_IMP_DISCON); spin_unlock_irqrestore(&imp->imp_lock, flags); obd_import_event(imp->imp_obd, imp, IMP_EVENT_DISCON); @@ -191,6 +192,7 @@ void ptlrpc_activate_import(struct obd_import *imp) spin_unlock_irqrestore(&imp->imp_lock, flags); obd_import_event(obd, imp, IMP_EVENT_ACTIVE); + ptlrpc_activate_timeouts(); } void ptlrpc_fail_import(struct obd_import *imp, int generation) @@ -296,25 +298,44 @@ static int import_select_connection(struct obd_import *imp) RETURN(0); } - +/* + * must be called under imp_lock + */ +int ptlrpc_first_transno(struct obd_import *imp, __u64 *transno) +{ + struct ptlrpc_request *req; + struct list_head *tmp; + + if (list_empty(&imp->imp_replay_list)) + return 0; + tmp = imp->imp_replay_list.next; + req = list_entry(tmp, struct ptlrpc_request, rq_replay_list); + *transno = req->rq_transno; + return 1; +} int ptlrpc_connect_import(struct obd_import *imp, char * new_uuid) { struct obd_device *obd = imp->imp_obd; int initial_connect = 0; + int set_transno = 0; int rc; __u64 committed_before_reconnect = 0; struct ptlrpc_request *request; - int size[] = {sizeof(imp->imp_target_uuid), + int size[] = {0, + sizeof(imp->imp_target_uuid), sizeof(obd->obd_uuid), sizeof(imp->imp_dlm_handle), - sizeof(unsigned long), - sizeof(__u32) * 2}; - char *tmp[] = {imp->imp_target_uuid.uuid, - obd->obd_uuid.uuid, + sizeof(imp->imp_connect_flags), + sizeof(imp->imp_connect_data)}; + char *tmp[] = {NULL, + (char *)imp->imp_target_uuid.uuid, + (char *)obd->obd_uuid.uuid, (char *)&imp->imp_dlm_handle, (char *)&imp->imp_connect_flags, /* XXX: make this portable! */ - (char*) &obd->u.cli.cl_nllu}; + (char*) &imp->imp_connect_data}; + int repsize = sizeof(struct obd_connect_data); + struct ptlrpc_connect_async_args *aa; unsigned long flags; @@ -344,6 +365,7 @@ int ptlrpc_connect_import(struct obd_import *imp, char * new_uuid) imp->imp_conn_cnt++; } + set_transno = ptlrpc_first_transno(imp, &imp->imp_connect_data.transno); spin_unlock_irqrestore(&imp->imp_lock, flags); @@ -362,11 +384,14 @@ int ptlrpc_connect_import(struct obd_import *imp, char * new_uuid) LASSERT(imp->imp_sec); + size[0] = lustre_secdesc_size(); request = ptlrpc_prep_req(imp, LUSTRE_OBD_VERSION, - imp->imp_connect_op, 5, size, tmp); + imp->imp_connect_op, 6, size, tmp); if (!request) GOTO(out, rc = -ENOMEM); + lustre_pack_secdesc(request, size[0]); + #ifndef __KERNEL__ lustre_msg_add_op_flags(request->rq_reqmsg, MSG_CONNECT_LIBCLIENT); #endif @@ -375,7 +400,7 @@ int ptlrpc_connect_import(struct obd_import *imp, char * new_uuid) } request->rq_send_state = LUSTRE_IMP_CONNECTING; - request->rq_replen = lustre_msg_size(0, NULL); + request->rq_replen = lustre_msg_size(1, &repsize); request->rq_interpret_reply = ptlrpc_connect_interpret; LASSERT (sizeof (*aa) <= sizeof (request->rq_async_args)); @@ -390,6 +415,11 @@ int ptlrpc_connect_import(struct obd_import *imp, char * new_uuid) MSG_CONNECT_INITIAL); imp->imp_replayable = 1; } + if (set_transno) + lustre_msg_add_op_flags(request->rq_reqmsg, + MSG_CONNECT_TRANSNO); + + imp->imp_reqs_replayed = imp->imp_locks_replayed = 0; ptlrpcd_add_req(request); rc = 0; @@ -423,10 +453,22 @@ static int ptlrpc_connect_interpret(struct ptlrpc_request *request, GOTO(out, rc); LASSERT(imp->imp_conn_current); imp->imp_conn_current->oic_last_attempt = 0; - +/* + remote_flag = lustre_msg_buf(request->rq_repmsg, 0, sizeof(int)); + LASSERT(remote_flag != NULL); + imp->imp_obd->u.cli.cl_remote = *remote_flag; +*/ msg_flags = lustre_msg_get_op_flags(request->rq_repmsg); if (aa->pcaa_initial_connect) { + struct obd_connect_data *conn_data; + + conn_data = lustre_swab_repbuf(request, 0, sizeof(*conn_data), + lustre_swab_connect); + LASSERT(conn_data); + imp->imp_connect_data.ocd_connect_flags = + conn_data->ocd_connect_flags; + if (msg_flags & MSG_CONNECT_REPLAYABLE) { CDEBUG(D_HA, "connected to replayable target: %s\n", imp->imp_target_uuid.uuid); @@ -440,6 +482,7 @@ static int ptlrpc_connect_interpret(struct ptlrpc_request *request, imp->imp_conn_cnt = request->rq_repmsg->conn_cnt; imp->imp_remote_handle = request->rq_repmsg->handle; IMPORT_SET_STATE(imp, LUSTRE_IMP_FULL); + ptlrpc_pinger_sending_on_import(imp); GOTO(finish, rc = 0); } @@ -508,6 +551,7 @@ static int ptlrpc_connect_interpret(struct ptlrpc_request *request, } finish: + imp->imp_debug_open_replays = 1; rc = ptlrpc_import_recovery_state_machine(imp); if (rc != 0) { if (rc == -ENOTCONN) { @@ -565,7 +609,7 @@ static int signal_completed_replay(struct obd_import *imp) req->rq_replen = lustre_msg_size(0, NULL); req->rq_send_state = LUSTRE_IMP_REPLAY_WAIT; - req->rq_reqmsg->flags |= MSG_LAST_REPLAY; + req->rq_reqmsg->flags |= MSG_LOCK_REPLAY_DONE | MSG_REQ_REPLAY_DONE; req->rq_timeout *= 3; req->rq_interpret_reply = completed_replay_interpret; @@ -619,7 +663,7 @@ int ptlrpc_import_recovery_state_machine(struct obd_import *imp) CLONE_VM | CLONE_FILES); if (rc < 0) CERROR("error starting invalidate thread: %d\n", rc); - RETURN(rc); + RETURN(rc < 0 ? rc : 0); #else ptlrpc_invalidate_import(imp, 1); @@ -667,10 +711,13 @@ int ptlrpc_import_recovery_state_machine(struct obd_import *imp) GOTO(out, rc); IMPORT_SET_STATE(imp, LUSTRE_IMP_FULL); ptlrpc_activate_import(imp); - CWARN("%s: connection restored to %s@%s\n", + CWARN("%s: connection restored to %s@%s, " + "%d/%d req/lock replayed\n", imp->imp_obd->obd_name, imp->imp_target_uuid.uuid, - imp->imp_connection->c_remote_uuid.uuid); + imp->imp_connection->c_remote_uuid.uuid, + imp->imp_reqs_replayed, + imp->imp_locks_replayed); } if (imp->imp_state == LUSTRE_IMP_FULL) { @@ -699,6 +746,7 @@ int ptlrpc_disconnect_import(struct obd_import *imp) case OST_CONNECT: rq_opc = OST_DISCONNECT; break; case MDS_CONNECT: rq_opc = MDS_DISCONNECT; break; case MGMT_CONNECT: rq_opc = MGMT_DISCONNECT; break; + case GKS_CONNECT: rq_opc = GKS_DISCONNECT; break; default: CERROR("don't know how to disconnect from %s (connect_op %d)\n", imp->imp_target_uuid.uuid, imp->imp_connect_op);