From 5ef09fb1a2c9ee7e78dbc0e74e723c667e087bcb Mon Sep 17 00:00:00 2001 From: Michal Mielewczyk Date: Fri, 6 Sep 2024 12:20:39 +0200 Subject: [PATCH 1/2] casadm: A generic mechanism to disable commands Signed-off-by: Michal Mielewczyk --- casadm/argp.c | 15 ++++++++++++++- casadm/argp.h | 4 +++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/casadm/argp.c b/casadm/argp.c index 9bacd5f73..1ad53f207 100644 --- a/casadm/argp.c +++ b/casadm/argp.c @@ -1,5 +1,6 @@ /* * Copyright(c) 2012-2021 Intel Corporation +* Copyright(c) 2024 Huawei Technologies * SPDX-License-Identifier: BSD-3-Clause */ @@ -26,6 +27,11 @@ static int is_command_hidden(const cli_command* commands, int cmd) return commands[cmd].flags & CLI_COMMAND_HIDDEN; } +static int is_command_blocked(const cli_command* commands, int cmd) +{ + return commands[cmd].flags & CLI_COMMAND_BLOCKED; +} + static void print_short_usage(const app *app_values) { cas_printf(LOG_INFO, "Usage: %s %s\n", app_values->name, app_values->info); @@ -313,8 +319,10 @@ void print_help(const app *app_values, const cli_command *commands) break; } - if (is_command_hidden(commands, i)) + if (is_command_hidden(commands, i) || + is_command_blocked(commands, i)) { continue; + } get_short_name_string(commands[i].short_name, short_name); @@ -614,6 +622,11 @@ int args_parse(app *app_values, cli_command *commands, int argc, const char **ar } } + if (is_command_blocked(commands, i)) { + cas_printf(LOG_ERR, "The command is not supported\n"); + return FAILURE; + } + configure_cli_commands(commands); if (argc >= 3 && get_help_position(argc, argv) != -1) { diff --git a/casadm/argp.h b/casadm/argp.h index b73fa3248..38280252b 100644 --- a/casadm/argp.h +++ b/casadm/argp.h @@ -1,5 +1,6 @@ /* * Copyright(c) 2012-2021 Intel Corporation +* Copyright(c) 2024 Huawei Technologies * SPDX-License-Identifier: BSD-3-Clause */ @@ -22,7 +23,8 @@ enum CLI_OPTION_FLAGS { enum CLI_COMMAND_FLAGS { CLI_SU_REQUIRED = 1 << 0, - CLI_COMMAND_HIDDEN = 1 << 1 + CLI_COMMAND_HIDDEN = 1 << 1, + CLI_COMMAND_BLOCKED = 1 << 2 }; #define ERROR -1 From 0f0ef79b89b4e39cb4d90f10f6d1e956e60d0e9b Mon Sep 17 00:00:00 2001 From: Michal Mielewczyk Date: Fri, 6 Sep 2024 12:21:34 +0200 Subject: [PATCH 2/2] Disable standby mode Signed-off-by: Michal Mielewczyk --- casadm/cas_main.c | 3 ++- modules/cas_cache/layer_cache_management.c | 18 +++++++++++++ modules/cas_cache/service_ui_ioctl.c | 5 ++++ test/functional/api/cas/cli_help_messages.py | 27 ++----------------- test/functional/tests/cli/test_cli_standby.py | 11 ++++++++ .../test_failover_multihost.py | 3 +++ .../test_fault_injection_standby.py | 3 +++ .../test_fault_injection_standby_core.py | 4 +++ ...t_standby_activate_different_cache_path.py | 2 ++ ...st_standby_activate_the_same_cache_path.py | 2 ++ .../initialize/test_startup_init_config.py | 3 +++ 11 files changed, 55 insertions(+), 26 deletions(-) diff --git a/casadm/cas_main.c b/casadm/cas_main.c index 8d5727bef..e6d656139 100644 --- a/casadm/cas_main.c +++ b/casadm/cas_main.c @@ -1,5 +1,6 @@ /* * Copyright(c) 2012-2022 Intel Corporation +* Copyright(c) 2024 Huawei Technologies * SPDX-License-Identifier: BSD-3-Clause */ @@ -2373,7 +2374,7 @@ static cli_command cas_commands[] = { .options = standby_params_options, .command_handle_opts = standby_handle_option, .handle = standby_handle, - .flags = CLI_SU_REQUIRED, + .flags = (CLI_COMMAND_BLOCKED | CLI_SU_REQUIRED), .help = standby_help, }, { diff --git a/modules/cas_cache/layer_cache_management.c b/modules/cas_cache/layer_cache_management.c index b4df56b8d..7028c2b6f 100644 --- a/modules/cas_cache/layer_cache_management.c +++ b/modules/cas_cache/layer_cache_management.c @@ -1882,6 +1882,15 @@ int cache_mngt_create_cache_cfg(struct ocf_mngt_cache_config *cfg, char cache_name[OCF_CACHE_NAME_SIZE]; uint16_t cache_id; + switch (cmd->init_cache) { + case CACHE_INIT_STANDBY_NEW: + case CACHE_INIT_STANDBY_LOAD: + printk(KERN_ERR "Standby mode is not supported!\n"); + return -ENOTSUP; + default: + break; + } + if (!cmd) return -OCF_ERR_INVAL; @@ -2453,6 +2462,15 @@ int cache_mngt_init_instance(struct ocf_mngt_cache_config *cfg, ocf_cache_mode_t cache_mode_meta; ocf_cache_line_size_t cache_line_size_meta; + switch (cmd->init_cache) { + case CACHE_INIT_STANDBY_NEW: + case CACHE_INIT_STANDBY_LOAD: + printk(KERN_ERR "Standby mode is not supported!\n"); + return -ENOTSUP; + default: + break; + } + if (!try_module_get(THIS_MODULE)) return -KCAS_ERR_SYSTEM; diff --git a/modules/cas_cache/service_ui_ioctl.c b/modules/cas_cache/service_ui_ioctl.c index f835bdb98..ae8fc7bd8 100644 --- a/modules/cas_cache/service_ui_ioctl.c +++ b/modules/cas_cache/service_ui_ioctl.c @@ -1,5 +1,6 @@ /* * Copyright(c) 2012-2022 Intel Corporation +* Copyright(c) 2024 Huawei Technologies * SPDX-License-Identifier: BSD-3-Clause */ @@ -381,6 +382,8 @@ long cas_service_ioctl_ctrl(struct file *filp, unsigned int cmd, case KCAS_IOCTL_STANDBY_DETACH: { struct kcas_standby_detach *cmd_info; + return -ENOTSUP; + GET_CMD_INFO(cmd_info, arg); retval = cache_mngt_standby_detach(cmd_info); @@ -391,6 +394,8 @@ long cas_service_ioctl_ctrl(struct file *filp, unsigned int cmd, struct kcas_standby_activate *cmd_info; struct ocf_mngt_cache_standby_activate_config cfg; + return -ENOTSUP; + GET_CMD_INFO(cmd_info, arg); retval = cache_mngt_create_cache_standby_activate_cfg(&cfg, diff --git a/test/functional/api/cas/cli_help_messages.py b/test/functional/api/cas/cli_help_messages.py index 943e8c42e..405faa68e 100644 --- a/test/functional/api/cas/cli_help_messages.py +++ b/test/functional/api/cas/cli_help_messages.py @@ -1,5 +1,6 @@ # # Copyright(c) 2020-2022 Intel Corporation +# Copyright(c) 2024 Huawei Technologies # SPDX-License-Identifier: BSD-3-Clause # @@ -23,7 +24,6 @@ r"-C --io-class Manage IO classes", r"-V --version Print CAS version", r"-H --help Print help", - r"--standby Manage failover standby", r"--zero-metadata Clear metadata from caching device", r"For detailed help on the above commands use --help after the command\.", r"e\.g\.", @@ -242,30 +242,7 @@ ] standby_help = [ - r"Usage: casadm --standby \{--init|--load|--detach|--activate\}", - r"Manage failover standby", - r"Initialize cache in standby mode:", - r"Usage: casadm --standby --init --cache-id \ --cache-line-size \ " - r"--cache-device \ \[option...\]", - r"Options that are valid with --init are:", - r"-i --cache-id \ Identifier of cache instance \<1-16384\>", - r"-x --cache-line-size \ Set cache line size in kibibytes: \{4,8,16,32,64\}" - r"\[KiB\] \(default: 4\)", - r"-d --cache-device \ Caching device to be used", - r"-f --force Force the initialization of cache instance", - r"Load cache in standby mode:", - r"Usage: casadm --standby --load --cache-device \", - r"Options that are valid with --load are:", - r"-d --cache-device \ Caching device to be used", - r"Detach cache device in standby mode:", - r"Usage: casadm --standby --detach --cache-id \", - r"Options that are valid with --detach are:", - r" -i --cache-id \ Identifier of cache instance \<1-16384\>", - r"Activate standby cache:", - r"Usage: casadm --standby --activate --cache-id \ --cache-device \", - r"Options that are valid with --activate are:", - r"-i --cache-id \ Identifier of cache instance \<1-16384\>", - r"-d --cache-device \ Caching device to be used" + r"The command is not supported" ] zero_metadata_help = [ diff --git a/test/functional/tests/cli/test_cli_standby.py b/test/functional/tests/cli/test_cli_standby.py index 71dc6ffcb..5d0bd3876 100644 --- a/test/functional/tests/cli/test_cli_standby.py +++ b/test/functional/tests/cli/test_cli_standby.py @@ -1,5 +1,6 @@ # # Copyright(c) 2019-2022 Intel Corporation +# Copyright(c) 2024 Huawei Technologies # SPDX-License-Identifier: BSD-3-Clause # @@ -37,6 +38,7 @@ @pytest.mark.CI +@pytest.mark.skip(reason="Standby mode is not supported") @pytest.mark.require_disk("cache", DiskTypeSet([DiskType.nand, DiskType.optane])) def test_standby_neg_cli_params(): """ @@ -106,6 +108,7 @@ def test_standby_neg_cli_params(): @pytest.mark.CI +@pytest.mark.skip(reason="Standby mode is not supported") @pytest.mark.require_disk("cache", DiskTypeSet([DiskType.nand, DiskType.optane])) def test_activate_neg_cli_params(): """ @@ -186,6 +189,7 @@ def test_activate_neg_cli_params(): @pytest.mark.CI +@pytest.mark.skip(reason="Standby mode is not supported") @pytest.mark.require_disk("cache", DiskTypeSet([DiskType.nand, DiskType.optane])) def test_standby_neg_cli_management(): """ @@ -262,6 +266,7 @@ def test_standby_neg_cli_management(): @pytest.mark.CI +@pytest.mark.skip(reason="Standby mode is not supported") @pytest.mark.require_disk("cache", DiskTypeSet([DiskType.nand, DiskType.optane])) def test_start_neg_cli_flags(): """ @@ -316,6 +321,7 @@ def test_start_neg_cli_flags(): @pytest.mark.CI +@pytest.mark.skip(reason="Standby mode is not supported") @pytest.mark.require_disk("cache", DiskTypeSet([DiskType.nand, DiskType.optane])) def test_activate_without_detach(): """ @@ -379,6 +385,7 @@ def test_activate_without_detach(): @pytest.mark.CI +@pytest.mark.skip(reason="Standby mode is not supported") @pytest.mark.require_disk("active_cache", DiskTypeSet([DiskType.nand, DiskType.optane])) @pytest.mark.require_disk("standby_cache", DiskTypeSet([DiskType.nand, DiskType.optane])) def test_activate_neg_cache_line_size(): @@ -470,6 +477,7 @@ def test_activate_neg_cache_line_size(): @pytest.mark.CI +@pytest.mark.skip(reason="Standby mode is not supported") @pytest.mark.require_disk("cache", DiskTypeSet([DiskType.nand, DiskType.optane])) @pytest.mark.require_disk("core", DiskTypeLowerThan("cache")) def test_standby_init_with_preexisting_metadata(): @@ -528,6 +536,7 @@ def test_standby_init_with_preexisting_metadata(): @pytest.mark.CI +@pytest.mark.skip(reason="Standby mode is not supported") @pytest.mark.require_disk("cache", DiskTypeSet([DiskType.nand, DiskType.optane])) @pytest.mark.require_disk("core", DiskTypeLowerThan("cache")) @pytest.mark.parametrizex("filesystem", Filesystem) @@ -579,6 +588,7 @@ def test_standby_init_with_preexisting_filesystem(filesystem): @pytest.mark.CI +@pytest.mark.skip(reason="Standby mode is not supported") @pytest.mark.require_disk("caches", DiskTypeSet([DiskType.nand, DiskType.optane])) @pytest.mark.require_disk("core", DiskTypeLowerThan("caches")) def test_standby_activate_with_corepool(): @@ -637,6 +647,7 @@ def test_standby_activate_with_corepool(): @pytest.mark.CI +@pytest.mark.skip(reason="Standby mode is not supported") @pytest.mark.require_disk("cache", DiskTypeSet([DiskType.optane, DiskType.nand])) @pytest.mark.parametrizex("cache_line_size", CacheLineSize) def test_standby_start_stop(cache_line_size): diff --git a/test/functional/tests/failover_standby/test_failover_multihost.py b/test/functional/tests/failover_standby/test_failover_multihost.py index fd01db53b..9973425d0 100644 --- a/test/functional/tests/failover_standby/test_failover_multihost.py +++ b/test/functional/tests/failover_standby/test_failover_multihost.py @@ -1,5 +1,6 @@ # # Copyright(c) 2022 Intel Corporation +# Copyright(c) 2024 Huawei Technologies # SPDX-License-Identifier: BSD-3-Clause # @@ -42,6 +43,7 @@ test_file_path = f"{mountpoint}/test_file" +@pytest.mark.skip(reason="Standby mode is not supported") @pytest.mark.require_disk("metadata_dev", DiskTypeSet([DiskType.nand])) @pytest.mark.require_disk("core_dev", DiskTypeSet([DiskType.hdd])) @pytest.mark.require_disk("raid_dev1", DiskTypeSet([DiskType.optane])) @@ -226,6 +228,7 @@ def test_functional_activate_twice_round_trip(filesystem): TestRun.LOGGER.end_group() +@pytest.mark.skip(reason="Standby mode is not supported") @pytest.mark.require_disk("metadata_dev", DiskTypeSet([DiskType.nand])) @pytest.mark.require_disk("core_dev", DiskTypeSet([DiskType.hdd])) @pytest.mark.require_disk("raid_dev1", DiskTypeSet([DiskType.optane])) diff --git a/test/functional/tests/fault_injection/test_fault_injection_standby.py b/test/functional/tests/fault_injection/test_fault_injection_standby.py index 53bf942d3..80d075365 100644 --- a/test/functional/tests/fault_injection/test_fault_injection_standby.py +++ b/test/functional/tests/fault_injection/test_fault_injection_standby.py @@ -1,5 +1,6 @@ # # Copyright(c) 2019-2022 Intel Corporation +# Copyright(c) 2024 Huawei Technologies # SPDX-License-Identifier: BSD-3-Clause # @@ -28,6 +29,7 @@ @pytest.mark.CI +@pytest.mark.skip(reason="Standby mode is not supported") @pytest.mark.require_disk("cache", DiskTypeSet([DiskType.nand, DiskType.optane])) @pytest.mark.require_disk("core", DiskTypeLowerThan("cache")) def test_activate_corrupted(): @@ -85,6 +87,7 @@ def test_activate_corrupted(): @pytest.mark.CI +@pytest.mark.skip(reason="Standby mode is not supported") @pytest.mark.require_disk("cache", DiskTypeSet([DiskType.nand, DiskType.optane])) @pytest.mark.require_disk("core", DiskTypeLowerThan("cache")) def test_load_corrupted(): diff --git a/test/functional/tests/fault_injection/test_fault_injection_standby_core.py b/test/functional/tests/fault_injection/test_fault_injection_standby_core.py index 514d0752c..3e3903bae 100644 --- a/test/functional/tests/fault_injection/test_fault_injection_standby_core.py +++ b/test/functional/tests/fault_injection/test_fault_injection_standby_core.py @@ -1,5 +1,6 @@ # # Copyright(c) 2019-2022 Intel Corporation +# Copyright(c) 2024 Huawei Technologies # SPDX-License-Identifier: BSD-3-Clause # @@ -27,6 +28,7 @@ @pytest.mark.CI +@pytest.mark.skip(reason="Standby mode is not supported") @pytest.mark.require_disk("cache", DiskTypeSet([DiskType.optane, DiskType.nand])) def test_activate_neg_cache_id(): """ @@ -98,6 +100,7 @@ def test_activate_neg_cache_id(): @pytest.mark.CI +@pytest.mark.skip(reason="Standby mode is not supported") @pytest.mark.require_disk("cache", DiskTypeSet([DiskType.optane, DiskType.nand])) @pytest.mark.require_disk("core", DiskTypeLowerThan("cache")) def test_activate_incomplete_cache(): @@ -215,6 +218,7 @@ def test_activate_incomplete_cache(): @pytest.mark.CI +@pytest.mark.skip(reason="Standby mode is not supported") @pytest.mark.require_disk("cache", DiskTypeSet([DiskType.optane, DiskType.nand])) @pytest.mark.require_disk("core", DiskTypeLowerThan("cache")) def test_activate_neg_core_size(): diff --git a/test/functional/tests/fault_injection/test_standby_activate_different_cache_path.py b/test/functional/tests/fault_injection/test_standby_activate_different_cache_path.py index ba3321758..5608c83e1 100644 --- a/test/functional/tests/fault_injection/test_standby_activate_different_cache_path.py +++ b/test/functional/tests/fault_injection/test_standby_activate_different_cache_path.py @@ -1,5 +1,6 @@ # # Copyright(c) 2022 Intel Corporation +# Copyright(c) 2024 Huawei Technologies # SPDX-License-Identifier: BSD-3-Clause # @@ -19,6 +20,7 @@ @pytest.mark.CI +@pytest.mark.skip(reason="Standby mode is not supported") @pytest.mark.require_disk("cache", DiskTypeSet([DiskType.nand, DiskType.optane])) @pytest.mark.require_disk("core", DiskTypeLowerThan("cache")) @pytest.mark.parametrizex("cache_line_size", CacheLineSize) diff --git a/test/functional/tests/fault_injection/test_standby_activate_the_same_cache_path.py b/test/functional/tests/fault_injection/test_standby_activate_the_same_cache_path.py index 35adad4f9..adb71a035 100644 --- a/test/functional/tests/fault_injection/test_standby_activate_the_same_cache_path.py +++ b/test/functional/tests/fault_injection/test_standby_activate_the_same_cache_path.py @@ -1,5 +1,6 @@ # # Copyright(c) 2022 Intel Corporation +# Copyright(c) 2024 Huawei Technologies # SPDX-License-Identifier: BSD-3-Clause # @@ -14,6 +15,7 @@ @pytest.mark.CI +@pytest.mark.skip(reason="Standby mode is not supported") @pytest.mark.require_disk("cache", DiskTypeSet([DiskType.nand, DiskType.optane])) @pytest.mark.require_disk("core", DiskTypeLowerThan("cache")) def test_standby_activate_the_same_cache_path(): diff --git a/test/functional/tests/initialize/test_startup_init_config.py b/test/functional/tests/initialize/test_startup_init_config.py index e92040fbb..0eebf34a3 100644 --- a/test/functional/tests/initialize/test_startup_init_config.py +++ b/test/functional/tests/initialize/test_startup_init_config.py @@ -1,5 +1,6 @@ # # Copyright(c) 2019-2022 Intel Corporation +# Copyright(c) 2024 Huawei Technologies # SPDX-License-Identifier: BSD-3-Clause # @@ -385,6 +386,7 @@ def test_cas_startup_negative_missing_cache(): @pytest.mark.os_dependent +@pytest.mark.skip(reason="Standby mode is not supported") @pytest.mark.require_disk("cache", DiskTypeSet([DiskType.optane, DiskType.nand])) @pytest.mark.require_disk("core", DiskTypeSet([DiskType.hdd])) @pytest.mark.require_plugin("power_control") @@ -490,6 +492,7 @@ def test_failover_config_startup(): @pytest.mark.os_dependent +@pytest.mark.skip(reason="Standby mode is not supported") @pytest.mark.require_disk("cache", DiskTypeSet([DiskType.optane, DiskType.nand])) def test_failover_config_startup_negative(): """