Add support for Linux kernel up to 6.8
Signed-off-by: Robert Baldyga <robert.baldyga@huawei.com>
This commit is contained in:
parent
a202d8c9f5
commit
b9aa65f254
@ -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 $@
|
53
configure.d/1_bdev_open_by_path.conf
Normal file
53
configure.d/1_bdev_open_by_path.conf
Normal file
@ -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 $@
|
@ -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
|
35
configure.d/1_class_create.conf
Normal file
35
configure.d/1_class_create.conf
Normal file
@ -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 $@
|
@ -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
|
||||
|
@ -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 ]
|
||||
|
@ -1,5 +1,6 @@
|
||||
/*
|
||||
* Copyright(c) 2012-2021 Intel Corporation
|
||||
* Copyright(c) 2024 Huawei Technologies
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
#include <linux/cdev.h>
|
||||
@ -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);
|
||||
|
@ -14,17 +14,16 @@
|
||||
|
||||
#define CAS_DISK_OPEN_MODE (CAS_BLK_MODE_READ | CAS_BLK_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_BLK_MODE mode, void *holder)
|
||||
{
|
||||
return cas_blkdev_get_by_path(path, mode | CAS_BLK_MODE_EXCL,
|
||||
holder);
|
||||
return cas_bdev_open_by_path(path, mode | CAS_BLK_MODE_EXCL, holder);
|
||||
}
|
||||
|
||||
static inline void close_bdev_exclusive(struct block_device *bdev,
|
||||
static inline void close_bdev_exclusive(cas_bdev_handle_t handle,
|
||||
CAS_BLK_MODE mode)
|
||||
{
|
||||
cas_blkdev_put(bdev, mode | CAS_BLK_MODE_EXCL, NULL);
|
||||
cas_bdev_release(handle, mode | CAS_BLK_MODE_EXCL, NULL);
|
||||
}
|
||||
|
||||
int __init cas_init_disks(void)
|
||||
@ -69,10 +68,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 +90,11 @@ error_kmem:
|
||||
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 +103,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;
|
||||
}
|
||||
|
@ -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;
|
||||
};
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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_BLK_MODE_EXCL | CAS_BLK_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,8 @@ 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_BLK_MODE_EXCL | CAS_BLK_MODE_READ), holder);
|
||||
cas_bdev_release(bdev_handle,
|
||||
(CAS_BLK_MODE_EXCL | CAS_BLK_MODE_READ), holder);
|
||||
return result;
|
||||
}
|
||||
|
||||
@ -2135,18 +2138,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_BLK_MODE_EXCL | CAS_BLK_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 +2169,8 @@ static int _cache_mngt_probe_metadata(char *cache_path_name,
|
||||
|
||||
cas_blk_close_volume(volume);
|
||||
out_bdev:
|
||||
cas_blkdev_put(bdev, (CAS_BLK_MODE_EXCL | CAS_BLK_MODE_READ), holder);
|
||||
cas_bdev_release(bdev_handle,
|
||||
(CAS_BLK_MODE_EXCL | CAS_BLK_MODE_READ), holder);
|
||||
return result;
|
||||
}
|
||||
|
||||
@ -2227,22 +2233,25 @@ 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(cfg->volume);
|
||||
|
||||
bdev = cas_blkdev_get_by_path(uuid->data,
|
||||
bdev_handle = cas_bdev_open_by_path(uuid->data,
|
||||
(CAS_BLK_MODE_EXCL | CAS_BLK_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_BLK_MODE_EXCL | CAS_BLK_MODE_READ), holder);
|
||||
cas_bdev_release(bdev_handle,
|
||||
(CAS_BLK_MODE_EXCL | CAS_BLK_MODE_READ), holder);
|
||||
|
||||
if (!is_part && part_count > 1 && !force)
|
||||
return -KCAS_ERR_CONTAINS_PART;
|
||||
|
Loading…
Reference in New Issue
Block a user