Index: sys/cam/scsi/scsi_da.c =================================================================== --- sys/cam/scsi/scsi_da.c +++ sys/cam/scsi/scsi_da.c @@ -3729,7 +3729,7 @@ struct da_softc *softc; struct disk_params *dp; u_int lbppbe, lalba; - int error; + int error, updated; softc = (struct da_softc *)periph->softc; @@ -3822,15 +3822,27 @@ } } - softc->disk->d_sectorsize = softc->params.secsize; - softc->disk->d_mediasize = softc->params.secsize * (off_t)softc->params.sectors; - softc->disk->d_stripesize = softc->params.stripesize; - softc->disk->d_stripeoffset = softc->params.stripeoffset; + /* Set disk params, and send a devctl event if any have changed. */ +#define _CHECK_UPDATED(dst, src) do { \ + updated |= ((src) ^ (dst)); \ + dst = src; \ +} while (0) + updated = 0; + _CHECK_UPDATED(softc->disk->d_sectorsize, softc->params.secsize); + _CHECK_UPDATED(softc->disk->d_mediasize, + softc->params.secsize * (off_t)softc->params.sectors); + _CHECK_UPDATED(softc->disk->d_stripesize, softc->params.stripesize); + _CHECK_UPDATED(softc->disk->d_stripeoffset, softc->params.stripeoffset); /* XXX: these are not actually "firmware" values, so they may be wrong */ - softc->disk->d_fwsectors = softc->params.secs_per_track; - softc->disk->d_fwheads = softc->params.heads; - softc->disk->d_devstat->block_size = softc->params.secsize; - softc->disk->d_devstat->flags &= ~DEVSTAT_BS_UNAVAILABLE; + _CHECK_UPDATED(softc->disk->d_fwsectors, softc->params.secs_per_track); + _CHECK_UPDATED(softc->disk->d_fwheads, softc->params.heads); + _CHECK_UPDATED(softc->disk->d_devstat->block_size, softc->params.secsize); + _CHECK_UPDATED(softc->disk->d_devstat->flags, + softc->disk->d_devstat->flags & ~DEVSTAT_BS_UNAVAILABLE); +#undef _CHECK_UPDATED + + if (updated != 0) + disk_attr_changed(softc->disk, "GEOM::diskparams", M_NOWAIT); error = disk_resize(softc->disk, M_NOWAIT); if (error != 0) Index: sys/geom/geom_disk.c =================================================================== --- sys/geom/geom_disk.c +++ sys/geom/geom_disk.c @@ -43,6 +43,7 @@ #include #include #include +#include /* for devctl_notify() */ #include #include #include @@ -839,11 +840,14 @@ { struct g_geom *gp; struct g_provider *pp; + char devnamebuf[128]; gp = dp->d_geom; if (gp != NULL) LIST_FOREACH(pp, &gp->provider, provider) (void)g_attr_changed(pp, attr, flag); + snprintf(devnamebuf, 128, "devname=%s%d", dp->d_name, dp->d_unit); + devctl_notify("GEOM", "disk", attr, devnamebuf); } void