From 4f985049895d607378403e493d3e26aa1b7a498e Mon Sep 17 00:00:00 2001 From: gokull Date: Thu, 6 Mar 2025 10:25:23 +0000 Subject: [PATCH] blk: vblk: Enable Ioctl in tegra_hv_vblk Previous code was using the struct request.completion_data to pass the struct ioctl_request to the processing thread. This member variable is removed from kernel v6.5. Change contains: [1] Moving this variable from struct request to struct struct vblk_dev. [2] Copyright Banner is updated This makes the passing of the struct ioctl_request independent of linux kernel transition Bug 4311184 Change-Id: I3dd2c4ee9861516db770adcba345362395bf3fa3 Signed-off-by: gokull Reviewed-on: https://git-master.nvidia.com/r/c/linux-nv-oot/+/3314801 Reviewed-by: Jon Hunter Reviewed-by: mobile promotions Tested-by: mobile promotions GVS: buildbot_gerritrpt --- .../block/tegra_virt_storage/tegra_hv_ioctl.c | 9 ++------ .../block/tegra_virt_storage/tegra_hv_vblk.c | 22 ++----------------- drivers/block/tegra_virt_storage/tegra_vblk.h | 1 + scripts/conftest/Makefile | 1 - scripts/conftest/conftest.sh | 17 -------------- 5 files changed, 5 insertions(+), 45 deletions(-) diff --git a/drivers/block/tegra_virt_storage/tegra_hv_ioctl.c b/drivers/block/tegra_virt_storage/tegra_hv_ioctl.c index 5ba41df4..36fb3872 100644 --- a/drivers/block/tegra_virt_storage/tegra_hv_ioctl.c +++ b/drivers/block/tegra_virt_storage/tegra_hv_ioctl.c @@ -1,7 +1,5 @@ /* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Copyright (c) 2022-2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved. - */ +/* SPDX-FileCopyrightText: Copyright (c) 2024-2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. */ #include @@ -136,10 +134,7 @@ int vblk_submit_ioctl_req(struct block_device *bdev, err = PTR_ERR(rq); goto free_ioctl_req; } - -#if defined(NV_REQUEST_STRUCT_HAS_COMPLETION_DATA_ARG) /* Removed in Linux v6.5 */ - rq->completion_data = (void *)ioctl_req; -#endif + vblkdev->ioctl_req = ioctl_req; #if defined(NV_BLK_EXECUTE_RQ_HAS_NO_GENDISK_ARG) /* Linux v5.17 */ blk_execute_rq(rq, 0); diff --git a/drivers/block/tegra_virt_storage/tegra_hv_vblk.c b/drivers/block/tegra_virt_storage/tegra_hv_vblk.c index 42d4592f..d5f7ffc8 100644 --- a/drivers/block/tegra_virt_storage/tegra_hv_vblk.c +++ b/drivers/block/tegra_virt_storage/tegra_hv_vblk.c @@ -677,11 +677,7 @@ static bool submit_bio_req(struct vblk_dev *vblkdev) } else { if (vblkdev->config.blk_config.req_ops_supported & VS_BLK_IOCTL_OP_F && !vblk_prep_ioctl_req(vblkdev, -#if defined(NV_REQUEST_STRUCT_HAS_COMPLETION_DATA_ARG) /* Removed in Linux v6.5 */ - (struct vblk_ioctl_req *)bio_req->completion_data, -#else - NULL, -#endif + vblkdev->ioctl_req, vsc_req)) { vblkdev->inflight_ioctl_reqs++; } else if (!(vblkdev->config.blk_config.req_ops_supported & VS_BLK_IOCTL_OP_F)) { @@ -916,14 +912,7 @@ static const struct block_device_operations vblk_ops_no_ioctl = { .open = vblk_open, .release = vblk_release, .getgeo = vblk_getgeo, -#if defined(NV_REQUEST_STRUCT_HAS_COMPLETION_DATA_ARG) /* Removed in Linux v6.5 */ - /* - * FIXME: ioctl is not supported for Linux v6.5 where the - * 'completion_data' member has been removed from the - * 'request' structure. - */ - .ioctl = vblk_ioctl_not_supported -#endif + .ioctl = vblk_ioctl }; /* The device operations structure. */ @@ -932,14 +921,7 @@ static const struct block_device_operations vblk_ops_ioctl = { .open = vblk_ioctl_open, .release = vblk_ioctl_release, .getgeo = vblk_getgeo, -#if defined(NV_REQUEST_STRUCT_HAS_COMPLETION_DATA_ARG) /* Removed in Linux v6.5 */ - /* - * FIXME: ioctl is not supported for Linux v6.5 where the - * 'completion_data' member has been removed from the - * 'request' structure. - */ .ioctl = vblk_ioctl -#endif }; static ssize_t diff --git a/drivers/block/tegra_virt_storage/tegra_vblk.h b/drivers/block/tegra_virt_storage/tegra_vblk.h index e6a639e1..57f22817 100644 --- a/drivers/block/tegra_virt_storage/tegra_vblk.h +++ b/drivers/block/tegra_virt_storage/tegra_vblk.h @@ -130,6 +130,7 @@ struct vblk_dev { /* partition specific task struct */ struct task_struct *vblk_kthread; struct completion complete; + struct vblk_ioctl_req *ioctl_req; }; int vblk_complete_ioctl_req(struct vblk_dev *vblkdev, diff --git a/scripts/conftest/Makefile b/scripts/conftest/Makefile index ddbc85fd..bbede5b3 100644 --- a/scripts/conftest/Makefile +++ b/scripts/conftest/Makefile @@ -232,7 +232,6 @@ NV_CONFTEST_GENERIC_COMPILE_TESTS += is_export_symbol_present_queue_limits_set NV_CONFTEST_FUNCTION_COMPILE_TESTS += crypto_engine_ctx_struct_removed_test NV_CONFTEST_MACRO_COMPILE_TESTS ?= NV_CONFTEST_SYMBOL_COMPILE_TESTS ?= -NV_CONFTEST_TYPE_COMPILE_TESTS += request_struct_has_completion_data_arg $(eval $(call NV_GENERATE_COMPILE_TEST_HEADER,functions,$(NV_CONFTEST_FUNCTION_COMPILE_TESTS))) $(eval $(call NV_GENERATE_COMPILE_TEST_HEADER,generic,$(NV_CONFTEST_GENERIC_COMPILE_TESTS))) diff --git a/scripts/conftest/conftest.sh b/scripts/conftest/conftest.sh index c360b228..7745ee0a 100755 --- a/scripts/conftest/conftest.sh +++ b/scripts/conftest/conftest.sh @@ -8161,23 +8161,6 @@ compile_test() { compile_check_conftest "$CODE" "NV_REGISTER_SHRINKER_HAS_FMT_ARG" "" "types" ;; - request_struct_has_completion_data_arg) - # - # Determine if the 'struct request' has the 'completion_data' member. - # - # In Linux v6.5, commit dc8cbb65dc17 ("block: remove dead struc - # request->completion_data field") removes the 'completion_data' member - # from the 'struct request'. - # - CODE=" - #include - int conftest_request_struct_has_completion_data_arg(void) { - return offsetof(struct request, completion_data); - }" - - compile_check_conftest "$CODE" "NV_REQUEST_STRUCT_HAS_COMPLETION_DATA_ARG" "" "types" - ;; - shrinker_alloc) # # Determine if the shrinker alloc present or not.