summaryrefslogtreecommitdiffstats
path: root/sys/cam
diff options
context:
space:
mode:
authortruckman <truckman@FreeBSD.org>2016-07-06 17:42:09 +0000
committertruckman <truckman@FreeBSD.org>2016-07-06 17:42:09 +0000
commit15fb55aa670314e87deb319e02abdf4bcbac078b (patch)
treee5a053590127ee21f62d5aa6351638cd94471089 /sys/cam
parent3f7fb5e22f97fffdae5ca551fbca392a7e6eccf7 (diff)
downloadFreeBSD-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.h2
-rw-r--r--sys/cam/cam_xpt.c5
-rw-r--r--sys/cam/scsi/scsi_da.c9
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
OpenPOWER on IntegriCloud