From 2077be2b731a284ceebb8363eafd7f5ea88c669c Mon Sep 17 00:00:00 2001 From: Conrad Meyer Date: Thu, 9 Aug 2018 21:53:32 +0000 Subject: [PATCH] cam(4): Add an xpt-neutral flag indicating a valid panic CCB No functional change. Note that this change is careful to set the CCB header xflags after foo_fill_bar() routines, which generally zero existing flags. An earlier version of this patch mistakenly set the flag before the fill routines. Submitted by: Scott Ferris , jhibbits@ Reviewed by: bdrewery@, markj@, and non-committer FreeBSD contributor Anton Rang Sponsored by: Dell EMC Isilon --- sys/cam/ata/ata_da.c | 3 +++ sys/cam/cam_ccb.h | 3 ++- sys/cam/nvme/nvme_da.c | 2 ++ sys/cam/scsi/scsi_da.c | 2 ++ 4 files changed, 9 insertions(+), 1 deletion(-) diff --git a/sys/cam/ata/ata_da.c b/sys/cam/ata/ata_da.c index ac04b3d23076..e31e6d8b73ba 100644 --- a/sys/cam/ata/ata_da.c +++ b/sys/cam/ata/ata_da.c @@ -1081,6 +1081,7 @@ adadump(void *arg, void *virtual, vm_offset_t physical, off_t offset, size_t len (u_int8_t *) virtual, length, ada_default_timeout*1000); + ataio.ccb_h.xflags |= CAM_CCB_DUMP; if ((softc->flags & ADA_FLAG_CAN_48BIT) && (lba + count >= ATA_MAX_28BIT_LBA || count >= 256)) { @@ -1115,6 +1116,7 @@ adadump(void *arg, void *virtual, vm_offset_t physical, off_t offset, size_t len NULL, 0, 5*1000); + ataio.ccb_h.xflags |= CAM_CCB_DUMP; if (softc->flags & ADA_FLAG_CAN_48BIT) ata_48bit_cmd(&ataio, ATA_FLUSHCACHE48, 0, 0, 0); @@ -3499,6 +3501,7 @@ adaspindown(uint8_t cmd, int flags) NULL, 0, ada_default_timeout*1000); + local_ccb.ccb_h.xflags |= CAM_CCB_DUMP; ata_28bit_cmd(&local_ccb, cmd, 0, 0, 0); error = cam_periph_runccb((union ccb *)&local_ccb, adaerror, /*cam_flags*/0, /*sense_flags*/ SF_NO_RECOVERY | SF_NO_RETRY, diff --git a/sys/cam/cam_ccb.h b/sys/cam/cam_ccb.h index 7893b19290aa..131b5d564549 100644 --- a/sys/cam/cam_ccb.h +++ b/sys/cam/cam_ccb.h @@ -116,7 +116,8 @@ typedef enum { typedef enum { CAM_USER_DATA_ADDR = 0x00000002,/* Userspace data pointers */ CAM_SG_FORMAT_IOVEC = 0x00000004,/* iovec instead of busdma S/G*/ - CAM_UNMAPPED_BUF = 0x00000008 /* use unmapped I/O */ + CAM_UNMAPPED_BUF = 0x00000008,/* use unmapped I/O */ + CAM_CCB_DUMP = 0x00000010,/* polled ccb during dump */ } ccb_xflags; /* XPT Opcodes for xpt_action */ diff --git a/sys/cam/nvme/nvme_da.c b/sys/cam/nvme/nvme_da.c index f83a038506aa..a430798ae016 100644 --- a/sys/cam/nvme/nvme_da.c +++ b/sys/cam/nvme/nvme_da.c @@ -426,6 +426,7 @@ ndadump(void *arg, void *virtual, vm_offset_t physical, off_t offset, size_t len xpt_setup_ccb(&nvmeio.ccb_h, periph->path, CAM_PRIORITY_NORMAL); nvmeio.ccb_state = NDA_CCB_DUMP; nda_nvme_write(softc, &nvmeio, virtual, lba, length, count); + nvmeio.ccb_h.xflags |= CAM_CCB_DUMP; error = cam_periph_runccb((union ccb *)&nvmeio, cam_periph_error, 0, SF_NO_RECOVERY | SF_NO_RETRY, NULL); if (error != 0) @@ -439,6 +440,7 @@ ndadump(void *arg, void *virtual, vm_offset_t physical, off_t offset, size_t len nvmeio.ccb_state = NDA_CCB_DUMP; nda_nvme_flush(softc, &nvmeio); + nvmeio.ccb_h.xflags |= CAM_CCB_DUMP; error = cam_periph_runccb((union ccb *)&nvmeio, cam_periph_error, 0, SF_NO_RECOVERY | SF_NO_RETRY, NULL); if (error != 0) diff --git a/sys/cam/scsi/scsi_da.c b/sys/cam/scsi/scsi_da.c index 40f593f9b629..449ae0a3bdeb 100644 --- a/sys/cam/scsi/scsi_da.c +++ b/sys/cam/scsi/scsi_da.c @@ -1847,6 +1847,7 @@ dadump(void *arg, void *virtual, vm_offset_t physical, off_t offset, size_t leng /*dxfer_len*/length, /*sense_len*/SSD_FULL_SIZE, da_default_timeout * 1000); + csio.ccb_h.xflags |= CAM_CCB_DUMP; error = cam_periph_runccb((union ccb *)&csio, cam_periph_error, 0, SF_NO_RECOVERY | SF_NO_RETRY, NULL); if (error != 0) @@ -1869,6 +1870,7 @@ dadump(void *arg, void *virtual, vm_offset_t physical, off_t offset, size_t leng /*lb_count*/0, SSD_FULL_SIZE, 5 * 1000); + csio.ccb_h.xflags |= CAM_CCB_DUMP; error = cam_periph_runccb((union ccb *)&csio, cam_periph_error, 0, SF_NO_RECOVERY | SF_NO_RETRY, NULL); if (error != 0)