From 3f190fe1703fe5d15f5e82cee2f7e6176bf25529 Mon Sep 17 00:00:00 2001 From: Seth Howell Date: Thu, 16 Jul 2020 17:36:52 -0700 Subject: [PATCH] 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 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 Reviewed-by: Reviewed-by: Aleksey Marchuk Reviewed-by: Paul Luse Reviewed-by: Ben Walker Reviewed-by: Shuhei Matsumoto Reviewed-by: Michael Haeuptle --- lib/nvmf/nvmf_internal.h | 1 + lib/nvmf/subsystem.c | 43 +++++++++++++++++++++++++--------------- 2 files changed, 28 insertions(+), 16 deletions(-) diff --git a/lib/nvmf/nvmf_internal.h b/lib/nvmf/nvmf_internal.h index f1fc55c98..73a07b6bf 100644 --- a/lib/nvmf/nvmf_internal.h +++ b/lib/nvmf/nvmf_internal.h @@ -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 { diff --git a/lib/nvmf/subsystem.c b/lib/nvmf/subsystem.c index 59f52a698..8be769a88 100644 --- a/lib/nvmf/subsystem.c +++ b/lib/nvmf/subsystem.c @@ -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; }