git: 9d899bbcb788 - main - cam: Small reorg of ata xpt async code
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Mon, 25 Apr 2022 18:54:54 UTC
The branch main has been updated by imp:
URL: https://cgit.FreeBSD.org/src/commit/?id=9d899bbcb78830cee527818813640e2ce1324ff4
commit 9d899bbcb78830cee527818813640e2ce1324ff4
Author: Warner Losh <imp@FreeBSD.org>
AuthorDate: 2022-04-25 18:54:26 +0000
Commit: Warner Losh <imp@FreeBSD.org>
CommitDate: 2022-04-25 18:55:04 +0000
cam: Small reorg of ata xpt async code
Use a switch rather than a nested if to simplify the async event
processing code. No functional changes intended.
Sponsored by: Netflix
Reviewed by: mav
Differential Revision: https://reviews.freebsd.org/D35038
---
sys/cam/ata/ata_xpt.c | 72 ++++++++++++++++++++++++++-------------------------
1 file changed, 37 insertions(+), 35 deletions(-)
diff --git a/sys/cam/ata/ata_xpt.c b/sys/cam/ata/ata_xpt.c
index 5d47f27e7779..2b299412b48e 100644
--- a/sys/cam/ata/ata_xpt.c
+++ b/sys/cam/ata/ata_xpt.c
@@ -2039,52 +2039,46 @@ static void
ata_dev_async(u_int32_t async_code, struct cam_eb *bus, struct cam_et *target,
struct cam_ed *device, void *async_arg)
{
- cam_status status;
- struct cam_path newpath;
-
/*
* We only need to handle events for real devices.
*/
- if (target->target_id == CAM_TARGET_WILDCARD
- || device->lun_id == CAM_LUN_WILDCARD)
+ if (target->target_id == CAM_TARGET_WILDCARD ||
+ device->lun_id == CAM_LUN_WILDCARD)
return;
- /*
- * We need our own path with wildcards expanded to
- * handle certain types of events.
- */
- if ((async_code == AC_SENT_BDR)
- || (async_code == AC_BUS_RESET)
- || (async_code == AC_INQ_CHANGED))
+ switch (async_code) {
+ case AC_SENT_BDR:
+ case AC_BUS_RESET:
+ case AC_INQ_CHANGED: {
+ cam_status status;
+ struct cam_path newpath;
+ cam_flags flags;
+
+ /*
+ * We need our own path with wildcards expanded to handle these
+ * events.
+ */
status = xpt_compile_path(&newpath, NULL,
bus->path_id,
target->target_id,
device->lun_id);
- else
- status = CAM_REQ_CMP_ERR;
+ if (status != CAM_REQ_CMP)
+ break; /* fail safe and just drop it */
- if (status == CAM_REQ_CMP) {
- if (async_code == AC_INQ_CHANGED) {
- /*
- * We've sent a start unit command, or
- * something similar to a device that
- * may have caused its inquiry data to
- * change. So we re-scan the device to
- * refresh the inquiry data for it.
- */
- ata_scan_lun(newpath.periph, &newpath,
- CAM_EXPECT_INQ_CHANGE, NULL);
- } else {
- /* We need to reinitialize device after reset. */
- ata_scan_lun(newpath.periph, &newpath,
- 0, NULL);
- }
+ /*
+ * For AC_INQ_CHANGED, we've sent a start unit command, or
+ * something similar to a device that may have caused its
+ * inquiry data to change. So we re-scan the device to refresh
+ * the inquiry data for it, allowing changes. Otherwise we rescan
+ * without allowing changes to respond to the reset, not allowing
+ * changes.
+ */
+ flags = async_code == AC_INQ_CHANGED ? CAM_EXPECT_INQ_CHANGE : 0;
+ ata_scan_lun(newpath.periph, &newpath, flags, NULL);
xpt_release_path(&newpath);
- } else if (async_code == AC_LOST_DEVICE &&
- (device->flags & CAM_DEV_UNCONFIGURED) == 0) {
- device->flags |= CAM_DEV_UNCONFIGURED;
- xpt_release_device(device);
- } else if (async_code == AC_TRANSFER_NEG) {
+ break;
+ }
+ case AC_TRANSFER_NEG: {
struct ccb_trans_settings *settings;
struct cam_path path;
@@ -2094,6 +2088,14 @@ ata_dev_async(u_int32_t async_code, struct cam_eb *bus, struct cam_et *target,
ata_set_transfer_settings(settings, &path,
/*async_update*/TRUE);
xpt_release_path(&path);
+ break;
+ }
+ case AC_LOST_DEVICE:
+ if ((device->flags & CAM_DEV_UNCONFIGURED) == 0) {
+ device->flags |= CAM_DEV_UNCONFIGURED;
+ xpt_release_device(device);
+ }
+ break;
}
}