Convert to new disk API.
Prodded by: phk
This commit is contained in:
parent
93997ef1c9
commit
dd6a5ae906
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=111489
@ -51,29 +51,11 @@
|
||||
#include <dev/ata/ata-disk.h>
|
||||
#include <dev/ata/ata-raid.h>
|
||||
|
||||
/* 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;
|
||||
|
||||
|
@ -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 *);
|
||||
|
@ -51,24 +51,7 @@
|
||||
#include <dev/ata/ata-raid.h>
|
||||
|
||||
/* 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 <ATA ", rdp->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;
|
||||
|
@ -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 {
|
||||
|
Loading…
Reference in New Issue
Block a user