diff --git a/iscsi-scst/Makefile b/iscsi-scst/Makefile index 9302197ba..70a1cc4a8 100644 --- a/iscsi-scst/Makefile +++ b/iscsi-scst/Makefile @@ -290,6 +290,12 @@ conftest/rdma_create_id_net/result-$(KVER).txt: \ echo "$(call run_conftest_bool,rdma_create_id_net, \ RDMA_CREATE_ID_TAKES_NET_ARG)" >"$@" +conftest/rdma_reject/result-$(KVER).txt: \ + conftest/rdma_reject/rdma_reject.c \ + conftest/rdma_reject/Makefile + echo "$(call run_conftest_bool,rdma_reject, \ + RDMA_REJECT_HAS_FOUR_ARGS)" >"$@" + conftest/register_mad_agent/result-$(KVER).txt: \ conftest/register_mad_agent/register_mad_agent.c \ conftest/register_mad_agent/Makefile diff --git a/iscsi-scst/kernel/isert-scst/iser_rdma.c b/iscsi-scst/kernel/isert-scst/iser_rdma.c index 3375c92f2..7f4d60fa0 100644 --- a/iscsi-scst/kernel/isert-scst/iser_rdma.c +++ b/iscsi-scst/kernel/isert-scst/iser_rdma.c @@ -41,6 +41,7 @@ #ifndef INSIDE_KERNEL_TREE #include #endif +#include #include "isert_dbg.h" #include "iser.h" @@ -1571,7 +1572,11 @@ fail_conn_create: isert_deref_device(isert_dev); mutex_unlock(&dev_list_mutex); fail_dev_create: - rdma_reject(cm_id, NULL, 0); + rdma_reject(cm_id, NULL, 0 +#if RDMA_REJECT_HAS_FOUR_ARGS + , IB_CM_REJ_CONSUMER_DEFINED +#endif + ); module_put(THIS_MODULE); goto out; } diff --git a/scripts/specialize-patch b/scripts/specialize-patch index 08e5c9c4e..951df7a7b 100755 --- a/scripts/specialize-patch +++ b/scripts/specialize-patch @@ -90,6 +90,9 @@ function evaluate(stmnt, pattern, arg, op, result) { "(LINUX_VERSION_CODE < KERNEL_VERSION(4, 3, 0) \\&\\& " \ "RHEL_RELEASE_CODE -0 < 7 * 256 + 5)", stmnt) + gsub("IB_CLIENT_ADD_ONE_RETURNS_INT", + "(LINUX_VERSION_CODE >= KERNEL_VERSION(5, 8, 0))", stmnt) + gsub("defined\\(IB_CLIENT_REMOVE_TAKES_TWO_ARGS\\)", "(LINUX_VERSION_CODE >= KERNEL_VERSION(4, 3, 0) || " \ "RHEL_RELEASE_CODE -0 >= 7 * 256 + 5)", stmnt) @@ -156,6 +159,9 @@ function evaluate(stmnt, pattern, arg, op, result) { "(LINUX_VERSION_CODE < KERNEL_VERSION(5, 1, 0) \\&\\& " \ "RHEL_RELEASE_CODE -0 < 8 * 256 + 2)", stmnt) + gsub("RDMA_REJECT_HAS_FOUR_ARGS", + "(LINUX_VERSION_CODE >= KERNEL_VERSION(5, 8, 0))", stmnt) + gsub("defined(ENABLE_NPIV)", 0, stmnt) gsub("defined(FC_VPORT_CREATE_DEFINED)", 0, stmnt) @@ -411,6 +417,7 @@ function handle_if(evaluated) || $0 ~ "HAVE_RDMA_QUERY_GID" \ || $0 ~ "HAVE_SRP_DATA_DESC_IMM" \ || $0 ~ "HAVE_STRUCT_SRP_LOGIN_REQ_RDMA" \ + || $0 ~ "IB_CLIENT_ADD_ONE_RETURNS_INT" \ || $0 ~ "IB_CLIENT_REMOVE_TAKES_TWO_ARGS" \ || $0 ~ "IB_CM_LISTEN_TAKES_FOURTH_ARG" \ || $0 ~ "IB_CREATE_CQ_HAS_INIT_ATTR" \ @@ -421,6 +428,7 @@ function handle_if(evaluated) || $0 ~ "MOFED_MAJOR" \ || $0 ~ "MOFED_MINOR" \ || $0 ~ "RDMA_CREATE_ID_TAKES_NET_ARG" \ + || $0 ~ "RDMA_REJECT_HAS_FOUR_ARGS" \ || $0 ~ "REGISTER_MAD_AGENT_HAS_FLAGS_ARG" \ || $0 ~ "RHEL_MAJOR" \ || $0 ~ "RHEL_MINOR" \ diff --git a/scst/src/dev_handlers/scst_user.c b/scst/src/dev_handlers/scst_user.c index 24f4d7b45..cb528ed6c 100644 --- a/scst/src/dev_handlers/scst_user.c +++ b/scst/src/dev_handlers/scst_user.c @@ -1262,10 +1262,17 @@ static int dev_user_map_buf(struct scst_user_cmd *ucmd, unsigned long ubuff, ucmd->num_data_pages, (int)(ubuff & ~PAGE_MASK), (ucmd->cmd != NULL) ? ucmd->cmd->bufflen : -1); +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 8, 0) down_read(&tsk->mm->mmap_sem); rc = get_user_pages(ubuff, ucmd->num_data_pages, FOLL_WRITE, ucmd->data_pages, NULL); up_read(&tsk->mm->mmap_sem); +#else + mmap_read_lock(tsk->mm); + rc = get_user_pages(ubuff, ucmd->num_data_pages, FOLL_WRITE, + ucmd->data_pages, NULL); + mmap_read_unlock(tsk->mm); +#endif /* get_user_pages() flushes dcache */ diff --git a/scst/src/dev_handlers/scst_vdisk.c b/scst/src/dev_handlers/scst_vdisk.c index 9c58f8902..2b272b250 100644 --- a/scst/src/dev_handlers/scst_vdisk.c +++ b/scst/src/dev_handlers/scst_vdisk.c @@ -485,8 +485,10 @@ static int vdisk_blockio_flush(struct block_device *bdev, gfp_t gfp_mask, res = blkdev_issue_flush(bdev, NULL); #elif LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 37) res = blkdev_issue_flush(bdev, gfp_mask, NULL, BLKDEV_IFL_WAIT); -#else +#elif LINUX_VERSION_CODE < KERNEL_VERSION(5, 8, 0) res = blkdev_issue_flush(bdev, gfp_mask, NULL); +#else + res = blkdev_issue_flush(bdev, gfp_mask); #endif } diff --git a/srpt/Makefile b/srpt/Makefile index 1d2da90c1..d9999979b 100644 --- a/srpt/Makefile +++ b/srpt/Makefile @@ -202,6 +202,12 @@ conftest/gid_change/result-$(KVER).txt: \ conftest/gid_change/Makefile echo "$(call run_conftest,gid_change,-DHAVE_IB_EVENT_GID_CHANGE)" >"$@" +conftest/ib_client_add_one/result-$(KVER).txt: \ + conftest/ib_client_add_one/add_one.c \ + conftest/ib_client_add_one/Makefile + echo "$(call run_conftest_bool,ib_client_add_one, \ + IB_CLIENT_ADD_ONE_RETURNS_INT)" >"$@" + conftest/ib_client_remove/result-$(KVER).txt: \ conftest/ib_client_remove/ib_client_remove.c \ conftest/ib_client_remove/Makefile @@ -275,6 +281,12 @@ conftest/rdma_query_gid/result-$(KVER).txt: \ conftest/rdma_query_gid/Makefile echo "$(call run_conftest_bool,rdma_query_gid,HAVE_RDMA_QUERY_GID)" >"$@" +conftest/rdma_reject/result-$(KVER).txt: \ + conftest/rdma_reject/rdma_reject.c \ + conftest/rdma_reject/Makefile + echo "$(call run_conftest_bool,rdma_reject, \ + RDMA_REJECT_HAS_FOUR_ARGS)" >"$@" + conftest/register_mad_agent/result-$(KVER).txt: \ conftest/register_mad_agent/register_mad_agent.c \ conftest/register_mad_agent/Makefile diff --git a/srpt/src/ib_srpt.c b/srpt/src/ib_srpt.c index e8567a75d..071153b13 100644 --- a/srpt/src/ib_srpt.c +++ b/srpt/src/ib_srpt.c @@ -2946,7 +2946,11 @@ reject: SRP_BUF_FORMAT_INDIRECT); if (rdma_cm_id) - rdma_reject(rdma_cm_id, rej, sizeof(*rej)); + rdma_reject(rdma_cm_id, rej, sizeof(*rej) +#if RDMA_REJECT_HAS_FOUR_ARGS + , IB_CM_REJ_CONSUMER_DEFINED +#endif + ); else ib_send_cm_rej(ib_cm_id, IB_CM_REJ_CONSUMER_DEFINED, NULL, 0, rej, sizeof(*rej)); @@ -4369,7 +4373,7 @@ static void srpt_init_sport(struct srpt_port *sport, struct ib_device *ib_dev) /* * srpt_add_one() - Infiniband device addition callback function. */ -static void srpt_add_one(struct ib_device *device) +static int srpt_add_one(struct ib_device *device) { struct ib_cm_id *cm_id; struct srpt_device *sdev; @@ -4380,8 +4384,10 @@ static void srpt_add_one(struct ib_device *device) pr_debug("device = %p\n", device); sdev = kzalloc(sizeof(*sdev), GFP_KERNEL); - if (!sdev) + if (!sdev) { + ret = -ENOMEM; goto err; + } sdev->device = device; @@ -4397,13 +4403,15 @@ static void srpt_add_one(struct ib_device *device) sdev->pd = ib_alloc_pd(device, 0); if (IS_ERR(sdev->pd)) { - pr_err("ib_alloc_pd() failed: %ld\n", PTR_ERR(sdev->pd)); + ret = PTR_ERR(sdev->pd); + pr_err("ib_alloc_pd() failed: %d\n", ret); goto free_dev; } #ifndef IB_PD_HAS_LOCAL_DMA_LKEY sdev->mr = ib_get_dma_mr(sdev->pd, IB_ACCESS_LOCAL_WRITE); if (IS_ERR(sdev->mr)) { + ret = PTR_ERR(sdev->mr); pr_err("ib_get_dma_mr() failed: %ld\n", PTR_ERR(sdev->mr)); goto err_pd; } @@ -4441,8 +4449,10 @@ static void srpt_add_one(struct ib_device *device) sdev->req_buf_cache = kmem_cache_create("srpt-srq-req-buf", srp_max_req_size, 0, 0, NULL); - if (!sdev->req_buf_cache) + if (!sdev->req_buf_cache) { + ret = -ENOMEM; goto free_srq; + } sdev->ioctx_ring = (struct srpt_recv_ioctx **) srpt_alloc_ioctx_ring(sdev, sdev->srq_size, @@ -4450,6 +4460,7 @@ static void srpt_add_one(struct ib_device *device) sdev->req_buf_cache, 0, DMA_FROM_DEVICE); if (!sdev->ioctx_ring) { + ret = -ENOMEM; pr_err("srpt_alloc_ioctx_ring() failed\n"); goto free_cache; } @@ -4478,7 +4489,8 @@ static void srpt_add_one(struct ib_device *device) #else INIT_WORK(&sport->work, srpt_refresh_port_work); #endif - if (srpt_refresh_port(sport)) { + ret = srpt_refresh_port(sport); + if (ret) { pr_err("MAD registration failed for %s-%d.\n", dev_name(&sdev->device->dev), i); goto err_ring; @@ -4491,7 +4503,8 @@ static void srpt_add_one(struct ib_device *device) cm_id = ib_create_cm_id(device, srpt_cm_handler, sdev); if (IS_ERR(cm_id)) { - pr_err("ib_create_cm_id() failed: %ld\n", PTR_ERR(cm_id)); + ret = PTR_ERR(cm_id); + pr_err("ib_create_cm_id() failed: %d\n", ret); goto err_ring; } sdev->cm_id = cm_id; @@ -4521,10 +4534,11 @@ static void srpt_add_one(struct ib_device *device) srpt_event_handler); ib_register_event_handler(&sdev->event_handler); atomic_inc(&srpt_device_count); + ret = 0; out: ib_set_client_data(device, &srpt_client, sdev); - return; + return ret; err_cm: ib_destroy_cm_id(sdev->cm_id); @@ -4552,6 +4566,13 @@ err: goto out; } +#if !IB_CLIENT_ADD_ONE_RETURNS_INT +static void srpt_add_one_void(struct ib_device *device) +{ + srpt_add_one(device); +} +#endif + /* * srpt_remove_one() - InfiniBand device removal callback function. */ @@ -4624,7 +4645,11 @@ static void srpt_remove_one(struct ib_device *device, void *client_data) static struct ib_client srpt_client = { .name = DRV_NAME, +#if IB_CLIENT_ADD_ONE_RETURNS_INT .add = srpt_add_one, +#else + .add = srpt_add_one_void, +#endif .remove = srpt_remove_one };