Loading drivers/nvme/host/rdma.c +36 −6 Original line number Diff line number Diff line Loading @@ -43,6 +43,28 @@ #define NVME_RDMA_MAX_INLINE_SEGMENTS 1 static const char *const nvme_rdma_cm_status_strs[] = { [NVME_RDMA_CM_INVALID_LEN] = "invalid length", [NVME_RDMA_CM_INVALID_RECFMT] = "invalid record format", [NVME_RDMA_CM_INVALID_QID] = "invalid queue ID", [NVME_RDMA_CM_INVALID_HSQSIZE] = "invalid host SQ size", [NVME_RDMA_CM_INVALID_HRQSIZE] = "invalid host RQ size", [NVME_RDMA_CM_NO_RSC] = "resource not found", [NVME_RDMA_CM_INVALID_IRD] = "invalid IRD", [NVME_RDMA_CM_INVALID_ORD] = "Invalid ORD", }; static const char *nvme_rdma_cm_msg(enum nvme_rdma_cm_status status) { size_t index = status; if (index < ARRAY_SIZE(nvme_rdma_cm_status_strs) && nvme_rdma_cm_status_strs[index]) return nvme_rdma_cm_status_strs[index]; else return "unrecognized reason"; }; /* * We handle AEN commands ourselves and don't even let the * block layer know about them. Loading Loading @@ -1207,16 +1229,24 @@ static int nvme_rdma_conn_established(struct nvme_rdma_queue *queue) static int nvme_rdma_conn_rejected(struct nvme_rdma_queue *queue, struct rdma_cm_event *ev) { if (ev->param.conn.private_data_len) { struct nvme_rdma_cm_rej *rej = (struct nvme_rdma_cm_rej *)ev->param.conn.private_data; struct rdma_cm_id *cm_id = queue->cm_id; int status = ev->status; const char *rej_msg; const struct nvme_rdma_cm_rej *rej_data; u8 rej_data_len; rej_msg = rdma_reject_msg(cm_id, status); rej_data = rdma_consumer_reject_data(cm_id, ev, &rej_data_len); if (rej_data && rej_data_len >= sizeof(u16)) { u16 sts = le16_to_cpu(rej_data->sts); dev_err(queue->ctrl->ctrl.device, "Connect rejected, status %d.", le16_to_cpu(rej->sts)); /* XXX: Think of something clever to do here... */ "Connect rejected: status %d (%s) nvme status %d (%s).\n", status, rej_msg, sts, nvme_rdma_cm_msg(sts)); } else { dev_err(queue->ctrl->ctrl.device, "Connect rejected, no private data.\n"); "Connect rejected: status %d (%s).\n", status, rej_msg); } return -ECONNRESET; Loading Loading
drivers/nvme/host/rdma.c +36 −6 Original line number Diff line number Diff line Loading @@ -43,6 +43,28 @@ #define NVME_RDMA_MAX_INLINE_SEGMENTS 1 static const char *const nvme_rdma_cm_status_strs[] = { [NVME_RDMA_CM_INVALID_LEN] = "invalid length", [NVME_RDMA_CM_INVALID_RECFMT] = "invalid record format", [NVME_RDMA_CM_INVALID_QID] = "invalid queue ID", [NVME_RDMA_CM_INVALID_HSQSIZE] = "invalid host SQ size", [NVME_RDMA_CM_INVALID_HRQSIZE] = "invalid host RQ size", [NVME_RDMA_CM_NO_RSC] = "resource not found", [NVME_RDMA_CM_INVALID_IRD] = "invalid IRD", [NVME_RDMA_CM_INVALID_ORD] = "Invalid ORD", }; static const char *nvme_rdma_cm_msg(enum nvme_rdma_cm_status status) { size_t index = status; if (index < ARRAY_SIZE(nvme_rdma_cm_status_strs) && nvme_rdma_cm_status_strs[index]) return nvme_rdma_cm_status_strs[index]; else return "unrecognized reason"; }; /* * We handle AEN commands ourselves and don't even let the * block layer know about them. Loading Loading @@ -1207,16 +1229,24 @@ static int nvme_rdma_conn_established(struct nvme_rdma_queue *queue) static int nvme_rdma_conn_rejected(struct nvme_rdma_queue *queue, struct rdma_cm_event *ev) { if (ev->param.conn.private_data_len) { struct nvme_rdma_cm_rej *rej = (struct nvme_rdma_cm_rej *)ev->param.conn.private_data; struct rdma_cm_id *cm_id = queue->cm_id; int status = ev->status; const char *rej_msg; const struct nvme_rdma_cm_rej *rej_data; u8 rej_data_len; rej_msg = rdma_reject_msg(cm_id, status); rej_data = rdma_consumer_reject_data(cm_id, ev, &rej_data_len); if (rej_data && rej_data_len >= sizeof(u16)) { u16 sts = le16_to_cpu(rej_data->sts); dev_err(queue->ctrl->ctrl.device, "Connect rejected, status %d.", le16_to_cpu(rej->sts)); /* XXX: Think of something clever to do here... */ "Connect rejected: status %d (%s) nvme status %d (%s).\n", status, rej_msg, sts, nvme_rdma_cm_msg(sts)); } else { dev_err(queue->ctrl->ctrl.device, "Connect rejected, no private data.\n"); "Connect rejected: status %d (%s).\n", status, rej_msg); } return -ECONNRESET; Loading