| From 5f44a507107fe22d88827b892ac598f1e2d0894c Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 13 Feb 2024 11:05:00 +0100 |
| Subject: scsi: csiostor: Avoid function pointer casts |
| |
| From: Arnd Bergmann <arnd@arndb.de> |
| |
| [ Upstream commit 9f3dbcb5632d6876226031d552ef6163bb3ad215 ] |
| |
| 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: a3667aaed569 ("[SCSI] csiostor: Chelsio FCoE offload driver") |
| Signed-off-by: Arnd Bergmann <arnd@arndb.de> |
| Link: https://lore.kernel.org/r/20240213100518.457623-1-arnd@kernel.org |
| Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/scsi/csiostor/csio_defs.h | 18 ++++++++++++++++-- |
| drivers/scsi/csiostor/csio_lnode.c | 8 ++++---- |
| drivers/scsi/csiostor/csio_lnode.h | 13 ------------- |
| 3 files changed, 20 insertions(+), 19 deletions(-) |
| |
| diff --git a/drivers/scsi/csiostor/csio_defs.h b/drivers/scsi/csiostor/csio_defs.h |
| index c38017b4af982..e50e93e7fe5a1 100644 |
| --- a/drivers/scsi/csiostor/csio_defs.h |
| +++ b/drivers/scsi/csiostor/csio_defs.h |
| @@ -73,7 +73,21 @@ csio_list_deleted(struct list_head *list) |
| #define csio_list_prev(elem) (((struct list_head *)(elem))->prev) |
| |
| /* 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 list_head sm_list; |
| @@ -83,7 +97,7 @@ struct csio_sm { |
| static inline void |
| 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 |
| diff --git a/drivers/scsi/csiostor/csio_lnode.c b/drivers/scsi/csiostor/csio_lnode.c |
| index d5ac938970232..5b3ffefae476d 100644 |
| --- a/drivers/scsi/csiostor/csio_lnode.c |
| +++ b/drivers/scsi/csiostor/csio_lnode.c |
| @@ -1095,7 +1095,7 @@ csio_handle_link_down(struct csio_hw *hw, uint8_t portid, uint32_t fcfi, |
| int |
| 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) |
| void |
| 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"); |
| return; |
| } |
| - if (csio_get_state(ln) == ((csio_sm_state_t)csio_lns_ready)) { |
| + if (csio_get_state(ln) == csio_lns_ready) { |
| strcpy(str, "READY"); |
| return; |
| } |
| - if (csio_get_state(ln) == ((csio_sm_state_t)csio_lns_offline)) { |
| + if (csio_get_state(ln) == csio_lns_offline) { |
| strcpy(str, "OFFLINE"); |
| return; |
| } |
| diff --git a/drivers/scsi/csiostor/csio_lnode.h b/drivers/scsi/csiostor/csio_lnode.h |
| index 372a67d122d38..607698a0f0631 100644 |
| --- a/drivers/scsi/csiostor/csio_lnode.h |
| +++ b/drivers/scsi/csiostor/csio_lnode.h |
| @@ -53,19 +53,6 @@ |
| extern int csio_fcoe_rnodes; |
| 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 list_head list; |
| uint8_t priority; |
| -- |
| 2.43.0 |
| |