Commit 9f3dbcb5 authored by Arnd Bergmann's avatar Arnd Bergmann Committed by Martin K. Petersen

scsi: csiostor: Avoid function pointer casts

csiostor uses function pointer casts to keep the csio_ln_ev state machine
hidden, but this causes warnings about control flow integrity (KCFI)
violations in clang-16 and higher:

drivers/scsi/csiostor/csio_lnode.c:1098:33: error: cast from 'void (*)(struct csio_lnode *, enum csio_ln_ev)' to 'csio_sm_state_t' (aka 'void (*)(void *, unsigned int)') converts to incompatible function type [-Werror,-Wcast-function-type-strict]
 1098 |         return (csio_get_state(ln) == ((csio_sm_state_t)csio_lns_ready));
      |                                        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
drivers/scsi/csiostor/csio_lnode.c:1369:29: error: cast from 'void (*)(struct csio_lnode *, enum csio_ln_ev)' to 'csio_sm_state_t' (aka 'void (*)(void *, unsigned int)') converts to incompatible function type [-Werror,-Wcast-function-type-strict]
 1369 |         if (csio_get_state(ln) == ((csio_sm_state_t)csio_lns_uninit)) {
      |                                    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
drivers/scsi/csiostor/csio_lnode.c:1373:29: error: cast from 'void (*)(struct csio_lnode *, enum csio_ln_ev)' to 'csio_sm_state_t' (aka 'void (*)(void *, unsigned int)') converts to incompatible function type [-Werror,-Wcast-function-type-strict]
 1373 |         if (csio_get_state(ln) == ((csio_sm_state_t)csio_lns_ready)) {
      |                                    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
drivers/scsi/csiostor/csio_lnode.c:1377:29: error: cast from 'void (*)(struct csio_lnode *, enum csio_ln_ev)' to 'csio_sm_state_t' (aka 'void (*)(void *, unsigned int)') converts to incompatible function type [-Werror,-Wcast-function-type-strict]
 1377 |         if (csio_get_state(ln) == ((csio_sm_state_t)csio_lns_offline)) {
      |                                    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Move the enum into a shared header so the correct types can be used without
the need for casts.

Fixes: a3667aae ("[SCSI] csiostor: Chelsio FCoE offload driver")
Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
Link: https://lore.kernel.org/r/20240213100518.457623-1-arnd@kernel.orgSigned-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent b628db42
...@@ -73,7 +73,21 @@ csio_list_deleted(struct list_head *list) ...@@ -73,7 +73,21 @@ csio_list_deleted(struct list_head *list)
#define csio_list_prev(elem) (((struct list_head *)(elem))->prev) #define csio_list_prev(elem) (((struct list_head *)(elem))->prev)
/* State machine */ /* State machine */
typedef void (*csio_sm_state_t)(void *, uint32_t); struct csio_lnode;
/* State machine evets */
enum csio_ln_ev {
CSIO_LNE_NONE = (uint32_t)0,
CSIO_LNE_LINKUP,
CSIO_LNE_FAB_INIT_DONE,
CSIO_LNE_LINK_DOWN,
CSIO_LNE_DOWN_LINK,
CSIO_LNE_LOGO,
CSIO_LNE_CLOSE,
CSIO_LNE_MAX_EVENT,
};
typedef void (*csio_sm_state_t)(struct csio_lnode *ln, enum csio_ln_ev evt);
struct csio_sm { struct csio_sm {
struct list_head sm_list; struct list_head sm_list;
...@@ -83,7 +97,7 @@ struct csio_sm { ...@@ -83,7 +97,7 @@ struct csio_sm {
static inline void static inline void
csio_set_state(void *smp, void *state) csio_set_state(void *smp, void *state)
{ {
((struct csio_sm *)smp)->sm_state = (csio_sm_state_t)state; ((struct csio_sm *)smp)->sm_state = state;
} }
static inline void static inline void
......
...@@ -1095,7 +1095,7 @@ csio_handle_link_down(struct csio_hw *hw, uint8_t portid, uint32_t fcfi, ...@@ -1095,7 +1095,7 @@ csio_handle_link_down(struct csio_hw *hw, uint8_t portid, uint32_t fcfi,
int int
csio_is_lnode_ready(struct csio_lnode *ln) csio_is_lnode_ready(struct csio_lnode *ln)
{ {
return (csio_get_state(ln) == ((csio_sm_state_t)csio_lns_ready)); return (csio_get_state(ln) == csio_lns_ready);
} }
/*****************************************************************************/ /*****************************************************************************/
...@@ -1366,15 +1366,15 @@ csio_free_fcfinfo(struct kref *kref) ...@@ -1366,15 +1366,15 @@ csio_free_fcfinfo(struct kref *kref)
void void
csio_lnode_state_to_str(struct csio_lnode *ln, int8_t *str) csio_lnode_state_to_str(struct csio_lnode *ln, int8_t *str)
{ {
if (csio_get_state(ln) == ((csio_sm_state_t)csio_lns_uninit)) { if (csio_get_state(ln) == csio_lns_uninit) {
strcpy(str, "UNINIT"); strcpy(str, "UNINIT");
return; return;
} }
if (csio_get_state(ln) == ((csio_sm_state_t)csio_lns_ready)) { if (csio_get_state(ln) == csio_lns_ready) {
strcpy(str, "READY"); strcpy(str, "READY");
return; return;
} }
if (csio_get_state(ln) == ((csio_sm_state_t)csio_lns_offline)) { if (csio_get_state(ln) == csio_lns_offline) {
strcpy(str, "OFFLINE"); strcpy(str, "OFFLINE");
return; return;
} }
......
...@@ -53,19 +53,6 @@ ...@@ -53,19 +53,6 @@
extern int csio_fcoe_rnodes; extern int csio_fcoe_rnodes;
extern int csio_fdmi_enable; extern int csio_fdmi_enable;
/* State machine evets */
enum csio_ln_ev {
CSIO_LNE_NONE = (uint32_t)0,
CSIO_LNE_LINKUP,
CSIO_LNE_FAB_INIT_DONE,
CSIO_LNE_LINK_DOWN,
CSIO_LNE_DOWN_LINK,
CSIO_LNE_LOGO,
CSIO_LNE_CLOSE,
CSIO_LNE_MAX_EVENT,
};
struct csio_fcf_info { struct csio_fcf_info {
struct list_head list; struct list_head list;
uint8_t priority; uint8_t priority;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment