diff options
-rw-r--r-- | sys/cam/scsi/scsi_cd.c | 44 | ||||
-rw-r--r-- | sys/cam/scsi/scsi_da.c | 32 | ||||
-rw-r--r-- | sys/contrib/dev/fla/fla.c | 13 | ||||
-rw-r--r-- | sys/dev/aac/aac_disk.c | 15 | ||||
-rw-r--r-- | sys/dev/amr/amr_disk.c | 14 | ||||
-rw-r--r-- | sys/dev/ata/ata-disk.c | 12 | ||||
-rw-r--r-- | sys/dev/ata/ata-raid.c | 13 | ||||
-rw-r--r-- | sys/dev/ata/atapi-fd.c | 14 | ||||
-rw-r--r-- | sys/dev/ccd/ccd.c | 1 | ||||
-rw-r--r-- | sys/dev/ida/ida_disk.c | 14 | ||||
-rw-r--r-- | sys/dev/md/md.c | 15 | ||||
-rw-r--r-- | sys/dev/mlx/mlx_disk.c | 14 | ||||
-rw-r--r-- | sys/dev/ofw/ofw_disk.c | 18 | ||||
-rw-r--r-- | sys/dev/pst/pst-raid.c | 13 | ||||
-rw-r--r-- | sys/dev/twe/twe_freebsd.c | 16 | ||||
-rw-r--r-- | sys/geom/geom_ccd.c | 1 | ||||
-rw-r--r-- | sys/geom/geom_disk.c | 19 | ||||
-rw-r--r-- | sys/ia64/ia64/sscdisk.c | 13 | ||||
-rw-r--r-- | sys/kern/subr_disk.c | 8 | ||||
-rw-r--r-- | sys/kern/subr_disklabel.c | 1 | ||||
-rw-r--r-- | sys/pc98/pc98/wd.c | 13 | ||||
-rw-r--r-- | sys/sys/disk.h | 16 |
22 files changed, 100 insertions, 219 deletions
diff --git a/sys/cam/scsi/scsi_cd.c b/sys/cam/scsi/scsi_cd.c index 88073f6..99ad08f 100644 --- a/sys/cam/scsi/scsi_cd.c +++ b/sys/cam/scsi/scsi_cd.c @@ -54,6 +54,7 @@ #include <sys/bio.h> #include <sys/conf.h> #include <sys/disk.h> +#include <sys/diskslice.h> #include <sys/malloc.h> #include <sys/cdio.h> #include <sys/dvdio.h> @@ -858,10 +859,8 @@ cdregisterexit: static int cdopen(dev_t dev, int flags, int fmt, struct thread *td) { - struct disklabel *label; struct cam_periph *periph; struct cd_softc *softc; - struct ccb_getdev cgd; u_int32_t size; int error; int s; @@ -912,41 +911,12 @@ cdopen(dev_t dev, int flags, int fmt, struct thread *td) error = 0; } - /* - * Build prototype label for whole disk. - * Should take information about different data tracks from the - * TOC and put it in the partition table. - */ - label = &softc->disk.d_label; - bzero(label, sizeof(*label)); - label->d_type = DTYPE_SCSI; - - /* - * Grab the inquiry data to get the vendor and product names. - * Put them in the typename and packname for the label. - */ - xpt_setup_ccb(&cgd.ccb_h, periph->path, /*priority*/ 1); - cgd.ccb_h.func_code = XPT_GDEV_TYPE; - xpt_action((union ccb *)&cgd); - - strncpy(label->d_typename, cgd.inq_data.vendor, - min(SID_VENDOR_SIZE, sizeof(label->d_typename))); - strncpy(label->d_packname, cgd.inq_data.product, - min(SID_PRODUCT_SIZE, sizeof(label->d_packname))); - - label->d_secsize = softc->params.blksize; - label->d_secperunit = softc->params.disksize; - label->d_flags = D_REMOVABLE; - /* - * Make partition 'a' cover the whole disk. This is a temporary - * compatibility hack. The 'a' partition should not exist, so - * the slice code won't create it. The slice code will make - * partition (RAW_PART + 'a') cover the whole disk and fill in - * some more defaults. - */ - label->d_partitions[0].p_size = label->d_secperunit; - label->d_partitions[0].p_fstype = FS_OTHER; - + softc->disk.d_sectorsize = softc->params.blksize; + softc->disk.d_mediasize = softc->params.blksize * + (off_t)softc->params.disksize; + softc->disk.d_fwsectors = 0; + softc->disk.d_fwheads = 0; + /* * We unconditionally (re)set the blocksize each time the * CD device is opened. This is because the CD can change, diff --git a/sys/cam/scsi/scsi_da.c b/sys/cam/scsi/scsi_da.c index bf77e70..c8ea135 100644 --- a/sys/cam/scsi/scsi_da.c +++ b/sys/cam/scsi/scsi_da.c @@ -496,7 +496,6 @@ daopen(dev_t dev, int flags __unused, int fmt __unused, struct thread *td __unus { struct cam_periph *periph; struct da_softc *softc; - struct disklabel *label; struct scsi_read_capacity_data *rcap; union ccb *ccb; int unit; @@ -565,33 +564,12 @@ daopen(dev_t dev, int flags __unused, int fmt __unused, struct thread *td __unus free(rcap, M_TEMP); if (error == 0) { - struct ccb_getdev cgd; - /* Build label for whole disk. */ - label = &softc->disk.d_label; - bzero(label, sizeof(*label)); - label->d_type = DTYPE_SCSI; - - /* - * Grab the inquiry data to get the vendor and product names. - * Put them in the typename and packname for the label. - */ - xpt_setup_ccb(&cgd.ccb_h, periph->path, /*priority*/ 1); - cgd.ccb_h.func_code = XPT_GDEV_TYPE; - xpt_action((union ccb *)&cgd); - - strncpy(label->d_typename, cgd.inq_data.vendor, - min(SID_VENDOR_SIZE, sizeof(label->d_typename))); - strncpy(label->d_packname, cgd.inq_data.product, - min(SID_PRODUCT_SIZE, sizeof(label->d_packname))); - - label->d_secsize = softc->params.secsize; - label->d_nsectors = softc->params.secs_per_track; - label->d_ntracks = softc->params.heads; - label->d_ncylinders = softc->params.cylinders; - label->d_secpercyl = softc->params.heads - * softc->params.secs_per_track; - label->d_secperunit = softc->params.sectors; + softc->disk.d_sectorsize = softc->params.secsize; + softc->disk.d_mediasize = softc->params.secsize * (off_t)softc->params.sectors; + /* 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; /* * Check to see whether or not the blocksize is set yet. diff --git a/sys/contrib/dev/fla/fla.c b/sys/contrib/dev/fla/fla.c index 610f1ac..ac2a8ab 100644 --- a/sys/contrib/dev/fla/fla.c +++ b/sys/contrib/dev/fla/fla.c @@ -116,7 +116,7 @@ flaopen(dev_t dev, int flag, int fmt, struct thread *td) { struct fla_s *sc; int error; - struct disklabel *dl; + u_int spu, ncyl, nt, ns; if (fla_debug) printf("flaopen(%s %x %x %p)\n", @@ -131,12 +131,11 @@ flaopen(dev_t dev, int flag, int fmt, struct thread *td) return (EIO); } - dl = &sc->disk.d_label; - bzero(dl, sizeof(*dl)); - error = doc2k_size(sc->unit, &dl->d_secperunit, - &dl->d_ncylinders, &dl->d_ntracks, &dl->d_nsectors); - dl->d_secsize = DEV_BSIZE; - dl->d_secpercyl = dl->d_ntracks * dl->d_nsectors; /* XXX */ + error = doc2k_size(sc->unit, &spu, &ncyl, &nt, &ns); + sc->disk.d_sectorsize = DEV_BSIZE; + sc->disk.d_mediasize = (off_t)spu * DEV_BSIZE; + sc->disk.d_fwsectors = ns; + sc->disk.d_fwheads = nt; return (0); } diff --git a/sys/dev/aac/aac_disk.c b/sys/dev/aac/aac_disk.c index 91ceee0..68692aa 100644 --- a/sys/dev/aac/aac_disk.c +++ b/sys/dev/aac/aac_disk.c @@ -130,7 +130,6 @@ static int aac_disk_open(dev_t dev, int flags, int fmt, d_thread_t *td) { struct aac_disk *sc; - struct disklabel *label; debug_called(4); @@ -143,16 +142,10 @@ aac_disk_open(dev_t dev, int flags, int fmt, d_thread_t *td) if (sc->ad_controller->aac_state & AAC_STATE_SUSPEND) return(ENXIO); - /* build synthetic label */ - label = &sc->ad_disk.d_label; - bzero(label, sizeof(*label)); - label->d_type = DTYPE_ESDI; - label->d_secsize = AAC_BLOCK_SIZE; - label->d_nsectors = sc->ad_sectors; - label->d_ntracks = sc->ad_heads; - label->d_ncylinders = sc->ad_cylinders; - label->d_secpercyl = sc->ad_sectors * sc->ad_heads; - label->d_secperunit = sc->ad_size; + sc->ad_disk.d_sectorsize = AAC_BLOCK_SIZE; + sc->ad_disk.d_mediasize = (off_t)sc->ad_size * AAC_BLOCK_SIZE; + sc->ad_disk.d_fwsectors = sc->ad_sectors; + sc->ad_disk.d_fwheads = sc->ad_heads; sc->ad_flags |= AAC_DISK_OPEN; return (0); diff --git a/sys/dev/amr/amr_disk.c b/sys/dev/amr/amr_disk.c index 38784d3..e486e87 100644 --- a/sys/dev/amr/amr_disk.c +++ b/sys/dev/amr/amr_disk.c @@ -103,7 +103,6 @@ static int amrd_open(dev_t dev, int flags, int fmt, struct thread *td) { struct amrd_softc *sc = (struct amrd_softc *)dev->si_drv1; - struct disklabel *label; debug_called(1); @@ -114,15 +113,10 @@ amrd_open(dev_t dev, int flags, int fmt, struct thread *td) if (sc->amrd_controller->amr_state & AMR_STATE_SHUTDOWN) return(ENXIO); - label = &sc->amrd_disk.d_label; - bzero(label, sizeof(*label)); - label->d_type = DTYPE_SCSI; - label->d_secsize = AMR_BLKSIZE; - label->d_nsectors = sc->amrd_drive->al_sectors; - label->d_ntracks = sc->amrd_drive->al_heads; - label->d_ncylinders = sc->amrd_drive->al_cylinders; - label->d_secpercyl = sc->amrd_drive->al_sectors * sc->amrd_drive->al_heads; - label->d_secperunit = sc->amrd_drive->al_size; + sc->amrd_disk.d_sectorsize = AMR_BLKSIZE; + sc->amrd_disk.d_mediasize = (off_t)sc->amrd_drive->al_size * AMR_BLKSIZE; + sc->amrd_disk.d_fwsectors = sc->amrd_drive->al_sectors; + sc->amrd_disk.d_fwheads = sc->amrd_drive->al_heads; sc->amrd_flags |= AMRD_OPEN; return (0); diff --git a/sys/dev/ata/ata-disk.c b/sys/dev/ata/ata-disk.c index b4a8656..f8bae5e 100644 --- a/sys/dev/ata/ata-disk.c +++ b/sys/dev/ata/ata-disk.c @@ -208,14 +208,10 @@ ad_attach(struct ata_device *atadev) dev->si_iosize_max = adp->max_iosize; adp->dev = dev; - /* construct the disklabel */ - bzero(&adp->disk.d_label, sizeof(struct disklabel)); - adp->disk.d_label.d_secsize = DEV_BSIZE; - adp->disk.d_label.d_nsectors = adp->sectors; - adp->disk.d_label.d_ntracks = adp->heads; - adp->disk.d_label.d_ncylinders = adp->total_secs/(adp->heads*adp->sectors); - adp->disk.d_label.d_secpercyl = adp->sectors * adp->heads; - adp->disk.d_label.d_secperunit = adp->total_secs; + adp->disk.d_sectorsize = DEV_BSIZE; + adp->disk.d_mediasize = DEV_BSIZE * (off_t)adp->total_secs; + adp->disk.d_fwsectors = adp->sectors; + adp->disk.d_fwheads = adp->heads; atadev->driver = adp; atadev->flags = 0; diff --git a/sys/dev/ata/ata-raid.c b/sys/dev/ata/ata-raid.c index b209c1d..ec920e0 100644 --- a/sys/dev/ata/ata-raid.c +++ b/sys/dev/ata/ata-raid.c @@ -470,16 +470,11 @@ static int aropen(dev_t dev, int flags, int fmt, struct thread *td) { struct ar_softc *rdp = dev->si_drv1; - struct disklabel *dl; - dl = &rdp->disk.d_label; - bzero(dl, sizeof *dl); - dl->d_secsize = DEV_BSIZE; - dl->d_nsectors = rdp->sectors; - dl->d_ntracks = rdp->heads; - dl->d_ncylinders = rdp->cylinders; - dl->d_secpercyl = rdp->sectors * rdp->heads; - dl->d_secperunit = rdp->total_sectors; + rdp->disk.d_sectorsize = DEV_BSIZE; + rdp->disk.d_mediasize = (off_t)rdp->total_sectors * DEV_BSIZE; + rdp->disk.d_fwsectors = rdp->sectors; + rdp->disk.d_fwheads = rdp->heads; return 0; } diff --git a/sys/dev/ata/atapi-fd.c b/sys/dev/ata/atapi-fd.c index a8a53ab..e5f887a 100644 --- a/sys/dev/ata/atapi-fd.c +++ b/sys/dev/ata/atapi-fd.c @@ -224,7 +224,6 @@ static int afdopen(dev_t dev, int flags, int fmt, struct thread *td) { struct afd_softc *fdp = dev->si_drv1; - struct disklabel *label = &fdp->disk.d_label; atapi_test_ready(fdp->device); @@ -236,13 +235,12 @@ afdopen(dev_t dev, int flags, int fmt, struct thread *td) fdp->device->flags &= ~ATA_D_MEDIA_CHANGED; - bzero(label, sizeof *label); - label->d_secsize = fdp->cap.sector_size; - label->d_nsectors = fdp->cap.sectors; - label->d_ntracks = fdp->cap.heads; - label->d_ncylinders = fdp->cap.cylinders; - label->d_secpercyl = fdp->cap.sectors * fdp->cap.heads; - label->d_secperunit = label->d_secpercyl * fdp->cap.cylinders; + fdp->disk.d_sectorsize = fdp->cap.sector_size; + fdp->disk.d_mediasize = (off_t)fdp->cap.sector_size * fdp->cap.sectors * + fdp->cap.heads * fdp->cap.cylinders; + fdp->disk.d_fwsectors = fdp->cap.sectors; + fdp->disk.d_fwheads = fdp->cap.heads; + return 0; } diff --git a/sys/dev/ccd/ccd.c b/sys/dev/ccd/ccd.c index b4387d9..d8e01be 100644 --- a/sys/dev/ccd/ccd.c +++ b/sys/dev/ccd/ccd.c @@ -100,6 +100,7 @@ #include <sys/stdint.h> #include <sys/sysctl.h> #include <sys/disk.h> +#include <sys/disklabel.h> #include <sys/devicestat.h> #include <sys/fcntl.h> #include <sys/vnode.h> diff --git a/sys/dev/ida/ida_disk.c b/sys/dev/ida/ida_disk.c index 256b5aa..33f87c5 100644 --- a/sys/dev/ida/ida_disk.c +++ b/sys/dev/ida/ida_disk.c @@ -111,21 +111,15 @@ static int idad_open(dev_t dev, int flags, int fmt, struct thread *td) { struct idad_softc *drv; - struct disklabel *label; drv = idad_getsoftc(dev); if (drv == NULL) return (ENXIO); - label = &drv->disk.d_label; - bzero(label, sizeof(*label)); - label->d_type = DTYPE_SCSI; - label->d_secsize = drv->secsize; - label->d_nsectors = drv->sectors; - label->d_ntracks = drv->heads; - label->d_ncylinders = drv->cylinders; - label->d_secpercyl = drv->sectors * drv->heads; - label->d_secperunit = drv->secperunit; + drv->disk.d_sectorsize = drv->secsize; + drv->disk.d_mediasize = (off_t)drv->secperunit * drv->secsize; + drv->disk.d_fwsectors = drv->sectors; + drv->disk.d_fwheads = drv->heads; return (0); } diff --git a/sys/dev/md/md.c b/sys/dev/md/md.c index 7640604..032c5fe 100644 --- a/sys/dev/md/md.c +++ b/sys/dev/md/md.c @@ -360,7 +360,6 @@ static int mdopen(dev_t dev, int flag, int fmt, struct thread *td) { struct md_s *sc; - struct disklabel *dl; if (md_debug) printf("mdopen(%s %x %x %p)\n", @@ -368,14 +367,10 @@ mdopen(dev_t dev, int flag, int fmt, struct thread *td) sc = dev->si_drv1; - dl = &sc->disk.d_label; - bzero(dl, sizeof(*dl)); - dl->d_secsize = sc->secsize; - dl->d_nsectors = sc->nsect > 63 ? 63 : sc->nsect; - dl->d_ntracks = 1; - dl->d_secpercyl = dl->d_nsectors * dl->d_ntracks; - dl->d_secperunit = sc->nsect; - dl->d_ncylinders = dl->d_secperunit / dl->d_secpercyl; + sc->disk.d_sectorsize = sc->secsize; + sc->disk.d_mediasize = (off_t)sc->nsect * sc->secsize; + sc->disk.d_fwsectors = 0; + sc->disk.d_fwheads = 0; sc->opencount++; return (0); } @@ -646,7 +641,7 @@ mdnew(int unit) } if (unit == -1) unit = max + 1; - if (unit > DKMAXUNIT) + if (unit > 255) return (NULL); sc = (struct md_s *)malloc(sizeof *sc, M_MD, M_WAITOK | M_ZERO); sc->unit = unit; diff --git a/sys/dev/mlx/mlx_disk.c b/sys/dev/mlx/mlx_disk.c index 49005b1..a5ff92d 100644 --- a/sys/dev/mlx/mlx_disk.c +++ b/sys/dev/mlx/mlx_disk.c @@ -98,7 +98,6 @@ static int mlxd_open(dev_t dev, int flags, int fmt, struct thread *td) { struct mlxd_softc *sc = (struct mlxd_softc *)dev->si_drv1; - struct disklabel *label; debug_called(1); @@ -109,15 +108,10 @@ mlxd_open(dev_t dev, int flags, int fmt, struct thread *td) if (sc->mlxd_controller->mlx_state & MLX_STATE_SHUTDOWN) return(ENXIO); - label = &sc->mlxd_disk.d_label; - bzero(label, sizeof(*label)); - label->d_type = DTYPE_SCSI; - label->d_secsize = MLX_BLKSIZE; - label->d_nsectors = sc->mlxd_drive->ms_sectors; - label->d_ntracks = sc->mlxd_drive->ms_heads; - label->d_ncylinders = sc->mlxd_drive->ms_cylinders; - label->d_secpercyl = sc->mlxd_drive->ms_sectors * sc->mlxd_drive->ms_heads; - label->d_secperunit = sc->mlxd_drive->ms_size; + sc->mlxd_disk.d_sectorsize = MLX_BLKSIZE; + sc->mlxd_disk.d_mediasize = MLX_BLKSIZE * (off_t)sc->mlxd_drive->ms_size; + sc->mlxd_disk.d_fwsectors = sc->mlxd_drive->ms_sectors; + sc->mlxd_disk.d_fwheads = sc->mlxd_drive->ms_heads; sc->mlxd_flags |= MLXD_OPEN; return (0); diff --git a/sys/dev/ofw/ofw_disk.c b/sys/dev/ofw/ofw_disk.c index 878e8e8..8262e0f 100644 --- a/sys/dev/ofw/ofw_disk.c +++ b/sys/dev/ofw/ofw_disk.c @@ -114,24 +114,16 @@ static int ofwd_open(dev_t dev, int flags, int fmt, struct thread *td) { struct ofwd_softc *sc; - struct disklabel *label; sc = (struct ofwd_softc *)dev->si_drv1; if (sc == NULL) return (ENXIO); - /* - * Build synthetic label. - */ - label = &sc->ofwd_disk.d_label; - bzero(label, sizeof(*label)); - label->d_type = DTYPE_ESDI; - label->d_secsize = OFWD_BLOCKSIZE; - label->d_nsectors = 33554432; - label->d_ntracks = 1; - label->d_ncylinders = 1024; - label->d_secpercyl = 32768; - label->d_secperunit = 33554432; + sc->ofwd_disk.d_sectorsize = OFWD_BLOCKSIZE; + sc->ofwd_disk.d_mediasize = (off_t)33554432 * OFWD_BLOCKSIZE; + /* XXX: probably don't need the next two */ + sc->ofwd_disk.d_fwsectors = 33554432; + sc->ofwd_disk.d_fwheads = 1 sc->ofwd_flags |= OFWD_OPEN; return (0); diff --git a/sys/dev/pst/pst-raid.c b/sys/dev/pst/pst-raid.c index 2382576..db120b0 100644 --- a/sys/dev/pst/pst-raid.c +++ b/sys/dev/pst/pst-raid.c @@ -172,15 +172,10 @@ pst_attach(device_t dev) psc->device->si_drv1 = psc; psc->device->si_iosize_max = 64 * 1024; /*I2O_SGL_MAX_SEGS * PAGE_SIZE;*/ - bzero(&psc->disk.d_label, sizeof(struct disklabel)); - psc->disk.d_label.d_secsize = psc->info->block_size; - psc->disk.d_label.d_nsectors = 63; - psc->disk.d_label.d_ntracks = 255; - psc->disk.d_label.d_ncylinders = - (psc->info->capacity / psc->info->block_size) / (255 * 63); - psc->disk.d_label.d_secpercyl = 255 * 63; - psc->disk.d_label.d_secperunit = - psc->info->capacity / psc->info->block_size; + psc->disk.d_sectorsize = psc->info->block_size; + psc->disk.d_mediasize = psc->info->capacity; + psc->disk.d_fssectors = 63; + psc->disk.d_fsheads = 255; devstat_add_entry(&psc->stats, "pst", lun, psc->info->block_size, DEVSTAT_NO_ORDERED_TAGS, diff --git a/sys/dev/twe/twe_freebsd.c b/sys/dev/twe/twe_freebsd.c index df194a4..5187c25 100644 --- a/sys/dev/twe/twe_freebsd.c +++ b/sys/dev/twe/twe_freebsd.c @@ -549,7 +549,6 @@ struct twed_softc struct twe_drive *twed_drive; /* drive data in parent softc */ struct disk twed_disk; /* generic disk handle */ struct devstat twed_stats; /* accounting */ - struct disklabel twed_label; /* synthetic label */ int twed_flags; #define TWED_OPEN (1<<0) /* drive is open (can't shut down) */ }; @@ -622,7 +621,6 @@ static int twed_open(dev_t dev, int flags, int fmt, d_thread_t *td) { struct twed_softc *sc = (struct twed_softc *)dev->si_drv1; - struct disklabel *label; debug_called(4); @@ -633,16 +631,10 @@ twed_open(dev_t dev, int flags, int fmt, d_thread_t *td) if (sc->twed_controller->twe_state & TWE_STATE_SHUTDOWN) return(ENXIO); - /* build synthetic label */ - label = &sc->twed_disk.d_label; - bzero(label, sizeof(*label)); - label->d_type = DTYPE_ESDI; - label->d_secsize = TWE_BLOCK_SIZE; - label->d_nsectors = sc->twed_drive->td_sectors; - label->d_ntracks = sc->twed_drive->td_heads; - label->d_ncylinders = sc->twed_drive->td_cylinders; - label->d_secpercyl = sc->twed_drive->td_sectors * sc->twed_drive->td_heads; - label->d_secperunit = sc->twed_drive->td_size; + sc->twed_disk.d_sectorsize = TWE_BLOCK_SIZE; + sc->twed_disk.d_mediasize = TWE_BLOCK_SIZE * (off_t)sc->twed_drive->td_size; + sc->twed_disk.d_fwsectors = sc->twed_drive->td_sectors; + sc->twed_disk.d_fwheads = sc->twed_drive->td_heads; sc->twed_flags |= TWED_OPEN; return (0); diff --git a/sys/geom/geom_ccd.c b/sys/geom/geom_ccd.c index b4387d9..d8e01be 100644 --- a/sys/geom/geom_ccd.c +++ b/sys/geom/geom_ccd.c @@ -100,6 +100,7 @@ #include <sys/stdint.h> #include <sys/sysctl.h> #include <sys/disk.h> +#include <sys/disklabel.h> #include <sys/devicestat.h> #include <sys/fcntl.h> #include <sys/vnode.h> diff --git a/sys/geom/geom_disk.c b/sys/geom/geom_disk.c index d4091ef..b1fd07e 100644 --- a/sys/geom/geom_disk.c +++ b/sys/geom/geom_disk.c @@ -44,6 +44,8 @@ #include <sys/bio.h> #include <sys/conf.h> #include <sys/disk.h> +#include <sys/diskslice.h> +#include <sys/disklabel.h> #include <sys/malloc.h> #include <sys/sysctl.h> #include <sys/stdint.h> @@ -94,8 +96,7 @@ g_disk_access(struct g_provider *pp, int r, int w, int e) } else { error = 0; } - pp->mediasize = - dp->d_label.d_secsize * (off_t)dp->d_label.d_secperunit; + pp->mediasize = dp->d_mediasize; return (error); } @@ -110,7 +111,7 @@ g_disk_kerneldump(struct bio *bp, struct disk *dp) printf("Kerneldump off=%jd len=%jd\n", (intmax_t)gkd->offset, (intmax_t)gkd->length); di.dumper = (dumper_t *)dp->d_devsw->d_dump; di.priv = dp->d_dev; - di.blocksize = dp->d_label.d_secsize; + di.blocksize = dp->d_sectorsize; di.mediaoffset = gkd->offset; di.mediasize = gkd->length; error = set_dumper(&di); @@ -153,17 +154,13 @@ g_disk_start(struct bio *bp) mtx_unlock(&Giant); break; case BIO_GETATTR: - if (g_handleattr_int(bp, "GEOM::sectorsize", - dp->d_label.d_secsize)) + if (g_handleattr_int(bp, "GEOM::sectorsize", dp->d_sectorsize)) break; - else if (g_handleattr_int(bp, "GEOM::fwsectors", - dp->d_label.d_nsectors)) + else if (g_handleattr_int(bp, "GEOM::fwsectors", dp->d_fwsectors)) break; - else if (g_handleattr_int(bp, "GEOM::fwheads", - dp->d_label.d_ntracks)) + else if (g_handleattr_int(bp, "GEOM::fwheads", dp->d_fwheads)) break; - else if (g_handleattr_off_t(bp, "GEOM::mediasize", - dp->d_label.d_secsize * (off_t)dp->d_label.d_secperunit)) + else if (g_handleattr_off_t(bp, "GEOM::mediasize", dp->d_mediasize)) break; else if (g_handleattr_off_t(bp, "GEOM::frontstuff", 0)) break; diff --git a/sys/ia64/ia64/sscdisk.c b/sys/ia64/ia64/sscdisk.c index 9688c7a..cf54eb3 100644 --- a/sys/ia64/ia64/sscdisk.c +++ b/sys/ia64/ia64/sscdisk.c @@ -125,7 +125,6 @@ static int sscopen(dev_t dev, int flag, int fmt, struct thread *td) { struct ssc_s *sc; - struct disklabel *dl; if (ssc_debug) printf("sscopen(%s %x %x %p)\n", @@ -133,14 +132,10 @@ sscopen(dev_t dev, int flag, int fmt, struct thread *td) sc = dev->si_drv1; - dl = &sc->disk.d_label; - bzero(dl, sizeof(*dl)); - dl->d_secsize = DEV_BSIZE; - dl->d_nsectors = sc->nsect > 63 ? 63 : sc->nsect; - dl->d_ntracks = 1; - dl->d_secpercyl = dl->d_nsectors * dl->d_ntracks; - dl->d_secperunit = sc->nsect; - dl->d_ncylinders = dl->d_secperunit / dl->d_secpercyl; + sc->disk.d_sectorsize = DEV_BSIZE; + sc->disk.d_mediasize = (off_t)sc-nsect * DEV_BSIZE; + sc->disk.d_fwsectors = 0; + sc->disk.d_fwheads = 0; return (0); } diff --git a/sys/kern/subr_disk.c b/sys/kern/subr_disk.c index 388ea79..6408250 100644 --- a/sys/kern/subr_disk.c +++ b/sys/kern/subr_disk.c @@ -18,6 +18,8 @@ #include <sys/bio.h> #include <sys/conf.h> #include <sys/disk.h> +#include <sys/diskslice.h> +#include <sys/disklabel.h> #ifndef GEOM #include <sys/kernel.h> #include <sys/sysctl.h> @@ -175,6 +177,7 @@ disk_create(int unit, struct disk *dp, int flags, struct cdevsw *cdevsw, struct } bzero(dp, sizeof(*dp)); + dp->d_label = malloc(sizeof *dp->d_label, M_DEVBUF, M_WAITOK|M_ZERO); if (proto->d_open != diskopen) { *proto = *cdevsw; @@ -232,6 +235,7 @@ void disk_destroy(dev_t dev) { LIST_REMOVE(dev->si_disk, d_list); + free(dev->si_disk->d_label, M_DEVBUF); bzero(dev->si_disk, sizeof(*dev->si_disk)); dev->si_disk = NULL; destroy_dev(dev); @@ -305,6 +309,8 @@ diskopen(dev_t dev, int oflags, int devtype, struct thread *td) if (!pdev->si_iosize_max) pdev->si_iosize_max = dev->si_iosize_max; error = dp->d_devsw->d_open(pdev, oflags, devtype, td); + dp->d_label->d_secsize = dp->d_sectorsize; + dp->d_label->d_secperunit = dp->d_mediasize / dp->d_sectorsize; } /* Inherit properties from the whole/raw dev_t */ @@ -313,7 +319,7 @@ diskopen(dev_t dev, int oflags, int devtype, struct thread *td) if (error) goto out; - error = dsopen(dev, devtype, dp->d_dsflags, &dp->d_slice, &dp->d_label); + error = dsopen(dev, devtype, dp->d_dsflags, &dp->d_slice, dp->d_label); if (!dsisopen(dp->d_slice)) dp->d_devsw->d_close(pdev, oflags, devtype, td); diff --git a/sys/kern/subr_disklabel.c b/sys/kern/subr_disklabel.c index 9e27a96..c41d9be 100644 --- a/sys/kern/subr_disklabel.c +++ b/sys/kern/subr_disklabel.c @@ -46,6 +46,7 @@ #include <sys/buf.h> #include <sys/conf.h> #include <sys/kernel.h> +#include <sys/disk.h> #include <sys/disklabel.h> #include <sys/syslog.h> diff --git a/sys/pc98/pc98/wd.c b/sys/pc98/pc98/wd.c index 9c83b56..3c24a21a 100644 --- a/sys/pc98/pc98/wd.c +++ b/sys/pc98/pc98/wd.c @@ -1229,7 +1229,6 @@ wdopen(dev_t dev, int flags, int fmt, struct thread *td) { register unsigned int lunit; register struct softc *du; - struct disklabel *dl; lunit = dkunit(dev); if (lunit >= NWD || dksparebits(dev) != 0) @@ -1257,14 +1256,10 @@ wdopen(dev_t dev, int flags, int fmt, struct thread *td) du->dk_flags |= DKFL_LABELLING; du->dk_state = WANTOPEN; - dl = &du->disk.d_label; - bzero(dl, sizeof(*dl)); - dl->d_secsize = du->dk_dd.d_secsize; - dl->d_nsectors = du->dk_dd.d_nsectors; - dl->d_ntracks = du->dk_dd.d_ntracks; - dl->d_ncylinders = du->dk_dd.d_ncylinders; - dl->d_secpercyl = du->dk_dd.d_secpercyl; - dl->d_secperunit = du->dk_dd.d_secperunit; + du->disk.d_sectorsize = du->dk_dd.d_secsize; + du->disk.d_mediasize = du->dk_dd.d_secperunit * du->dk_dd.d_secsize; + du->disk.d_fwsectors = du->dk_dd.d_nsectors; + du->disk.d_fwheads = du->dk_dd.d_ntracks; du->dk_flags &= ~DKFL_LABELLING; wdsleep(du->dk_ctrlr, "wdopn2"); diff --git a/sys/sys/disk.h b/sys/sys/disk.h index 43a1ae3..e5c62c8 100644 --- a/sys/sys/disk.h +++ b/sys/sys/disk.h @@ -16,13 +16,6 @@ #include <sys/ioccom.h> #ifdef _KERNEL -#ifndef _SYS_DISKSLICE_H_ -#include <sys/diskslice.h> -#endif /* _SYS_DISKSLICE_H_ */ - -#ifndef _SYS_DISKLABEL -#include <sys/disklabel.h> -#endif /* _SYS_DISKLABEL */ #include <sys/queue.h> @@ -31,8 +24,15 @@ struct disk { u_int d_dsflags; struct cdevsw *d_devsw; dev_t d_dev; + + /* These four fields must be valid while opened */ + u_int d_sectorsize; + off_t d_mediasize; + u_int d_fwsectors; + u_int d_fwheads; + struct diskslices *d_slice; - struct disklabel d_label; + struct disklabel *d_label; LIST_ENTRY(disk) d_list; void *d_softc; }; |