diff --git a/configure.d/1_cleanup_disk.conf b/configure.d/1_cleanup_disk.conf new file mode 100644 index 0000000..c87bab9 --- /dev/null +++ b/configure.d/1_cleanup_disk.conf @@ -0,0 +1,45 @@ +#!/bin/bash +# +# Copyright(c) 2012-2022 Intel Corporation +# 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 "blk_cleanup_disk(NULL);" "linux/blk-mq.h" + then + echo $cur_name 1 >> $config_file_path + else + echo $cur_name 2 >> $config_file_path + fi +} + +apply() { + case "$1" in + "1") + add_function " + static inline void cas_cleanup_disk(struct gendisk *gd) + { + blk_cleanup_disk(gd); + }" + ;; + + "2") + + add_function " + static inline void cas_cleanup_disk(struct gendisk *gd) + { + put_disk(gd); + }" + ;; + + *) + exit 1 + esac +} + +conf_run $@ diff --git a/configure.d/1_cleanup_queue.conf b/configure.d/1_cleanup_queue.conf new file mode 100644 index 0000000..6a430cc --- /dev/null +++ b/configure.d/1_cleanup_queue.conf @@ -0,0 +1,45 @@ +#!/bin/bash +# +# Copyright(c) 2012-2022 Intel Corporation +# 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 "blk_cleanup_queue(NULL);" "linux/blk-mq.h" + then + echo $cur_name 1 >> $config_file_path + else + echo $cur_name 2 >> $config_file_path + fi +} + +apply() { + case "$1" in + "1") + add_function " + static inline void cas_cleanup_queue(struct request_queue *q) + { + blk_cleanup_queue(q); + }" + ;; + + "2") + + add_function " + static inline void cas_cleanup_queue(struct request_queue *q) + { + blk_mq_destroy_queue(q); + }" + ;; + + *) + exit 1 + esac +} + +conf_run $@ diff --git a/configure.d/1_has_discard_support.conf b/configure.d/1_has_discard_support.conf new file mode 100644 index 0000000..b6c4d7f --- /dev/null +++ b/configure.d/1_has_discard_support.conf @@ -0,0 +1,46 @@ +#!/bin/bash +# +# Copyright(c) 2012-2022 Intel Corporation +# 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 "struct request_queue q;blk_queue_discard(&q);" "linux/blk-mq.h" + then + echo $cur_name 1 >> $config_file_path + else + echo $cur_name 2 >> $config_file_path + fi +} + +apply() { + case "$1" in + "1") + add_function " + static inline int cas_has_discard_support(struct block_device *bd) + { + struct request_queue *q = bdev_get_queue(bd); + return (int)blk_queue_discard(q); + }" + ;; + + "2") + + add_function " + static inline int cas_has_discard_support(struct block_device *bd) + { + return !!bdev_max_discard_sectors(bd); + }" + ;; + + *) + exit 1 + esac +} + +conf_run $@ diff --git a/configure.d/1_alloc_disk.conf b/configure.d/2_alloc_disk.conf similarity index 97% rename from configure.d/1_alloc_disk.conf rename to configure.d/2_alloc_disk.conf index 6ec8d95..c978178 100644 --- a/configure.d/1_alloc_disk.conf +++ b/configure.d/2_alloc_disk.conf @@ -36,7 +36,7 @@ apply() { add_function " static inline void cas_cleanup_mq_disk(struct cas_exp_obj *exp_obj) { - blk_cleanup_disk(exp_obj->gd); + cas_cleanup_disk(exp_obj->gd); }" ;; diff --git a/configure.d/2_set_discard_flag.conf b/configure.d/2_set_discard_flag.conf new file mode 100644 index 0000000..a1792f9 --- /dev/null +++ b/configure.d/2_set_discard_flag.conf @@ -0,0 +1,45 @@ +#!/bin/bash +# +# Copyright(c) 2012-2022 Intel Corporation +# 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 "QUEUE_FLAG_DISCARD;" "linux/blk-mq.h" + then + echo $cur_name 1 >> $config_file_path + else + echo $cur_name 2 >> $config_file_path + fi +} + +apply() { + case "$1" in + "1") + add_function " + static inline void cas_set_discard_flag(struct request_queue *q) + { + CAS_QUEUE_FLAG_SET(QUEUE_FLAG_DISCARD, q); + }" + ;; + + "2") + + add_function " + static inline void cas_set_discard_flag(struct request_queue *q) + { + (void)q; + }" + ;; + + *) + exit 1 + esac +} + +conf_run $@ diff --git a/modules/cas_cache/exp_obj.c b/modules/cas_cache/exp_obj.c index c259430..7d08556 100644 --- a/modules/cas_cache/exp_obj.c +++ b/modules/cas_cache/exp_obj.c @@ -535,7 +535,7 @@ int cas_exp_obj_destroy(struct cas_disk *dsk) del_gendisk(exp_obj->gd); if (exp_obj->queue) - blk_cleanup_queue(exp_obj->queue); + cas_cleanup_queue(exp_obj->queue); blk_mq_free_tag_set(&exp_obj->tag_set); diff --git a/modules/cas_cache/volume/vol_block_dev_bottom.c b/modules/cas_cache/volume/vol_block_dev_bottom.c index de2c560..e513335 100644 --- a/modules/cas_cache/volume/vol_block_dev_bottom.c +++ b/modules/cas_cache/volume/vol_block_dev_bottom.c @@ -218,7 +218,7 @@ void block_dev_submit_discard(struct ocf_io *io) goto out; } - if (!blk_queue_discard(q)) { + if (!cas_has_discard_support(bd)) { /* Discard is not supported by bottom device, send completion * to caller */ diff --git a/modules/cas_cache/volume/vol_block_dev_top.c b/modules/cas_cache/volume/vol_block_dev_top.c index 84f9103..3444103 100644 --- a/modules/cas_cache/volume/vol_block_dev_top.c +++ b/modules/cas_cache/volume/vol_block_dev_top.c @@ -64,10 +64,10 @@ static void blkdev_set_discard_properties(ocf_cache_t cache, core_q = bdev_get_queue(core_bd); cache_q = bdev_get_queue(cache_bd); - CAS_QUEUE_FLAG_SET(QUEUE_FLAG_DISCARD, exp_q); + cas_set_discard_flag(exp_q); CAS_SET_DISCARD_ZEROES_DATA(exp_q->limits, 0); - if (core_q && blk_queue_discard(core_q)) { + if (core_q && cas_has_discard_support(core_bd)) { blk_queue_max_discard_sectors(exp_q, core_q->limits.max_discard_sectors); exp_q->limits.discard_alignment = bdev_discard_alignment(core_bd);