X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;ds=sidebyside;f=lustre%2Fldlm%2Fldlm_lib.c;h=d747a183ab42cd143258668bf38948a143bbed85;hb=8f1c8dbe2389e1ef1e1d3387e343fb9a1bb84198;hp=e1d91320350780ca3120c3ef0ec11d50c37fede3;hpb=e536e511c9e634d8cb7faf763ecab4cab5f40267;p=fs%2Flustre-release.git diff --git a/lustre/ldlm/ldlm_lib.c b/lustre/ldlm/ldlm_lib.c index e1d9132..d747a18 100644 --- a/lustre/ldlm/ldlm_lib.c +++ b/lustre/ldlm/ldlm_lib.c @@ -43,6 +43,7 @@ #define DEBUG_SUBSYSTEM S_LDLM +#include #include #include #include @@ -870,6 +871,20 @@ int target_handle_connect(struct ptlrpc_request *req) if (rc) GOTO(out, rc); +#if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(3, 0, 53, 0) + /* Don't allow clients to connect that are using old 1.8 format + * protocol conventions (LUSTRE_MSG_MAGIC_v1, !MSGHDR_CKSUM_INCOMPAT18, + * ldlm_flock_policy_wire format, MDT_ATTR_xTIME_SET, etc). The + * FULL20 flag should be set on all connections since 2.0, but no + * longer affects behaviour. + * + * Later this check will be disabled and the flag can be retired + * completely once interop with 3.0 is no longer needed. + */ + if (!(data->ocd_connect_flags & OBD_CONNECT_FULL20)) + GOTO(out, rc = -EPROTO); +#endif + if (lustre_msg_get_op_flags(req->rq_reqmsg) & MSG_CONNECT_LIBCLIENT) { if (data->ocd_version < LUSTRE_VERSION_CODE - LUSTRE_VERSION_ALLOWED_OFFSET || @@ -1064,30 +1079,30 @@ no_export: t = cfs_timer_deadline(&target->obd_recovery_timer); t = cfs_time_sub(t, cfs_time_current()); t = cfs_duration_sec(t); - LCONSOLE_WARN("%s: Denying connection for new client " - "%s (at %s), waiting for all %d known " - "clients (%d recovered, %d in progress, " - "and %d evicted) to recover in %d:%.02d\n", + LCONSOLE_WARN("%s: Denying connection for new client %s" + "(at %s), waiting for %d known clients " + "(%d recovered, %d in progress, and %d " + "evicted) to recover in %d:%.02d\n", target->obd_name, cluuid.uuid, libcfs_nid2str(req->rq_peer.nid), k, c - i, i, s, (int)t / 60, (int)t % 60); - rc = -EBUSY; - } else { + rc = -EBUSY; + } else { dont_check_exports: - rc = obd_connect(req->rq_svc_thread->t_env, - &export, target, &cluuid, data, - client_nid); + rc = obd_connect(req->rq_svc_thread->t_env, + &export, target, &cluuid, data, + client_nid); if (mds_conn && OBD_FAIL_CHECK(OBD_FAIL_TGT_RCVG_FLAG)) lustre_msg_add_op_flags(req->rq_repmsg, - MSG_CONNECT_RECOVERING); - if (rc == 0) - conn.cookie = export->exp_handle.h_cookie; - } - } else { - rc = obd_reconnect(req->rq_svc_thread->t_env, - export, target, &cluuid, data, client_nid); - } + MSG_CONNECT_RECOVERING); + if (rc == 0) + conn.cookie = export->exp_handle.h_cookie; + } + } else { + rc = obd_reconnect(req->rq_svc_thread->t_env, + export, target, &cluuid, data, client_nid); + } if (rc) GOTO(out, rc); @@ -1236,17 +1251,12 @@ dont_check_exports: * ptlrpc_handle_server_req_in->lustre_unpack_msg(). */ revimp->imp_msg_magic = req->rq_reqmsg->lm_magic; - if ((data->ocd_connect_flags & OBD_CONNECT_AT) && - (revimp->imp_msg_magic != LUSTRE_MSG_MAGIC_V1)) + if (data->ocd_connect_flags & OBD_CONNECT_AT) revimp->imp_msghdr_flags |= MSGHDR_AT_SUPPORT; else revimp->imp_msghdr_flags &= ~MSGHDR_AT_SUPPORT; - if ((data->ocd_connect_flags & OBD_CONNECT_FULL20) && - (revimp->imp_msg_magic != LUSTRE_MSG_MAGIC_V1)) - revimp->imp_msghdr_flags |= MSGHDR_CKSUM_INCOMPAT18; - else - revimp->imp_msghdr_flags &= ~MSGHDR_CKSUM_INCOMPAT18; + revimp->imp_msghdr_flags |= MSGHDR_CKSUM_INCOMPAT18; rc = sptlrpc_import_sec_adapt(revimp, req->rq_svc_ctx, &req->rq_flvr); if (rc) { @@ -2633,9 +2643,13 @@ static int target_bulk_timeout(void *data) RETURN(1); } -static inline char *bulk2type(struct ptlrpc_bulk_desc *desc) +static inline const char *bulk2type(struct ptlrpc_request *req) { - return desc->bd_type == BULK_GET_SINK ? "GET" : "PUT"; + if (req->rq_bulk_read) + return "READ"; + if (req->rq_bulk_write) + return "WRITE"; + return "UNKNOWN"; } int target_bulk_io(struct obd_export *exp, struct ptlrpc_bulk_desc *desc, @@ -2662,7 +2676,7 @@ int target_bulk_io(struct obd_export *exp, struct ptlrpc_bulk_desc *desc, exp->exp_conn_cnt > lustre_msg_get_conn_cnt(req->rq_reqmsg)) { rc = -ENOTCONN; } else { - if (desc->bd_type == BULK_PUT_SINK) + if (req->rq_bulk_read) rc = sptlrpc_svc_wrap_bulk(req, desc); if (rc == 0) rc = ptlrpc_start_bulk_transfer(desc); @@ -2670,7 +2684,7 @@ int target_bulk_io(struct obd_export *exp, struct ptlrpc_bulk_desc *desc, if (rc < 0) { DEBUG_REQ(D_ERROR, req, "bulk %s failed: rc %d", - bulk2type(desc), rc); + bulk2type(req), rc); RETURN(rc); } @@ -2709,31 +2723,36 @@ int target_bulk_io(struct obd_export *exp, struct ptlrpc_bulk_desc *desc, if (rc == -ETIMEDOUT) { DEBUG_REQ(D_ERROR, req, "timeout on bulk %s after %ld%+lds", - bulk2type(desc), deadline - start, + bulk2type(req), deadline - start, cfs_time_current_sec() - deadline); ptlrpc_abort_bulk(desc); } else if (exp->exp_failed) { DEBUG_REQ(D_ERROR, req, "Eviction on bulk %s", - bulk2type(desc)); + bulk2type(req)); rc = -ENOTCONN; ptlrpc_abort_bulk(desc); } else if (exp->exp_conn_cnt > lustre_msg_get_conn_cnt(req->rq_reqmsg)) { DEBUG_REQ(D_ERROR, req, "Reconnect on bulk %s", - bulk2type(desc)); + bulk2type(req)); /* We don't reply anyway. */ rc = -ETIMEDOUT; ptlrpc_abort_bulk(desc); - } else if (desc->bd_failure || - desc->bd_nob_transferred != desc->bd_nob) { - DEBUG_REQ(D_ERROR, req, "%s bulk %s %d(%d)", - desc->bd_failure ? "network error on" : "truncated", - bulk2type(desc), desc->bd_nob_transferred, - desc->bd_nob); - /* XXX Should this be a different errno? */ + } else if (desc->bd_failure) { + DEBUG_REQ(D_ERROR, req, "network error on bulk %s", + bulk2type(req)); + /* XXX should this be a different errno? */ rc = -ETIMEDOUT; - } else if (desc->bd_type == BULK_GET_SINK) { - rc = sptlrpc_svc_unwrap_bulk(req, desc); + } else { + if (req->rq_bulk_write) + rc = sptlrpc_svc_unwrap_bulk(req, desc); + if (rc == 0 && desc->bd_nob_transferred != desc->bd_nob) { + DEBUG_REQ(D_ERROR, req, "truncated bulk %s %d(%d)", + bulk2type(req), desc->bd_nob_transferred, + desc->bd_nob); + /* XXX should this be a different errno? */ + rc = -ETIMEDOUT; + } } RETURN(rc);