diff --git a/configure.d/1_bdev_get_by_path.conf b/configure.d/1_bdev_get_by_path.conf deleted file mode 100644 index aa8e96866..000000000 --- a/configure.d/1_bdev_get_by_path.conf +++ /dev/null @@ -1,38 +0,0 @@ -#!/bin/bash -# -# Copyright(c) 2012-2022 Intel Corporation -# Copyright(c) 2024 Huawei Technologies -# SPDX-License-Identifier: BSD-3-Clause -# - -. $(dirname $3)/conf_framework.sh - - -check() { - cur_name=$(basename $2) - config_file_path=$1 - if compile_module $cur_name "blkdev_get_by_path(NULL, 0, NULL);" "linux/blkdev.h" - then - echo $cur_name 1 >> $config_file_path - elif compile_module $cur_name "blkdev_get_by_path(NULL, 0, NULL, NULL);" "linux/blkdev.h" - then - echo $cur_name 2 >> $config_file_path - else - echo $cur_name X >> $config_file_path - fi -} - -apply() { - case "$1" in - "1") - add_define "cas_blkdev_get_by_path(path, mode, holder) \\ - blkdev_get_by_path(path, mode, holder)" ;; - "2") - add_define "cas_blkdev_get_by_path(path, mode, holder) \\ - blkdev_get_by_path(path, mode, holder, NULL)" ;; - *) - exit 1 - esac -} - -conf_run $@ diff --git a/configure.d/1_bdev_open_by_path.conf b/configure.d/1_bdev_open_by_path.conf new file mode 100644 index 000000000..ddceced97 --- /dev/null +++ b/configure.d/1_bdev_open_by_path.conf @@ -0,0 +1,53 @@ +#!/bin/bash +# +# Copyright(c) 2012-2022 Intel Corporation +# Copyright(c) 2024 Huawei Technologies +# SPDX-License-Identifier: BSD-3-Clause +# + +. $(dirname $3)/conf_framework.sh + + +check() { + cur_name=$(basename $2) + config_file_path=$1 + if compile_module $cur_name "blkdev_get_by_path(NULL, 0, NULL);" "linux/blkdev.h" + then + echo $cur_name 1 >> $config_file_path + elif compile_module $cur_name "blkdev_get_by_path(NULL, 0, NULL, NULL);" "linux/blkdev.h" + then + echo $cur_name 2 >> $config_file_path + elif compile_module $cur_name "bdev_open_by_path(NULL, 0, NULL, NULL);" "linux/blkdev.h" + then + echo $cur_name 3 >> $config_file_path + else + echo $cur_name X >> $config_file_path + fi +} + +apply() { + case "$1" in + "1") + add_typedef "struct block_device *cas_bdev_handle_t;" + add_define "cas_bdev_open_by_path(path, mode, holder) \\ + blkdev_get_by_path(path, mode, holder)" + add_define "cas_bdev_get_from_handle(handle) \\ + ((struct block_device *)handle)" ;; + "2") + add_typedef "struct block_device *cas_bdev_handle_t;" + add_define "cas_bdev_open_by_path(path, mode, holder) \\ + blkdev_get_by_path(path, mode, holder, NULL)" + add_define "cas_bdev_get_from_handle(handle) \\ + ((struct block_device *)handle)" ;; + "3") + add_typedef "struct bdev_handle *cas_bdev_handle_t;" + add_define "cas_bdev_open_by_path(path, mode, holder) \\ + bdev_open_by_path(path, mode, holder, NULL)" + add_define "cas_bdev_get_from_handle(handle) \\ + (handle->bdev)" ;; + *) + exit 1 + esac +} + +conf_run $@ diff --git a/configure.d/1_bdev_put.conf b/configure.d/1_bdev_release.conf similarity index 58% rename from configure.d/1_bdev_put.conf rename to configure.d/1_bdev_release.conf index 43876afbd..5d9dff386 100644 --- a/configure.d/1_bdev_put.conf +++ b/configure.d/1_bdev_release.conf @@ -17,6 +17,9 @@ check() { elif compile_module $cur_name "blkdev_put(NULL, NULL);" "linux/blkdev.h" then echo $cur_name 2 >> $config_file_path + elif compile_module $cur_name "bdev_release(NULL);" "linux/blkdev.h" + then + echo $cur_name 3 >> $config_file_path else echo $cur_name X >> $config_file_path fi @@ -25,11 +28,14 @@ check() { apply() { case "$1" in "1") - add_define "cas_blkdev_put(bdev, mode, holder) \\ - blkdev_put(bdev, mode)" ;; + add_define "cas_bdev_release(handle, mode, holder) \\ + blkdev_put((struct block_device *)handle, mode)" ;; "2") - add_define "cas_blkdev_put(bdev, mode, holder) \\ - blkdev_put(bdev, holder)" ;; + add_define "cas_bdev_release(handle, mode, holder) \\ + blkdev_put((struct block_device *)handle, holder)" ;; + "3") + add_define "cas_bdev_release(handle, mode, holder) \\ + bdev_release(handle)" ;; *) exit 1 esac diff --git a/configure.d/1_class_create.conf b/configure.d/1_class_create.conf new file mode 100644 index 000000000..520704333 --- /dev/null +++ b/configure.d/1_class_create.conf @@ -0,0 +1,35 @@ +#!/bin/bash +# +# Copyright(c) 2012-2022 Intel Corporation +# Copyright(c) 2024 Huawei Technologies +# SPDX-License-Identifier: BSD-3-Clause +# + +. $(dirname $3)/conf_framework.sh + +check() { + cur_name=$(basename $2) + config_file_path=$1 + if compile_module $cur_name "class_create(NULL, NULL);" "linux/device.h" + then + echo $cur_name "1" >> $config_file_path + elif compile_module $cur_name "class_create(NULL);" "linux/device.h" + then + echo $cur_name "2" >> $config_file_path + else + echo $cur_name "X" >> $config_file_path + fi +} + +apply() { + case "$1" in + "1") + add_define "cas_class_create(owner, name) \\ + class_create(owner, name)";; + "2") + add_define "cas_class_create(owner, name) \\ + class_create(name)";; + esac +} + +conf_run $@ diff --git a/configure.d/2_bio_cmpl.conf b/configure.d/2_bio_cmpl.conf index 70ff88e4b..bbb43af35 100644 --- a/configure.d/2_bio_cmpl.conf +++ b/configure.d/2_bio_cmpl.conf @@ -1,6 +1,7 @@ #!/bin/bash # # Copyright(c) 2012-2022 Intel Corporation +# Copyright(c) 2024 Huawei Technologies # SPDX-License-Identifier: BSD-3-Clause # @@ -33,14 +34,14 @@ apply() { add_define "CAS_BIO_ENDIO(BIO, BYTES_DONE, ERROR) \\ bio_endio(BIO, ERROR)" add_define "CAS_DECLARE_BLOCK_CALLBACK(name, BIO, BYTES_DONE, ERROR) \\ - void name##_callback(BIO, ERROR)" + static void name##_callback(BIO, ERROR)" add_define "CAS_BLOCK_CALLBACK_ERROR(BIO, ERROR) \\ ERROR" ;; "2") add_define "CAS_BIO_ENDIO(BIO, BYTES_DONE, ERROR) \\ ({ CAS_BIO_OP_STATUS(BIO) = ERROR; bio_endio(BIO); })" add_define "CAS_DECLARE_BLOCK_CALLBACK(name, BIO, BYTES_DONE, ERROR) \\ - void name##_callback(BIO)" + static void name##_callback(BIO)" add_define "CAS_BLOCK_CALLBACK_ERROR(BIO, ERROR) \\ CAS_BIO_OP_STATUS(BIO)" ;; esac diff --git a/configure.d/conf_framework.sh b/configure.d/conf_framework.sh index 51fb8e689..fa28b1f7e 100644 --- a/configure.d/conf_framework.sh +++ b/configure.d/conf_framework.sh @@ -1,6 +1,7 @@ #!/bin/bash # # Copyright(c) 2012-2022 Intel Corporation +# Copyright(c) 2024 Huawei Technologies # SPDX-License-Identifier: BSD-3-Clause # @@ -20,6 +21,10 @@ add_function() { printf "%s\n" $1 >> $DEFINE_FILE } +add_typedef() { + printf "typedef %s\n" $1 >> $DEFINE_FILE +} + __compile_module(){ INCLUDE="" if [ $# -gt 1 ] diff --git a/modules/cas_cache/control.c b/modules/cas_cache/control.c index bc8d50aab..a0fb17778 100644 --- a/modules/cas_cache/control.c +++ b/modules/cas_cache/control.c @@ -1,5 +1,6 @@ /* * Copyright(c) 2012-2021 Intel Corporation +* Copyright(c) 2024 Huawei Technologies * SPDX-License-Identifier: BSD-3-Clause */ #include @@ -42,7 +43,7 @@ int __init cas_ctrl_device_init(void) goto error_cdev_add; } - ctrl->class = class_create(THIS_MODULE, "cas"); + ctrl->class = cas_class_create(THIS_MODULE, "cas"); if (IS_ERR(ctrl->class)) { printk(KERN_ERR "Cannot create control chrdev class.\n"); result = PTR_ERR(ctrl->class); diff --git a/modules/cas_cache/disk.c b/modules/cas_cache/disk.c index 59d14ae9d..6a061ee12 100644 --- a/modules/cas_cache/disk.c +++ b/modules/cas_cache/disk.c @@ -14,17 +14,15 @@ #define CAS_DISK_OPEN_MODE (CAS_MODE_READ | CAS_MODE_WRITE) -static inline struct block_device *open_bdev_exclusive(const char *path, +static inline cas_bdev_handle_t open_bdev_exclusive(const char *path, CAS_MODE mode, void *holder) { - return cas_blkdev_get_by_path(path, mode | CAS_MODE_EXCL, - holder); + return cas_bdev_open_by_path(path, mode | CAS_MODE_EXCL, holder); } -static inline void close_bdev_exclusive(struct block_device *bdev, - CAS_MODE mode) +static inline void close_bdev_exclusive(cas_bdev_handle_t handle, CAS_MODE mode) { - cas_blkdev_put(bdev, mode | CAS_MODE_EXCL, NULL); + cas_bdev_release(handle, mode | CAS_MODE_EXCL, NULL); } int __init cas_init_disks(void) @@ -69,10 +67,10 @@ struct cas_disk *cas_disk_open(const char *path) goto error_kstrdup; } - dsk->bd = open_bdev_exclusive(path, CAS_DISK_OPEN_MODE, dsk); - if (IS_ERR(dsk->bd)) { + dsk->bdev_handle = open_bdev_exclusive(path, CAS_DISK_OPEN_MODE, dsk); + if (IS_ERR(dsk->bdev_handle)) { CAS_DEBUG_ERROR("Cannot open exclusive"); - result = PTR_ERR(dsk->bd); + result = PTR_ERR(dsk->bdev_handle); goto error_open_bdev; } @@ -91,11 +89,11 @@ struct cas_disk *cas_disk_open(const char *path) void cas_disk_close(struct cas_disk *dsk) { BUG_ON(!dsk); - BUG_ON(!dsk->bd); + BUG_ON(!dsk->bdev_handle); CAS_DEBUG_DISK(dsk, "Destroying (%p)", dsk); - close_bdev_exclusive(dsk->bd, CAS_DISK_OPEN_MODE); + close_bdev_exclusive(dsk->bdev_handle, CAS_DISK_OPEN_MODE); kfree(dsk->path); kmem_cache_free(cas_module.disk_cache, dsk); @@ -104,19 +102,18 @@ void cas_disk_close(struct cas_disk *dsk) struct block_device *cas_disk_get_blkdev(struct cas_disk *dsk) { BUG_ON(!dsk); - return dsk->bd; + BUG_ON(!dsk->bdev_handle); + return cas_bdev_get_from_handle(dsk->bdev_handle); } struct gendisk *cas_disk_get_gendisk(struct cas_disk *dsk) { - BUG_ON(!dsk); - BUG_ON(!dsk->bd); - return dsk->bd->bd_disk; + return cas_disk_get_blkdev(dsk)->bd_disk; } struct request_queue *cas_disk_get_queue(struct cas_disk *dsk) { - BUG_ON(!dsk); - BUG_ON(!dsk->bd); - return cas_bdev_whole(dsk->bd)->bd_disk->queue; + struct block_device *bd = cas_disk_get_blkdev(dsk); + + return cas_bdev_whole(bd)->bd_disk->queue; } diff --git a/modules/cas_cache/disk.h b/modules/cas_cache/disk.h index 743767314..7614e697d 100644 --- a/modules/cas_cache/disk.h +++ b/modules/cas_cache/disk.h @@ -1,5 +1,6 @@ /* * Copyright(c) 2012-2022 Intel Corporation +* Copyright(c) 2024 Huawei Technologies * SPDX-License-Identifier: BSD-3-Clause */ #ifndef __CASDISK_DISK_H__ @@ -16,7 +17,7 @@ struct cas_exp_obj; struct cas_disk { char *path; - struct block_device *bd; + cas_bdev_handle_t bdev_handle; struct cas_exp_obj *exp_obj; }; diff --git a/modules/cas_cache/exp_obj.c b/modules/cas_cache/exp_obj.c index 62c770c57..6ff07eada 100644 --- a/modules/cas_cache/exp_obj.c +++ b/modules/cas_cache/exp_obj.c @@ -174,7 +174,7 @@ static int _cas_exp_obj_hide_parts(struct cas_disk *dsk) /* It is partition, no more job required */ return 0; - if (GET_DISK_MAX_PARTS(dsk->bd->bd_disk) > 1) { + if (GET_DISK_MAX_PARTS(cas_disk_get_gendisk(dsk)) > 1) { if (_cas_del_partitions(dsk)) { printk(KERN_ERR "Error deleting a partition on thedevice %s\n", gdsk->disk_name); @@ -490,7 +490,7 @@ int cas_exp_obj_create(struct cas_disk *dsk, const char *dev_name, if (cas_add_disk(gd)) goto error_add_disk; - result = bd_claim_by_disk(dsk->bd, dsk, gd); + result = bd_claim_by_disk(cas_disk_get_blkdev(dsk), dsk, gd); if (result) goto error_bd_claim; @@ -531,7 +531,7 @@ int cas_exp_obj_destroy(struct cas_disk *dsk) exp_obj = dsk->exp_obj; - bd_release_from_disk(dsk->bd, exp_obj->gd); + bd_release_from_disk(cas_disk_get_blkdev(dsk), exp_obj->gd); _cas_exp_obj_clear_dev_t(dsk); del_gendisk(exp_obj->gd); diff --git a/modules/cas_cache/layer_cache_management.c b/modules/cas_cache/layer_cache_management.c index 1d8cf3e15..7ccc2c079 100644 --- a/modules/cas_cache/layer_cache_management.c +++ b/modules/cas_cache/layer_cache_management.c @@ -1138,18 +1138,20 @@ static void cache_mngt_metadata_probe_end(void *priv, int error, int cache_mngt_cache_check_device(struct kcas_cache_check_device *cmd_info) { struct cache_mngt_metadata_probe_context context; + cas_bdev_handle_t bdev_handle; struct block_device *bdev; ocf_volume_t volume; char holder[] = "CAS CHECK CACHE DEVICE\n"; int result; - bdev = cas_blkdev_get_by_path(cmd_info->path_name, + bdev_handle = cas_bdev_open_by_path(cmd_info->path_name, (CAS_MODE_EXCL | CAS_MODE_READ), holder); - if (IS_ERR(bdev)) { - return (PTR_ERR(bdev) == -EBUSY) ? + if (IS_ERR(bdev_handle)) { + return (PTR_ERR(bdev_handle) == -EBUSY) ? -OCF_ERR_NOT_OPEN_EXC : -OCF_ERR_INVAL_VOLUME_TYPE; } + bdev = cas_bdev_get_from_handle(bdev_handle); result = cas_blk_open_volume_by_bdev(&volume, bdev); if (result) @@ -1165,7 +1167,7 @@ int cache_mngt_cache_check_device(struct kcas_cache_check_device *cmd_info) cas_blk_close_volume(volume); out_bdev: - cas_blkdev_put(bdev, (CAS_MODE_EXCL|CAS_MODE_READ), holder); + cas_bdev_release(bdev_handle, (CAS_MODE_EXCL|CAS_MODE_READ), holder); return result; } @@ -2135,18 +2137,20 @@ static int _cache_mngt_probe_metadata(char *cache_path_name, ocf_cache_line_size_t *cache_line_size_meta) { struct cache_mngt_probe_metadata_context context; + cas_bdev_handle_t bdev_handle; struct block_device *bdev; ocf_volume_t volume; char holder[] = "CAS CHECK METADATA\n"; int result; - bdev = cas_blkdev_get_by_path(cache_path_name, + bdev_handle = cas_bdev_open_by_path(cache_path_name, (CAS_MODE_EXCL | CAS_MODE_READ), holder); - if (IS_ERR(bdev)) { - return (PTR_ERR(bdev) == -EBUSY) ? - -OCF_ERR_NOT_OPEN_EXC : - -OCF_ERR_INVAL_VOLUME_TYPE; + if (IS_ERR(bdev_handle)) { + return (PTR_ERR(bdev_handle) == -EBUSY) ? + -OCF_ERR_NOT_OPEN_EXC : + -OCF_ERR_INVAL_VOLUME_TYPE; } + bdev = cas_bdev_get_from_handle(bdev_handle); result = cas_blk_open_volume_by_bdev(&volume, bdev); if (result) @@ -2164,7 +2168,7 @@ static int _cache_mngt_probe_metadata(char *cache_path_name, cas_blk_close_volume(volume); out_bdev: - cas_blkdev_put(bdev, (CAS_MODE_EXCL|CAS_MODE_READ), holder); + cas_bdev_release(bdev_handle, (CAS_MODE_EXCL|CAS_MODE_READ), holder); return result; } @@ -2227,22 +2231,24 @@ static int cache_mngt_check_bdev(struct ocf_mngt_cache_device_config *cfg, bool force) { char holder[] = "CAS START\n"; + cas_bdev_handle_t bdev_handle; struct block_device *bdev; int part_count; bool is_part; - const struct ocf_volume_uuid *uuid = ocf_volume_get_uuid(device_cfg->volume); + const struct ocf_volume_uuid *uuid = ocf_volume_get_uuid(cfg->volume); - bdev = cas_blkdev_get_by_path(uuid->data, + bdev_handle = cas_bdev_open_by_path(uuid->data, (CAS_MODE_EXCL | CAS_MODE_READ), holder); - if (IS_ERR(bdev)) { - return (PTR_ERR(bdev) == -EBUSY) ? + if (IS_ERR(bdev_handle)) { + return (PTR_ERR(bdev_handle) == -EBUSY) ? -OCF_ERR_NOT_OPEN_EXC : -OCF_ERR_INVAL_VOLUME_TYPE; } + bdev = cas_bdev_get_from_handle(bdev_handle); is_part = (cas_bdev_whole(bdev) != bdev); part_count = cas_blk_get_part_count(bdev); - cas_blkdev_put(bdev, (CAS_MODE_EXCL|CAS_MODE_READ), holder); + cas_bdev_release(bdev_handle, (CAS_MODE_EXCL|CAS_MODE_READ), holder); if (!is_part && part_count > 1 && !force) return -KCAS_ERR_CONTAINS_PART;