diff options
author | truckman <truckman@FreeBSD.org> | 2016-07-06 17:42:09 +0000 |
---|---|---|
committer | truckman <truckman@FreeBSD.org> | 2016-07-06 17:42:09 +0000 |
commit | 15fb55aa670314e87deb319e02abdf4bcbac078b (patch) | |
tree | e5a053590127ee21f62d5aa6351638cd94471089 /sys/cam | |
parent | 3f7fb5e22f97fffdae5ca551fbca392a7e6eccf7 (diff) | |
download | FreeBSD-src-15fb55aa670314e87deb319e02abdf4bcbac078b.zip FreeBSD-src-15fb55aa670314e87deb319e02abdf4bcbac078b.tar.gz |
MFC r299371 (by trasz)
Add "camcontrol reprobe" subcommand, and implement it for da(4).
This makes it possible to manually force updating capacity data
after the disk got resized. Without it it might be neccessary to
reboot before FreeBSD notices updated disk size under eg VMWare.
Differential Revision: https://reviews.freebsd.org/D6108
Diffstat (limited to 'sys/cam')
-rw-r--r-- | sys/cam/cam_ccb.h | 2 | ||||
-rw-r--r-- | sys/cam/cam_xpt.c | 5 | ||||
-rw-r--r-- | sys/cam/scsi/scsi_da.c | 9 |
3 files changed, 14 insertions, 2 deletions
diff --git a/sys/cam/cam_ccb.h b/sys/cam/cam_ccb.h index 12d3803..c350526 100644 --- a/sys/cam/cam_ccb.h +++ b/sys/cam/cam_ccb.h @@ -230,6 +230,8 @@ typedef enum { /* Notify Host Target driver of event */ XPT_NOTIFY_ACKNOWLEDGE = 0x37 | XPT_FC_QUEUED | XPT_FC_USER_CCB, /* Acknowledgement of event */ + XPT_REPROBE_LUN = 0x38 | XPT_FC_QUEUED | XPT_FC_USER_CCB, + /* Query device capacity and notify GEOM */ /* Vendor Unique codes: 0x80->0x8F */ XPT_VUNIQUE = 0x80 diff --git a/sys/cam/cam_xpt.c b/sys/cam/cam_xpt.c index 39ff577..f174671 100644 --- a/sys/cam/cam_xpt.c +++ b/sys/cam/cam_xpt.c @@ -2991,6 +2991,11 @@ call_sim: xpt_freeze_devq(path, 1); start_ccb->ccb_h.status = CAM_REQ_CMP; break; + case XPT_REPROBE_LUN: + xpt_async(AC_INQ_CHANGED, path, NULL); + start_ccb->ccb_h.status = CAM_REQ_CMP; + xpt_done(start_ccb); + break; default: case XPT_SDEV_TYPE: case XPT_TERM_IO: diff --git a/sys/cam/scsi/scsi_da.c b/sys/cam/scsi/scsi_da.c index 5393721..44057d5 100644 --- a/sys/cam/scsi/scsi_da.c +++ b/sys/cam/scsi/scsi_da.c @@ -1758,6 +1758,11 @@ daasync(void *callback_arg, u_int32_t code, ccbh->ccb_state |= DA_CCB_RETRY_UA; break; } + case AC_INQ_CHANGED: + softc = (struct da_softc *)periph->softc; + softc->flags &= ~DA_FLAG_PROBED; + dareprobe(periph); + break; default: break; } @@ -2239,8 +2244,8 @@ daregister(struct cam_periph *periph, void *arg) * would be to not attach the device on failure. */ xpt_register_async(AC_SENT_BDR | AC_BUS_RESET | AC_LOST_DEVICE | - AC_ADVINFO_CHANGED | AC_SCSI_AEN | AC_UNIT_ATTENTION, - daasync, periph, periph->path); + AC_ADVINFO_CHANGED | AC_SCSI_AEN | AC_UNIT_ATTENTION | + AC_INQ_CHANGED, daasync, periph, periph->path); /* * Emit an attribute changed notification just in case |