diff --git a/share/man/man9/disk.9 b/share/man/man9/disk.9 index 41436427cbc2..14d777e26a31 100644 --- a/share/man/man9/disk.9 +++ b/share/man/man9/disk.9 @@ -25,7 +25,7 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH .\" DAMAGE. .\" -.Dd April 30, 2020 +.Dd August 29, 2024 .Dt DISK 9 .Os .Sh NAME @@ -35,6 +35,8 @@ .In geom/geom_disk.h .Ft struct disk * .Fn disk_alloc void +.Ft struct disk * +.Fn disk_alloc_dev "device_t adev" .Ft void .Fn disk_create "struct disk *disk" "int version" .Ft void @@ -65,6 +67,8 @@ GEOM has the ownership of .Vt "struct disk" , and drivers must allocate storage for it with the .Fn disk_alloc +or +.Fn disk_alloc_dev function, fill in the fields and call .Fn disk_create @@ -230,6 +234,13 @@ the disk. .It Vt uint16_t Va d_hba_subdevice This field can be used to store the PCI subdevice ID for the HBA connected to the disk. +.It Vt char Va d_attachment[DISK_IDENT_SIZE] +This field can and should be used to store the device to which this disk is +attached. +This field will be initialised by +.Fn disk_alloc_dev +using the name of the given device, but should be set manually when using +.Fn disk_alloc . .El .Ss Driver Private Data This field may be used by the device driver to store a pointer to diff --git a/sys/dev/aac/aac_disk.c b/sys/dev/aac/aac_disk.c index b20bbd1e4370..4313de281478 100644 --- a/sys/dev/aac/aac_disk.c +++ b/sys/dev/aac/aac_disk.c @@ -398,7 +398,7 @@ aac_disk_attach(device_t dev) /* attach a generic disk device to ourselves */ sc->unit = device_get_unit(dev); - sc->ad_disk = disk_alloc(); + sc->ad_disk = disk_alloc_dev(dev); sc->ad_disk->d_drv1 = sc; sc->ad_disk->d_flags = DISKFLAG_UNMAPPED_BIO; sc->ad_disk->d_name = "aacd"; diff --git a/sys/dev/altera/avgen/altera_avgen.c b/sys/dev/altera/avgen/altera_avgen.c index 846167c649f8..ab3d4956b7de 100644 --- a/sys/dev/altera/avgen/altera_avgen.c +++ b/sys/dev/altera/avgen/altera_avgen.c @@ -491,7 +491,7 @@ altera_avgen_attach(struct altera_avgen_softc *sc, const char *str_fileio, ALTERA_AVALON_FLAG_GEOM_WRITE)) { mtx_init(&sc->avg_disk_mtx, "altera_avgen_disk", NULL, MTX_DEF); - sc->avg_disk = disk_alloc(); + sc->avg_disk = disk_alloc_dev(dev); sc->avg_disk->d_drv1 = sc; sc->avg_disk->d_strategy = altera_avgen_disk_strategy; if (devunit == -1) diff --git a/sys/dev/altera/sdcard/altera_sdcard_disk.c b/sys/dev/altera/sdcard/altera_sdcard_disk.c index 87fdfb2a6475..c9dfefb8960c 100644 --- a/sys/dev/altera/sdcard/altera_sdcard_disk.c +++ b/sys/dev/altera/sdcard/altera_sdcard_disk.c @@ -129,7 +129,7 @@ altera_sdcard_disk_insert(struct altera_sdcard_softc *sc) * therefore safe to drop the lock here. */ ALTERA_SDCARD_UNLOCK(sc); - disk = disk_alloc(); + disk = disk_alloc_dev(sc->as_dev); disk->d_drv1 = sc; disk->d_name = "altera_sdcard"; disk->d_unit = sc->as_unit; diff --git a/sys/dev/cfi/cfi_disk.c b/sys/dev/cfi/cfi_disk.c index 4c3eae473fb6..becb87489dce 100644 --- a/sys/dev/cfi/cfi_disk.c +++ b/sys/dev/cfi/cfi_disk.c @@ -92,7 +92,7 @@ cfi_disk_attach(device_t dev) sc->parent->sc_width != 4) return EINVAL; - sc->disk = disk_alloc(); + sc->disk = disk_alloc_dev(dev); if (sc->disk == NULL) return ENOMEM; sc->disk->d_name = "cfid"; diff --git a/sys/dev/flash/at45d.c b/sys/dev/flash/at45d.c index bce23f467e2c..6afde3eb0290 100644 --- a/sys/dev/flash/at45d.c +++ b/sys/dev/flash/at45d.c @@ -365,7 +365,7 @@ at45d_delayed_attach(void *xsc) sc->dummybuf = malloc(pagesize, M_DEVBUF, M_WAITOK | M_ZERO); - sc->disk = disk_alloc(); + sc->disk = disk_alloc_dev(sc->dev); sc->disk->d_open = at45d_open; sc->disk->d_close = at45d_close; sc->disk->d_strategy = at45d_strategy; diff --git a/sys/dev/flash/flexspi/flex_spi.c b/sys/dev/flash/flexspi/flex_spi.c index 766a1cfaa332..a88710f4f6ca 100644 --- a/sys/dev/flash/flexspi/flex_spi.c +++ b/sys/dev/flash/flexspi/flex_spi.c @@ -788,7 +788,7 @@ flex_spi_attach(device_t dev) } /* Move it to per-flash */ - sc->disk = disk_alloc(); + sc->disk = disk_alloc_dev(dev); sc->disk->d_open = flex_spi_open; sc->disk->d_close = flex_spi_close; sc->disk->d_strategy = flex_spi_strategy; diff --git a/sys/dev/flash/mx25l.c b/sys/dev/flash/mx25l.c index 64e3e53d4291..80b7421a398d 100644 --- a/sys/dev/flash/mx25l.c +++ b/sys/dev/flash/mx25l.c @@ -508,7 +508,7 @@ mx25l_attach(device_t dev) return (err); } - sc->sc_disk = disk_alloc(); + sc->sc_disk = disk_alloc_dev(sc->sc_dev); sc->sc_disk->d_open = mx25l_open; sc->sc_disk->d_close = mx25l_close; sc->sc_disk->d_strategy = mx25l_strategy; diff --git a/sys/dev/flash/n25q.c b/sys/dev/flash/n25q.c index 95d005125930..7cb21ab68242 100644 --- a/sys/dev/flash/n25q.c +++ b/sys/dev/flash/n25q.c @@ -290,7 +290,7 @@ n25q_attach(device_t dev) n25q_wait_for_device_ready(sc->dev); - sc->sc_disk = disk_alloc(); + sc->sc_disk = disk_alloc_dev(sc->dev); sc->sc_disk->d_open = n25q_open; sc->sc_disk->d_close = n25q_close; sc->sc_disk->d_strategy = n25q_strategy; diff --git a/sys/dev/ida/ida_disk.c b/sys/dev/ida/ida_disk.c index 1e3877652f8a..217830c7e72d 100644 --- a/sys/dev/ida/ida_disk.c +++ b/sys/dev/ida/ida_disk.c @@ -202,7 +202,7 @@ idad_attach(device_t dev) drv->secperunit / ((1024 * 1024) / drv->secsize), drv->secperunit, drv->secsize); - drv->disk = disk_alloc(); + drv->disk = disk_alloc_dev(dev); drv->disk->d_strategy = idad_strategy; drv->disk->d_name = "idad"; drv->disk->d_dump = idad_dump; diff --git a/sys/dev/ips/ips_disk.c b/sys/dev/ips/ips_disk.c index 09ab571d2734..6ae73fda7ebe 100644 --- a/sys/dev/ips/ips_disk.c +++ b/sys/dev/ips/ips_disk.c @@ -140,7 +140,7 @@ static int ipsd_attach(device_t dev) dsc->sc = device_get_softc(adapter); dsc->unit = device_get_unit(dev); dsc->disk_number = (uintptr_t) device_get_ivars(dev); - dsc->ipsd_disk = disk_alloc(); + dsc->ipsd_disk = disk_alloc_dev(dev); dsc->ipsd_disk->d_drv1 = dsc; dsc->ipsd_disk->d_name = "ipsd"; dsc->ipsd_disk->d_maxsize = IPS_MAX_IO_SIZE; diff --git a/sys/dev/mfi/mfi_disk.c b/sys/dev/mfi/mfi_disk.c index 29c7bdc79aa1..88b3101361b2 100644 --- a/sys/dev/mfi/mfi_disk.c +++ b/sys/dev/mfi/mfi_disk.c @@ -150,7 +150,7 @@ mfi_disk_attach(device_t dev) ld_info->ld_config.properties.name, state); } - sc->ld_disk = disk_alloc(); + sc->ld_disk = disk_alloc_dev(dev); sc->ld_disk->d_drv1 = sc; sc->ld_disk->d_maxsize = min(sc->ld_controller->mfi_max_io * secsize, (sc->ld_controller->mfi_max_sge - 1) * PAGE_SIZE); diff --git a/sys/dev/mfi/mfi_syspd.c b/sys/dev/mfi/mfi_syspd.c index 4353e2598f5c..9694fdfa716a 100644 --- a/sys/dev/mfi/mfi_syspd.c +++ b/sys/dev/mfi/mfi_syspd.c @@ -124,7 +124,7 @@ mfi_syspd_attach(device_t dev) mtx_unlock(&sc->pd_controller->mfi_io_lock); device_printf(dev, "%juMB (%ju sectors) SYSPD volume (deviceid: %d)\n", sectors / (1024 * 1024 / secsize), sectors, sc->pd_id); - sc->pd_disk = disk_alloc(); + sc->pd_disk = disk_alloc_dev(dev); sc->pd_disk->d_drv1 = sc; sc->pd_disk->d_maxsize = min(sc->pd_controller->mfi_max_io * secsize, (sc->pd_controller->mfi_max_sge - 1) * PAGE_SIZE); diff --git a/sys/dev/mlx/mlx_disk.c b/sys/dev/mlx/mlx_disk.c index 3f00dfd92f9c..4e1e8e7f53d6 100644 --- a/sys/dev/mlx/mlx_disk.c +++ b/sys/dev/mlx/mlx_disk.c @@ -238,7 +238,7 @@ mlxd_attach(device_t dev) sc->mlxd_drive->ms_size / ((1024 * 1024) / MLX_BLKSIZE), sc->mlxd_drive->ms_size, sc->mlxd_drive->ms_raidlevel, state); - sc->mlxd_disk = disk_alloc(); + sc->mlxd_disk = disk_alloc_dev(dev); sc->mlxd_disk->d_open = mlxd_open; sc->mlxd_disk->d_close = mlxd_close; sc->mlxd_disk->d_ioctl = mlxd_ioctl; diff --git a/sys/dev/mmc/mmcsd.c b/sys/dev/mmc/mmcsd.c index cd973e53802c..b26aba811111 100644 --- a/sys/dev/mmc/mmcsd.c +++ b/sys/dev/mmc/mmcsd.c @@ -527,7 +527,7 @@ mmcsd_add_part(struct mmcsd_softc *sc, u_int type, const char *name, u_int cnt, } else { MMCSD_DISK_LOCK_INIT(part); - d = part->disk = disk_alloc(); + d = part->disk = disk_alloc_dev(dev); d->d_close = mmcsd_close; d->d_strategy = mmcsd_strategy; d->d_ioctl = mmcsd_ioctl_disk; diff --git a/sys/dev/nvd/nvd.c b/sys/dev/nvd/nvd.c index 33b43efd24c1..e903e15c16f1 100644 --- a/sys/dev/nvd/nvd.c +++ b/sys/dev/nvd/nvd.c @@ -449,7 +449,7 @@ nvd_new_disk(struct nvme_namespace *ns, void *ctrlr_arg) taskqueue_thread_enqueue, &ndisk->tq); taskqueue_start_threads(&ndisk->tq, 1, PI_DISK, "nvd taskq"); - disk = ndisk->disk = disk_alloc(); + disk = ndisk->disk = disk_alloc_dev(dev); disk->d_strategy = nvd_strategy; disk->d_ioctl = nvd_ioctl; disk->d_dump = nvd_dump; @@ -498,8 +498,6 @@ nvd_new_disk(struct nvme_namespace *ns, void *ctrlr_arg) disk->d_hba_subvendor = pci_get_subvendor(dev); disk->d_hba_subdevice = pci_get_subdevice(dev); disk->d_rotation_rate = DISK_RR_NON_ROTATING; - strlcpy(disk->d_attachment, device_get_nameunit(dev), - sizeof(disk->d_attachment)); disk_create(disk, DISK_VERSION); diff --git a/sys/dev/pst/pst-raid.c b/sys/dev/pst/pst-raid.c index f1d66f7598ed..b0257358b589 100644 --- a/sys/dev/pst/pst-raid.c +++ b/sys/dev/pst/pst-raid.c @@ -152,7 +152,7 @@ pst_attach(device_t dev) bioq_init(&psc->queue); - psc->disk = disk_alloc(); + psc->disk = disk_alloc_dev(dev); psc->disk->d_name = "pst"; psc->disk->d_strategy = pststrategy; psc->disk->d_maxsize = 64 * 1024; /*I2O_SGL_MAX_SEGS * PAGE_SIZE;*/ diff --git a/sys/dev/virtio/block/virtio_blk.c b/sys/dev/virtio/block/virtio_blk.c index 76068c91df11..5329611cfe0d 100644 --- a/sys/dev/virtio/block/virtio_blk.c +++ b/sys/dev/virtio/block/virtio_blk.c @@ -742,7 +742,7 @@ vtblk_alloc_disk(struct vtblk_softc *sc, struct virtio_blk_config *blkcfg) dev = sc->vtblk_dev; - sc->vtblk_disk = dp = disk_alloc(); + sc->vtblk_disk = dp = disk_alloc_dev(dev); dp->d_open = vtblk_open; dp->d_close = vtblk_close; dp->d_ioctl = vtblk_ioctl; @@ -755,8 +755,6 @@ vtblk_alloc_disk(struct vtblk_softc *sc, struct virtio_blk_config *blkcfg) dp->d_hba_device = virtio_get_device(dev); dp->d_hba_subvendor = virtio_get_subvendor(dev); dp->d_hba_subdevice = virtio_get_subdevice(dev); - strlcpy(dp->d_attachment, device_get_nameunit(dev), - sizeof(dp->d_attachment)); if (virtio_with_feature(dev, VIRTIO_BLK_F_RO)) dp->d_flags |= DISKFLAG_WRITE_PROTECT; diff --git a/sys/dev/xen/blkfront/blkfront.c b/sys/dev/xen/blkfront/blkfront.c index b11972295a4b..5726086d48f9 100644 --- a/sys/dev/xen/blkfront/blkfront.c +++ b/sys/dev/xen/blkfront/blkfront.c @@ -1012,7 +1012,7 @@ xbd_instance_create(struct xbd_softc *sc, blkif_sector_t sectors, features); } - sc->xbd_disk = disk_alloc(); + sc->xbd_disk = disk_alloc_dev(sc->xbd_dev); sc->xbd_disk->d_unit = sc->xbd_unit; sc->xbd_disk->d_open = xbd_open; sc->xbd_disk->d_close = xbd_close; diff --git a/sys/geom/geom_disk.c b/sys/geom/geom_disk.c index 6b8c4d32267c..75007bd1f5c3 100644 --- a/sys/geom/geom_disk.c +++ b/sys/geom/geom_disk.c @@ -43,6 +43,7 @@ #include #include #include +#include #include #include #include @@ -881,6 +882,17 @@ disk_alloc(void) return (dp); } +struct disk * +disk_alloc_dev(device_t adev) +{ + struct disk *dp; + + dp = disk_alloc(); + strlcpy(dp->d_attachment, device_get_nameunit(adev), + sizeof(dp->d_attachment)); + return (dp); +} + void disk_create(struct disk *dp, int version) { diff --git a/sys/geom/geom_disk.h b/sys/geom/geom_disk.h index afb3f628f84c..9c3a0e21fd95 100644 --- a/sys/geom/geom_disk.h +++ b/sys/geom/geom_disk.h @@ -138,6 +138,7 @@ struct disk { #define DISKFLAG_WRITE_PROTECT 0x0100 struct disk *disk_alloc(void); +struct disk *disk_alloc_dev(device_t adev); void disk_create(struct disk *disk, int version); void disk_destroy(struct disk *disk); void disk_gone(struct disk *disk); diff --git a/sys/powerpc/mambo/mambo_disk.c b/sys/powerpc/mambo/mambo_disk.c index d24652f15885..3499d2618874 100644 --- a/sys/powerpc/mambo/mambo_disk.c +++ b/sys/powerpc/mambo/mambo_disk.c @@ -106,7 +106,7 @@ mambodisk_attach(device_t dev) sc->dev = dev; MBODISK_LOCK_INIT(sc); - d = sc->disk = disk_alloc(); + d = sc->disk = disk_alloc_dev(dev); d->d_open = mambodisk_open; d->d_close = mambodisk_close; d->d_strategy = mambodisk_strategy; diff --git a/sys/powerpc/powernv/opal_flash.c b/sys/powerpc/powernv/opal_flash.c index 144de20da5d3..76e3d7fe14eb 100644 --- a/sys/powerpc/powernv/opal_flash.c +++ b/sys/powerpc/powernv/opal_flash.c @@ -361,7 +361,7 @@ opalflash_attach(device_t dev) return (ENXIO); } - sc->sc_disk = disk_alloc(); + sc->sc_disk = disk_alloc_dev(dev); sc->sc_disk->d_name = "opalflash"; sc->sc_disk->d_open = opalflash_open; sc->sc_disk->d_close = opalflash_close; diff --git a/sys/powerpc/ps3/ps3disk.c b/sys/powerpc/ps3/ps3disk.c index 0931e6aad58b..5bab8f7663cc 100644 --- a/sys/powerpc/ps3/ps3disk.c +++ b/sys/powerpc/ps3/ps3disk.c @@ -233,7 +233,7 @@ ps3disk_attach(device_t dev) for (i = 0; i < sc->sc_nregs; i++) { struct ps3disk_region *rp = &sc->sc_reg[i]; - d = sc->sc_disk[i] = disk_alloc(); + d = sc->sc_disk[i] = disk_alloc_dev(dev); d->d_open = ps3disk_open; d->d_close = ps3disk_close; d->d_strategy = ps3disk_strategy;