nvmf/subsystem: find intermediate state in helper function.

This will be used in another place later.

This patch is part of a series aimed at improving recovery
when we are fail to change the subsystem state.

Signed-off-by: Seth Howell <seth.howell@intel.com>
Change-Id: I24bfbeb3d006584003164540d6ede540dbcafa86
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/3392
Community-CI: Mellanox Build Bot
Community-CI: Broadcom CI
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: <dongx.yi@intel.com>
Reviewed-by: Aleksey Marchuk <alexeymar@mellanox.com>
Reviewed-by: Paul Luse <paul.e.luse@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: Michael Haeuptle <michaelhaeuptle@gmail.com>
This commit is contained in:
Seth Howell 2020-07-16 17:36:52 -07:00 committed by Tomasz Zawadzki
parent dca3fdc482
commit 3f190fe170
2 changed files with 28 additions and 16 deletions

View File

@ -57,6 +57,7 @@ enum spdk_nvmf_subsystem_state {
SPDK_NVMF_SUBSYSTEM_PAUSED,
SPDK_NVMF_SUBSYSTEM_RESUMING,
SPDK_NVMF_SUBSYSTEM_DEACTIVATING,
SPDK_NVMF_SUBSYSTEM_NUM_STATES,
};
struct spdk_nvmf_tgt {

View File

@ -370,6 +370,31 @@ spdk_nvmf_subsystem_destroy(struct spdk_nvmf_subsystem *subsystem)
free(subsystem);
}
/* we have to use the typedef in the function declaration to appease astyle. */
typedef enum spdk_nvmf_subsystem_state spdk_nvmf_subsystem_state_t;
static spdk_nvmf_subsystem_state_t
nvmf_subsystem_get_intermediate_state(enum spdk_nvmf_subsystem_state current_state,
enum spdk_nvmf_subsystem_state requested_state)
{
switch (requested_state) {
case SPDK_NVMF_SUBSYSTEM_INACTIVE:
return SPDK_NVMF_SUBSYSTEM_DEACTIVATING;
case SPDK_NVMF_SUBSYSTEM_ACTIVE:
if (current_state == SPDK_NVMF_SUBSYSTEM_PAUSED) {
return SPDK_NVMF_SUBSYSTEM_RESUMING;
} else {
return SPDK_NVMF_SUBSYSTEM_ACTIVATING;
}
case SPDK_NVMF_SUBSYSTEM_PAUSED:
return SPDK_NVMF_SUBSYSTEM_PAUSING;
default:
assert(false);
return SPDK_NVMF_SUBSYSTEM_NUM_STATES;
}
}
static int
nvmf_subsystem_set_state(struct spdk_nvmf_subsystem *subsystem,
enum spdk_nvmf_subsystem_state state)
@ -500,22 +525,8 @@ nvmf_subsystem_state_change(struct spdk_nvmf_subsystem *subsystem,
enum spdk_nvmf_subsystem_state intermediate_state;
int rc;
switch (requested_state) {
case SPDK_NVMF_SUBSYSTEM_INACTIVE:
intermediate_state = SPDK_NVMF_SUBSYSTEM_DEACTIVATING;
break;
case SPDK_NVMF_SUBSYSTEM_ACTIVE:
if (subsystem->state == SPDK_NVMF_SUBSYSTEM_PAUSED) {
intermediate_state = SPDK_NVMF_SUBSYSTEM_RESUMING;
} else {
intermediate_state = SPDK_NVMF_SUBSYSTEM_ACTIVATING;
}
break;
case SPDK_NVMF_SUBSYSTEM_PAUSED:
intermediate_state = SPDK_NVMF_SUBSYSTEM_PAUSING;
break;
default:
assert(false);
intermediate_state = nvmf_subsystem_get_intermediate_state(subsystem->state, requested_state);
if (intermediate_state == SPDK_NVMF_SUBSYSTEM_NUM_STATES) {
return -EINVAL;
}