From 91d1d00c762e8e9ceeb47399a714b3438ca6a339 Mon Sep 17 00:00:00 2001 From: sos Date: Tue, 25 Feb 2003 15:33:36 +0000 Subject: Convert to new disk API. Prodded by: phk --- sys/dev/ata/ata-disk.c | 55 +++++++++++++++------------------------- sys/dev/ata/ata-disk.h | 1 - sys/dev/ata/ata-raid.c | 68 ++++++++++++++++---------------------------------- sys/dev/ata/ata-raid.h | 3 +-- 4 files changed, 42 insertions(+), 85 deletions(-) diff --git a/sys/dev/ata/ata-disk.c b/sys/dev/ata/ata-disk.c index 7502659..1428132 100644 --- a/sys/dev/ata/ata-disk.c +++ b/sys/dev/ata/ata-disk.c @@ -51,29 +51,11 @@ #include #include -/* device structures */ -static d_open_t adopen; -static d_close_t adclose; -static d_strategy_t adstrategy; -static dumper_t addump; -static struct cdevsw ad_cdevsw = { - /* open */ adopen, - /* close */ adclose, - /* read */ physread, - /* write */ physwrite, - /* ioctl */ noioctl, - /* poll */ nopoll, - /* mmap */ nommap, - /* strategy */ adstrategy, - /* name */ "ad", - /* maj */ 116, - /* dump */ addump, - /* psize */ nopsize, - /* flags */ D_DISK, -}; -static struct cdevsw addisk_cdevsw; - /* prototypes */ +static disk_open_t adopen; +static disk_close_t adclose; +static disk_strategy_t adstrategy; +static dumper_t addump; static void ad_invalidatequeue(struct ad_softc *, struct ad_request *); static int ad_tagsupported(struct ad_softc *); static void ad_timeout(struct ad_request *); @@ -106,7 +88,6 @@ void ad_attach(struct ata_device *atadev) { struct ad_softc *adp; - dev_t dev; u_int32_t lbasize; u_int64_t lbasize48; @@ -209,26 +190,30 @@ ad_attach(struct ata_device *atadev) DEVSTAT_TYPE_DIRECT | DEVSTAT_TYPE_IF_IDE, DEVSTAT_PRIORITY_DISK); - dev = disk_create(adp->lun, &adp->disk, 0, &ad_cdevsw, &addisk_cdevsw); - dev->si_drv1 = adp; - dev->si_iosize_max = adp->max_iosize; - adp->dev = dev; - + adp->disk.d_open = adopen; + adp->disk.d_close = adclose; + adp->disk.d_strategy = adstrategy; + adp->disk.d_dump = addump; + adp->disk.d_name = "ad"; + adp->disk.d_drv1 = adp; + adp->disk.d_maxsize = adp->max_iosize; 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; + disk_create(adp->lun, &adp->disk, 0, NULL, NULL); atadev->driver = adp; atadev->flags = 0; + ata_enclosure_print(atadev); + /* if this disk belongs to an ATA RAID dont print the probe */ if (ata_raiddisk_attach(adp)) adp->flags |= AD_F_RAID_SUBDISK; else { if (atadev->driver) { ad_print(adp); - ata_enclosure_print(atadev); } } } @@ -272,9 +257,9 @@ ad_detach(struct ata_device *atadev, int flush) /* get rid of flush XXX SOS */ } static int -adopen(dev_t dev, int flags, int fmt, struct thread *td) +adopen(struct disk *dp) { - struct ad_softc *adp = dev->si_drv1; + struct ad_softc *adp = dp->d_drv1; if (adp->flags & AD_F_RAID_SUBDISK) return EBUSY; @@ -286,9 +271,9 @@ adopen(dev_t dev, int flags, int fmt, struct thread *td) } static int -adclose(dev_t dev, int flags, int fmt, struct thread *td) +adclose(struct disk *dp) { - struct ad_softc *adp = dev->si_drv1; + struct ad_softc *adp = dp->d_drv1; adp->device->channel->locking(adp->device->channel, ATA_LF_LOCK); ATA_SLEEPLOCK_CH(adp->device->channel, ATA_CONTROL); @@ -302,7 +287,7 @@ adclose(dev_t dev, int flags, int fmt, struct thread *td) static void adstrategy(struct bio *bp) { - struct ad_softc *adp = bp->bio_dev->si_drv1; + struct ad_softc *adp = bp->bio_disk->d_drv1; int s; if (adp->device->flags & ATA_D_DETACHING) { @@ -324,7 +309,7 @@ addump(void *arg, void *virtual, vm_offset_t physical, off_t offset, size_t leng struct disk *dp; dp = arg; - adp = dp->d_dev->si_drv1; + adp = dp->d_drv1; if (!adp) return ENXIO; diff --git a/sys/dev/ata/ata-disk.h b/sys/dev/ata/ata-disk.h index db9156b..505690e 100644 --- a/sys/dev/ata/ata-disk.h +++ b/sys/dev/ata/ata-disk.h @@ -73,7 +73,6 @@ struct ad_softc { struct bio_queue_head queue; /* head of request queue */ struct devstat stats; /* devstat entry */ struct disk disk; /* disklabel/slice stuff */ - dev_t dev; /* device place holder */ }; void ad_attach(struct ata_device *); diff --git a/sys/dev/ata/ata-raid.c b/sys/dev/ata/ata-raid.c index 9e6b221..e5f5b6a 100644 --- a/sys/dev/ata/ata-raid.c +++ b/sys/dev/ata/ata-raid.c @@ -51,24 +51,7 @@ #include /* device structures */ -static d_open_t aropen; -static d_strategy_t arstrategy; -static struct cdevsw ar_cdevsw = { - /* open */ aropen, - /* close */ nullclose, - /* read */ physread, - /* write */ physwrite, - /* ioctl */ noioctl, - /* poll */ nopoll, - /* mmap */ nommap, - /* strategy */ arstrategy, - /* name */ "ar", - /* maj */ 157, - /* dump */ nodump, - /* psize */ nopsize, - /* flags */ D_DISK, -}; -static struct cdevsw ardisk_cdevsw; +static disk_strategy_t arstrategy; /* prototypes */ static void ar_attach_raid(struct ar_softc *, int); @@ -178,14 +161,18 @@ ata_raid_attach() static void ar_attach_raid(struct ar_softc *rdp, int update) { - dev_t dev; int disk; ar_config_changed(rdp, update); - dev = disk_create(rdp->lun, &rdp->disk, 0, &ar_cdevsw, &ardisk_cdevsw); - dev->si_drv1 = rdp; - dev->si_iosize_max = 256 * DEV_BSIZE; - rdp->dev = dev; + rdp->disk.d_strategy = arstrategy; + rdp->disk.d_name = "ar"; + 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; + rdp->disk.d_maxsize = 256 * DEV_BSIZE; + rdp->disk.d_drv1 = rdp; + disk_create(rdp->lun, &rdp->disk, 0, NULL, NULL); printf("ar%d: %lluMB lun, (unsigned long long) (rdp->total_sectors / ((1024L * 1024L) / DEV_BSIZE))); @@ -225,7 +212,6 @@ ar_attach_raid(struct ar_softc *rdp, int update) else printf(" %d FREE ", disk); ad_print(AD_SOFTC(rdp->disks[disk])); - printf(" "); ata_enclosure_print(AD_SOFTC(rdp->disks[disk])->device); } else if (rdp->disks[disk].flags & AR_DF_ASSIGNED) @@ -472,22 +458,10 @@ ata_raid_rebuild(int array) "rebuilding ar%d", array); } -static int -aropen(dev_t dev, int flags, int fmt, struct thread *td) -{ - struct ar_softc *rdp = dev->si_drv1; - - 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; -} - static void arstrategy(struct bio *bp) { - struct ar_softc *rdp = bp->bio_dev->si_drv1; + struct ar_softc *rdp = bp->bio_disk->d_drv1; int blkno, count, chunk, lba, lbs, tmplba; int drv = 0, change = 0; caddr_t data; @@ -563,7 +537,7 @@ arstrategy(struct bio *bp) case AR_F_RAID0: if ((rdp->disks[buf1->drive].flags & (AR_DF_PRESENT|AR_DF_ONLINE))==(AR_DF_PRESENT|AR_DF_ONLINE) && - !AD_SOFTC(rdp->disks[buf1->drive])->dev->si_disk) { + !rdp->disks[buf1->drive].device->driver) { rdp->disks[buf1->drive].flags &= ~AR_DF_ONLINE; ar_config_changed(rdp, 1); free(buf1, M_AR); @@ -572,7 +546,7 @@ arstrategy(struct bio *bp) biodone(bp); return; } - buf1->bp.bio_dev = AD_SOFTC(rdp->disks[buf1->drive])->dev; + buf1->bp.bio_disk = &AD_SOFTC(rdp->disks[buf1->drive])->disk; AR_STRATEGY((struct bio *)buf1); break; @@ -588,13 +562,13 @@ arstrategy(struct bio *bp) } if ((rdp->disks[buf1->drive].flags & (AR_DF_PRESENT|AR_DF_ONLINE))==(AR_DF_PRESENT|AR_DF_ONLINE) && - !AD_SOFTC(rdp->disks[buf1->drive])->dev->si_disk) { + !rdp->disks[buf1->drive].device->driver) { rdp->disks[buf1->drive].flags &= ~AR_DF_ONLINE; change = 1; } if ((rdp->disks[buf1->drive + rdp->width].flags & (AR_DF_PRESENT|AR_DF_ONLINE))==(AR_DF_PRESENT|AR_DF_ONLINE) && - !AD_SOFTC(rdp->disks[buf1->drive + rdp->width])->dev->si_disk) { + !rdp->disks[buf1->drive + rdp->width].device->driver) { rdp->disks[buf1->drive + rdp->width].flags &= ~AR_DF_ONLINE; change = 1; } @@ -631,8 +605,8 @@ arstrategy(struct bio *bp) buf1->mirror = buf2; buf2->mirror = buf1; buf2->drive = buf1->drive + rdp->width; - buf2->bp.bio_dev = - AD_SOFTC(rdp->disks[buf2->drive])->dev; + buf2->bp.bio_disk = + &AD_SOFTC(rdp->disks[buf2->drive])->disk; AR_STRATEGY((struct bio *)buf2); rdp->disks[buf2->drive].last_lba = buf2->bp.bio_pblkno + chunk; @@ -641,7 +615,7 @@ arstrategy(struct bio *bp) buf1->drive = buf1->drive + rdp->width; } } - buf1->bp.bio_dev = AD_SOFTC(rdp->disks[buf1->drive])->dev; + buf1->bp.bio_disk = &AD_SOFTC(rdp->disks[buf1->drive])->disk; AR_STRATEGY((struct bio *)buf1); rdp->disks[buf1->drive].last_lba = buf1->bp.bio_pblkno + chunk; break; @@ -686,7 +660,7 @@ ar_done(struct bio *bp) buf->drive = buf->drive + rdp->width; else buf->drive = buf->drive - rdp->width; - buf->bp.bio_dev = AD_SOFTC(rdp->disks[buf->drive])->dev; + buf->bp.bio_disk = &AD_SOFTC(rdp->disks[buf->drive])->disk; buf->bp.bio_flags = buf->org->bio_flags; buf->bp.bio_error = 0; AR_STRATEGY((struct bio *)buf); @@ -1304,7 +1278,7 @@ ar_promise_write_conf(struct ar_softc *rdp) if (rdp->disks[disk].flags & AR_DF_PRESENT && rdp->disks[disk].device) { config->raid.channel = rdp->disks[disk].device->channel->unit; config->raid.device = (rdp->disks[disk].device->unit != 0); - if (AD_SOFTC(rdp->disks[disk])->dev->si_disk) + if (rdp->disks[disk].device->driver) config->raid.disk_sectors = PR_LBA(AD_SOFTC(rdp->disks[disk])); /*config->raid.disk_offset*/ } @@ -1409,7 +1383,7 @@ ar_rw(struct ad_softc *adp, u_int32_t lba, int count, caddr_t data, int flags) if (!(bp = (struct bio *)malloc(sizeof(struct bio), M_AR, M_NOWAIT|M_ZERO))) return 1; - bp->bio_dev = adp->dev; + bp->bio_disk = &adp->disk; bp->bio_data = data; bp->bio_pblkno = lba; bp->bio_bcount = count; diff --git a/sys/dev/ata/ata-raid.h b/sys/dev/ata/ata-raid.h index 687c698..973b279 100644 --- a/sys/dev/ata/ata-raid.h +++ b/sys/dev/ata/ata-raid.h @@ -35,7 +35,7 @@ #define AR_READ 0x01 #define AR_WRITE 0x02 #define AR_WAIT 0x04 -#define AR_STRATEGY(x) (x)->bio_dev->si_disk->d_devsw->d_strategy((x)) +#define AR_STRATEGY(x) (x)->bio_disk->d_strategy((x)) #define AD_SOFTC(x) ((struct ad_softc *)(x.device->driver)) #define ATA_MAGIC "FreeBSD ATA driver RAID " @@ -80,7 +80,6 @@ struct ar_softc { u_int64_t lock_end; /* end of locked area for rebuild */ struct disk disk; /* disklabel/slice stuff */ struct proc *pid; /* rebuilder process id */ - dev_t dev; /* device place holder */ }; struct ar_buf { -- cgit v1.1