summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJustin Tee <justin.tee@broadcom.com>2025-09-15 11:08:07 -0700
committerMartin K. Petersen <martin.petersen@oracle.com>2025-09-16 22:20:00 -0400
commit5d7ef44d8ae3b94565e8212d68c06bcee6f6ef90 (patch)
treeb02812602fb9498b65c2e7462b3ea60088901cd3
parent06d3c77c520b8c3ddcfd11c75f92f91213f7078a (diff)
scsi: lpfc: Use switch case statements in DIF debugfs handlers
With the introduction of aux numbers for debugfs entries, there's no need to use the if-else-if clause based on debugfs entry pointers. Update both the lpfc_debugfs_dif_err_read and lpfc_debugfs_dif_err_write routines to use switch case based on aux instead. Reported-by: Al Viro <viro@zeniv.linux.org.uk> Closes: https://lore.kernel.org/linux-fsdevel/20250702212917.GK3406663@ZenIV/ Signed-off-by: Justin Tee <justin.tee@broadcom.com> Message-ID: <20250915180811.137530-11-justintee8345@gmail.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
-rw-r--r--drivers/scsi/lpfc/lpfc_debugfs.c140
-rw-r--r--drivers/scsi/lpfc/lpfc_hw.h1
2 files changed, 83 insertions, 58 deletions
diff --git a/drivers/scsi/lpfc/lpfc_debugfs.c b/drivers/scsi/lpfc/lpfc_debugfs.c
index 7c4d7bb3a56f..691314c68b59 100644
--- a/drivers/scsi/lpfc/lpfc_debugfs.c
+++ b/drivers/scsi/lpfc/lpfc_debugfs.c
@@ -2373,93 +2373,117 @@ out:
static ssize_t
lpfc_debugfs_dif_err_read(struct file *file, char __user *buf,
- size_t nbytes, loff_t *ppos)
+ size_t nbytes, loff_t *ppos)
{
struct lpfc_hba *phba = file->private_data;
int kind = debugfs_get_aux_num(file);
- char cbuf[32];
- uint64_t tmp = 0;
+ char cbuf[32] = {0};
int cnt = 0;
- if (kind == writeGuard)
- cnt = scnprintf(cbuf, 32, "%u\n", phba->lpfc_injerr_wgrd_cnt);
- else if (kind == writeApp)
- cnt = scnprintf(cbuf, 32, "%u\n", phba->lpfc_injerr_wapp_cnt);
- else if (kind == writeRef)
- cnt = scnprintf(cbuf, 32, "%u\n", phba->lpfc_injerr_wref_cnt);
- else if (kind == readGuard)
- cnt = scnprintf(cbuf, 32, "%u\n", phba->lpfc_injerr_rgrd_cnt);
- else if (kind == readApp)
- cnt = scnprintf(cbuf, 32, "%u\n", phba->lpfc_injerr_rapp_cnt);
- else if (kind == readRef)
- cnt = scnprintf(cbuf, 32, "%u\n", phba->lpfc_injerr_rref_cnt);
- else if (kind == InjErrNPortID)
- cnt = scnprintf(cbuf, 32, "0x%06x\n",
+ switch (kind) {
+ case writeGuard:
+ cnt = scnprintf(cbuf, sizeof(cbuf), "%u\n",
+ phba->lpfc_injerr_wgrd_cnt);
+ break;
+ case writeApp:
+ cnt = scnprintf(cbuf, sizeof(cbuf), "%u\n",
+ phba->lpfc_injerr_wapp_cnt);
+ break;
+ case writeRef:
+ cnt = scnprintf(cbuf, sizeof(cbuf), "%u\n",
+ phba->lpfc_injerr_wref_cnt);
+ break;
+ case readGuard:
+ cnt = scnprintf(cbuf, sizeof(cbuf), "%u\n",
+ phba->lpfc_injerr_rgrd_cnt);
+ break;
+ case readApp:
+ cnt = scnprintf(cbuf, sizeof(cbuf), "%u\n",
+ phba->lpfc_injerr_rapp_cnt);
+ break;
+ case readRef:
+ cnt = scnprintf(cbuf, sizeof(cbuf), "%u\n",
+ phba->lpfc_injerr_rref_cnt);
+ break;
+ case InjErrNPortID:
+ cnt = scnprintf(cbuf, sizeof(cbuf), "0x%06x\n",
phba->lpfc_injerr_nportid);
- else if (kind == InjErrWWPN) {
- memcpy(&tmp, &phba->lpfc_injerr_wwpn, sizeof(struct lpfc_name));
- tmp = cpu_to_be64(tmp);
- cnt = scnprintf(cbuf, 32, "0x%016llx\n", tmp);
- } else if (kind == InjErrLBA) {
- if (phba->lpfc_injerr_lba == (sector_t)(-1))
- cnt = scnprintf(cbuf, 32, "off\n");
+ break;
+ case InjErrWWPN:
+ cnt = scnprintf(cbuf, sizeof(cbuf), "0x%016llx\n",
+ be64_to_cpu(phba->lpfc_injerr_wwpn.u.wwn_be));
+ break;
+ case InjErrLBA:
+ if (phba->lpfc_injerr_lba == LPFC_INJERR_LBA_OFF)
+ cnt = scnprintf(cbuf, sizeof(cbuf), "off\n");
else
- cnt = scnprintf(cbuf, 32, "0x%llx\n",
- (uint64_t) phba->lpfc_injerr_lba);
- } else
- lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
- "0547 Unknown debugfs error injection entry\n");
+ cnt = scnprintf(cbuf, sizeof(cbuf), "0x%llx\n",
+ (uint64_t)phba->lpfc_injerr_lba);
+ break;
+ default:
+ lpfc_log_msg(phba, KERN_WARNING, LOG_INIT,
+ "0547 Unknown debugfs error injection entry\n");
+ break;
+ }
return simple_read_from_buffer(buf, nbytes, ppos, &cbuf, cnt);
}
static ssize_t
lpfc_debugfs_dif_err_write(struct file *file, const char __user *buf,
- size_t nbytes, loff_t *ppos)
+ size_t nbytes, loff_t *ppos)
{
struct lpfc_hba *phba = file->private_data;
int kind = debugfs_get_aux_num(file);
- char dstbuf[33];
- uint64_t tmp = 0;
- int size;
+ char dstbuf[33] = {0};
+ unsigned long long tmp;
+ unsigned long size;
- memset(dstbuf, 0, 33);
- size = (nbytes < 32) ? nbytes : 32;
+ size = (nbytes < (sizeof(dstbuf) - 1)) ? nbytes : (sizeof(dstbuf) - 1);
if (copy_from_user(dstbuf, buf, size))
return -EFAULT;
- if (kind == InjErrLBA) {
- if ((dstbuf[0] == 'o') && (dstbuf[1] == 'f') &&
- (dstbuf[2] == 'f'))
- tmp = (uint64_t)(-1);
+ if (kstrtoull(dstbuf, 0, &tmp)) {
+ if (kind != InjErrLBA || !strstr(dstbuf, "off"))
+ return -EINVAL;
}
- if ((tmp == 0) && (kstrtoull(dstbuf, 0, &tmp)))
- return -EINVAL;
-
- if (kind == writeGuard)
+ switch (kind) {
+ case writeGuard:
phba->lpfc_injerr_wgrd_cnt = (uint32_t)tmp;
- else if (kind == writeApp)
+ break;
+ case writeApp:
phba->lpfc_injerr_wapp_cnt = (uint32_t)tmp;
- else if (kind == writeRef)
+ break;
+ case writeRef:
phba->lpfc_injerr_wref_cnt = (uint32_t)tmp;
- else if (kind == readGuard)
+ break;
+ case readGuard:
phba->lpfc_injerr_rgrd_cnt = (uint32_t)tmp;
- else if (kind == readApp)
+ break;
+ case readApp:
phba->lpfc_injerr_rapp_cnt = (uint32_t)tmp;
- else if (kind == readRef)
+ break;
+ case readRef:
phba->lpfc_injerr_rref_cnt = (uint32_t)tmp;
- else if (kind == InjErrLBA)
- phba->lpfc_injerr_lba = (sector_t)tmp;
- else if (kind == InjErrNPortID)
+ break;
+ case InjErrLBA:
+ if (strstr(dstbuf, "off"))
+ phba->lpfc_injerr_lba = LPFC_INJERR_LBA_OFF;
+ else
+ phba->lpfc_injerr_lba = (sector_t)tmp;
+ break;
+ case InjErrNPortID:
phba->lpfc_injerr_nportid = (uint32_t)(tmp & Mask_DID);
- else if (kind == InjErrWWPN) {
- tmp = cpu_to_be64(tmp);
- memcpy(&phba->lpfc_injerr_wwpn, &tmp, sizeof(struct lpfc_name));
- } else
- lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
- "0548 Unknown debugfs error injection entry\n");
-
+ break;
+ case InjErrWWPN:
+ phba->lpfc_injerr_wwpn.u.wwn_be = cpu_to_be64(tmp);
+ break;
+ default:
+ lpfc_log_msg(phba, KERN_WARNING, LOG_INIT,
+ "0548 Unknown debugfs error injection entry\n");
+ break;
+ }
return nbytes;
}
diff --git a/drivers/scsi/lpfc/lpfc_hw.h b/drivers/scsi/lpfc/lpfc_hw.h
index 32298285ea5e..b287d39ad033 100644
--- a/drivers/scsi/lpfc/lpfc_hw.h
+++ b/drivers/scsi/lpfc/lpfc_hw.h
@@ -366,6 +366,7 @@ struct lpfc_name {
} s;
uint8_t wwn[8];
uint64_t name __packed __aligned(4);
+ __be64 wwn_be __packed __aligned(4);
} u;
};