Commit 165088f9 authored by Linus Torvalds's avatar Linus Torvalds

Merge home.transmeta.com:/home/torvalds/v2.5/viro

into home.transmeta.com:/home/torvalds/v2.5/linux
parents b340c708 e86a3786
...@@ -193,8 +193,6 @@ struct mfm_info { ...@@ -193,8 +193,6 @@ struct mfm_info {
#define MFM_DRV_INFO mfm_info[raw_cmd.dev] #define MFM_DRV_INFO mfm_info[raw_cmd.dev]
static struct hd_struct mfm[MFM_MAXDRIVES << 6];
/* Stuff from the assembly routines */ /* Stuff from the assembly routines */
extern unsigned int hdc63463_baseaddress; /* Controller base address */ extern unsigned int hdc63463_baseaddress; /* Controller base address */
extern unsigned int hdc63463_irqpolladdress; /* Address to read to test for int */ extern unsigned int hdc63463_irqpolladdress; /* Address to read to test for int */
...@@ -882,6 +880,20 @@ static void mfm_rerequest(void) ...@@ -882,6 +880,20 @@ static void mfm_rerequest(void)
mfm_request(); mfm_request();
} }
static struct gendisk mfm_gendisk[2] = {
{
.major = MAJOR_NR,
.first_minor = 0,
.major_name = "mfma",
.minor_shift = 6,
},
{
.major = MAJOR_NR,
.first_minor = 64,
.major_name = "mfmb",
.minor_shift = 6,
};
static void mfm_request(void) static void mfm_request(void)
{ {
DBG("mfm_request CURRENT=%p Busy=%d\n", CURRENT, Busy); DBG("mfm_request CURRENT=%p Busy=%d\n", CURRENT, Busy);
...@@ -895,7 +907,7 @@ static void mfm_request(void) ...@@ -895,7 +907,7 @@ static void mfm_request(void)
Busy = 1; Busy = 1;
while (1) { while (1) {
unsigned int dev, block, nsect; unsigned int dev, block, nsect, unit;
DBG("mfm_request: loop start\n"); DBG("mfm_request: loop start\n");
sti(); sti();
...@@ -912,26 +924,26 @@ static void mfm_request(void) ...@@ -912,26 +924,26 @@ static void mfm_request(void)
DBG("mfm_request: before arg extraction\n"); DBG("mfm_request: before arg extraction\n");
dev = minor(CURRENT->rq_dev); dev = minor(CURRENT->rq_dev);
unit = dev>>6;
block = CURRENT->sector; block = CURRENT->sector;
nsect = CURRENT->nr_sectors; nsect = CURRENT->nr_sectors;
#ifdef DEBUG #ifdef DEBUG
/*if ((dev>>6)==1) */ console_printf("mfm_request: raw vals: dev=%d (block=512 bytes) block=%d nblocks=%d\n", dev, block, nsect); /*if (unit==1) */ console_printf("mfm_request: raw vals: dev=%d (block=512 bytes) block=%d nblocks=%d\n", dev, block, nsect);
#endif #endif
if (dev >= (mfm_drives << 6) || if (unit >= mfm_drives ||
block >= mfm[dev].nr_sects || ((block+nsect) > mfm[dev].nr_sects)) { block >= get_capacity(mfm_gendisk + unit) ||
if (dev >= (mfm_drives << 6)) ((block+nsect) > get_capacity(mfm_gendisk + unit))) {
if (unit >= mfm_drives)
printk("mfm: bad minor number: device=%s\n", kdevname(CURRENT->rq_dev)); printk("mfm: bad minor number: device=%s\n", kdevname(CURRENT->rq_dev));
else else
printk("mfm%c: bad access: block=%d, count=%d, nr_sects=%ld\n", (dev >> 6)+'a', printk("mfm%c: bad access: block=%d, count=%d, nr_sects=%ld\n", unit+'a',
block, nsect, mfm[dev].nr_sects); block, nsect, get_capacity(mfm_gendisk+unit));
printk("mfm: continue 1\n"); printk("mfm: continue 1\n");
end_request(CURRENT, 0); end_request(CURRENT, 0);
Busy = 0; Busy = 0;
continue; continue;
} }
block += mfm[dev].start_sect;
/* DAG: Linux doesn't cope with this - even though it has an array telling /* DAG: Linux doesn't cope with this - even though it has an array telling
it the hardware block size - silly */ it the hardware block size - silly */
block <<= 1; /* Now in 256 byte sectors */ block <<= 1; /* Now in 256 byte sectors */
...@@ -1163,18 +1175,9 @@ static int mfm_initdrives(void) ...@@ -1163,18 +1175,9 @@ static int mfm_initdrives(void)
static int mfm_ioctl(struct inode *inode, struct file *file, u_int cmd, u_long arg) static int mfm_ioctl(struct inode *inode, struct file *file, u_int cmd, u_long arg)
{ {
struct hd_geometry *geo = (struct hd_geometry *) arg; struct hd_geometry *geo = (struct hd_geometry *) arg;
kdev_t dev; int device = DEVICE_NR(minor(inode->i_rdev));
int device, minor, err;
if (!inode || !(dev = inode->i_rdev))
return -EINVAL;
minor = minor(dev);
device = DEVICE_NR(minor(inode->i_rdev)), err;
if (device >= mfm_drives) if (device >= mfm_drives)
return -EINVAL; return -EINVAL;
if (cmd != HDIO_GETGEO) if (cmd != HDIO_GETGEO)
return -EINVAL; return -EINVAL;
if (!arg) if (!arg)
...@@ -1185,7 +1188,8 @@ static int mfm_ioctl(struct inode *inode, struct file *file, u_int cmd, u_long a ...@@ -1185,7 +1188,8 @@ static int mfm_ioctl(struct inode *inode, struct file *file, u_int cmd, u_long a
return -EFAULT; return -EFAULT;
if (put_user (mfm_info[device].cylinders, &geo->cylinders)) if (put_user (mfm_info[device].cylinders, &geo->cylinders))
return -EFAULT; return -EFAULT;
if (put_user (mfm[minor].start_sect, &geo->start)) start = get_start_sect(inode->i_bdev);
if (put_user (get_start_sect(inode->i_bdev), &geo->start))
return -EFAULT; return -EFAULT;
return 0; return 0;
} }
...@@ -1237,27 +1241,10 @@ void xd_set_geometry(struct block_device *bdev, unsigned char secsptrack, ...@@ -1237,27 +1241,10 @@ void xd_set_geometry(struct block_device *bdev, unsigned char secsptrack,
if (raw_cmd.dev == drive) if (raw_cmd.dev == drive)
mfm_specify (); mfm_specify ();
mfm_geometry (drive); mfm_geometry (drive);
mfm[drive << 6].start_sect = 0; set_capacity(&mfm_gendisk[drive], mfm_info[drive].cylinders * mfm_info[drive].heads * mfm_info[drive].sectors / 2);
mfm[drive << 6].nr_sects = mfm_info[drive].cylinders * mfm_info[drive].heads * mfm_info[drive].sectors / 2;
} }
} }
static struct gendisk mfm_gendisk[2] = {
{
.major = MAJOR_NR,
.first_minor = 0,
.major_name = "mfma",
.minor_shift = 6,
.part = mfm,
},
{
.major = MAJOR_NR,
.first_minor = 64,
.major_name = "mfmb",
.minor_shift = 6,
.part = mfm + 64,
};
static struct block_device_operations mfm_fops = static struct block_device_operations mfm_fops =
{ {
.owner = THIS_MODULE, .owner = THIS_MODULE,
...@@ -1280,7 +1267,6 @@ static void mfm_geninit (void) ...@@ -1280,7 +1267,6 @@ static void mfm_geninit (void)
outw(0x80, mfm_irqenable); /* Required to enable IRQs from MFM podule */ outw(0x80, mfm_irqenable); /* Required to enable IRQs from MFM podule */
for (i = 0; i < mfm_drives; i++) { for (i = 0; i < mfm_drives; i++) {
mfm_gendisk[i].nr_real = 1;
add_gendisk(mfm_gendisk + i); add_gendisk(mfm_gendisk + i);
mfm_geometry (i); mfm_geometry (i);
register_disk(mfm_gendisk + i, mk_kdev(MAJOR_NR,i<<6), 1<<6, register_disk(mfm_gendisk + i, mk_kdev(MAJOR_NR,i<<6), 1<<6,
......
...@@ -1968,12 +1968,10 @@ static boolean DAC960_RegisterBlockDevice(DAC960_Controller_T *Controller) ...@@ -1968,12 +1968,10 @@ static boolean DAC960_RegisterBlockDevice(DAC960_Controller_T *Controller)
struct gendisk *disk = &Controller->disks[n]; struct gendisk *disk = &Controller->disks[n];
memset(disk, 0, sizeof(struct gendisk)); memset(disk, 0, sizeof(struct gendisk));
sprintf(names + 9 * n, "rd/c%dd%d", Controller->ControllerNumber, n); sprintf(names + 9 * n, "rd/c%dd%d", Controller->ControllerNumber, n);
disk->part = Controller->DiskPartitions + (n<<DAC960_MaxPartitionsBits);
disk->major = MajorNumber; disk->major = MajorNumber;
disk->first_minor = n << DAC960_MaxPartitionsBits; disk->first_minor = n << DAC960_MaxPartitionsBits;
disk->major_name = names + 9 * n; disk->major_name = names + 9 * n;
disk->minor_shift = DAC960_MaxPartitionsBits; disk->minor_shift = DAC960_MaxPartitionsBits;
disk->nr_real = 1;
disk->fops = &DAC960_BlockDeviceOperations; disk->fops = &DAC960_BlockDeviceOperations;
add_gendisk(disk); add_gendisk(disk);
} }
...@@ -2034,10 +2032,9 @@ static long disk_size(DAC960_Controller_T *Controller, int disk) ...@@ -2034,10 +2032,9 @@ static long disk_size(DAC960_Controller_T *Controller, int disk)
static void DAC960_ComputeGenericDiskInfo(DAC960_Controller_T *Controller) static void DAC960_ComputeGenericDiskInfo(DAC960_Controller_T *Controller)
{ {
struct gendisk *disks = Controller->disks;
int disk; int disk;
for (disk = 0; disk < DAC960_MaxLogicalDrives; disk++) for (disk = 0; disk < DAC960_MaxLogicalDrives; disk++)
disks->part[0].nr_sects = disk_size(Controller, disk); set_capacity(Controller->disks + disk, disk_size(Controller, disk));
} }
static int DAC960_revalidate(kdev_t dev) static int DAC960_revalidate(kdev_t dev)
...@@ -2045,7 +2042,7 @@ static int DAC960_revalidate(kdev_t dev) ...@@ -2045,7 +2042,7 @@ static int DAC960_revalidate(kdev_t dev)
int ctlr = DAC960_ControllerNumber(dev); int ctlr = DAC960_ControllerNumber(dev);
int disk = DAC960_LogicalDriveNumber(dev); int disk = DAC960_LogicalDriveNumber(dev);
DAC960_Controller_T *p = DAC960_Controllers[ctlr]; DAC960_Controller_T *p = DAC960_Controllers[ctlr];
p->disks[disk].part[0].nr_sects = disk_size(p, disk); set_capacity(&p->disks[disk], disk_size(p, disk));
return 0; return 0;
} }
...@@ -5277,7 +5274,7 @@ static int DAC960_Open(Inode_T *Inode, File_T *File) ...@@ -5277,7 +5274,7 @@ static int DAC960_Open(Inode_T *Inode, File_T *File)
DAC960_KernelDevice(Controller->ControllerNumber, LogicalDriveNumber, 0), DAC960_KernelDevice(Controller->ControllerNumber, LogicalDriveNumber, 0),
DAC960_MaxPartitions, &DAC960_BlockDeviceOperations, size); DAC960_MaxPartitions, &DAC960_BlockDeviceOperations, size);
} }
if (Controller->disks[LogicalDriveNumber].part[0].nr_sects == 0) if (!get_capacity(&Controller->disks[LogicalDriveNumber]))
return -ENXIO; return -ENXIO;
/* /*
Increment Controller and Logical Drive Usage Counts. Increment Controller and Logical Drive Usage Counts.
......
...@@ -2196,7 +2196,6 @@ typedef struct file File_T; ...@@ -2196,7 +2196,6 @@ typedef struct file File_T;
typedef struct block_device_operations BlockDeviceOperations_T; typedef struct block_device_operations BlockDeviceOperations_T;
typedef struct completion Completion_T; typedef struct completion Completion_T;
typedef struct hd_geometry DiskGeometry_T; typedef struct hd_geometry DiskGeometry_T;
typedef struct hd_struct DiskPartition_T;
typedef struct inode Inode_T; typedef struct inode Inode_T;
typedef struct inode_operations InodeOperations_T; typedef struct inode_operations InodeOperations_T;
typedef kdev_t KernelDevice_T; typedef kdev_t KernelDevice_T;
...@@ -2472,7 +2471,6 @@ typedef struct DAC960_Controller ...@@ -2472,7 +2471,6 @@ typedef struct DAC960_Controller
boolean LogicalDriveFoundDuringScan[DAC960_MaxLogicalDrives]; boolean LogicalDriveFoundDuringScan[DAC960_MaxLogicalDrives];
} V2; } V2;
} FW; } FW;
DiskPartition_T DiskPartitions[DAC960_MinorCount];
unsigned char ProgressBuffer[DAC960_ProgressBufferSize]; unsigned char ProgressBuffer[DAC960_ProgressBufferSize];
unsigned char UserStatusBuffer[DAC960_UserMessageSize]; unsigned char UserStatusBuffer[DAC960_UserMessageSize];
} }
......
...@@ -245,7 +245,6 @@ char *acsi_buffer; ...@@ -245,7 +245,6 @@ char *acsi_buffer;
unsigned long phys_acsi_buffer; unsigned long phys_acsi_buffer;
static int NDevices; static int NDevices;
static struct hd_struct acsi_part[MAX_DEV<<4];
static char acsi_names[MAX_DEV*4]; static char acsi_names[MAX_DEV*4];
static int access_count[MAX_DEV]; static int access_count[MAX_DEV];
...@@ -783,7 +782,7 @@ static void read_intr( void ) ...@@ -783,7 +782,7 @@ static void read_intr( void )
status = acsi_getstatus(); status = acsi_getstatus();
if (status != 0) { if (status != 0) {
int dev = minor(CURRENT->rq_dev); int dev = DEVICE_NR(CURRENT->rq_dev);
printk( KERN_ERR "ad%c: ", dev+'a' ); printk( KERN_ERR "ad%c: ", dev+'a' );
if (!acsi_reqsense( acsi_buffer, acsi_info[dev].target, if (!acsi_reqsense( acsi_buffer, acsi_info[dev].target,
acsi_info[dev].lun)) acsi_info[dev].lun))
...@@ -814,7 +813,7 @@ static void write_intr(void) ...@@ -814,7 +813,7 @@ static void write_intr(void)
status = acsi_getstatus(); status = acsi_getstatus();
if (status != 0) { if (status != 0) {
int dev = minor(CURRENT->rq_dev); int dev = DEVICE_NR(CURRENT->rq_dev);
printk( KERN_ERR "ad%c: ", dev+'a' ); printk( KERN_ERR "ad%c: ", dev+'a' );
if (!acsi_reqsense( acsi_buffer, acsi_info[dev].target, if (!acsi_reqsense( acsi_buffer, acsi_info[dev].target,
acsi_info[dev].lun)) acsi_info[dev].lun))
...@@ -973,15 +972,15 @@ static void redo_acsi_request( void ) ...@@ -973,15 +972,15 @@ static void redo_acsi_request( void )
panic(DEVICE_NAME ": block not locked"); panic(DEVICE_NAME ": block not locked");
} }
dev = minor(CURRENT->rq_dev); dev = DEVICE_NR(CURRENT->rq_dev);
block = CURRENT->sector; block = CURRENT->sector;
if (dev >= NDevices || if (dev >= NDevices ||
block+CURRENT->nr_sectors >= acsi_part[dev].nr_sects) { block+CURRENT->nr_sectors >= get_capacity(acsi_gendisk + dev)) {
#ifdef DEBUG #ifdef DEBUG
printk( "ad%c: attempted access for blocks %d...%ld past end of device at block %ld.\n", printk( "ad%c: attempted access for blocks %d...%ld past end of device at block %ld.\n",
dev+'a', dev+'a',
block, block + CURRENT->nr_sectors - 1, block, block + CURRENT->nr_sectors - 1,
acsi_part[dev].nr_sects); get_capacity(acsi_gendisk + dev));
#endif #endif
end_request(CURRENT, 0); end_request(CURRENT, 0);
goto repeat; goto repeat;
...@@ -1088,11 +1087,7 @@ static void redo_acsi_request( void ) ...@@ -1088,11 +1087,7 @@ static void redo_acsi_request( void )
static int acsi_ioctl( struct inode *inode, struct file *file, static int acsi_ioctl( struct inode *inode, struct file *file,
unsigned int cmd, unsigned long arg ) unsigned int cmd, unsigned long arg )
{ {
dev_t dev; int dev = DEVICE_NR(inode->i_rdev);
if (!inode)
return -EINVAL;
dev = minor(inode->i_rdev);
if (dev >= NDevices) if (dev >= NDevices)
return -EINVAL; return -EINVAL;
switch (cmd) { switch (cmd) {
...@@ -1140,7 +1135,7 @@ static int acsi_open( struct inode * inode, struct file * filp ) ...@@ -1140,7 +1135,7 @@ static int acsi_open( struct inode * inode, struct file * filp )
int device; int device;
struct acsi_info_struct *aip; struct acsi_info_struct *aip;
device = minor(inode->i_rdev); device = DEVICE_NR(inode->i_rdev);
if (device >= NDevices) if (device >= NDevices)
return -ENXIO; return -ENXIO;
aip = &acsi_info[device]; aip = &acsi_info[device];
...@@ -1176,7 +1171,7 @@ static int acsi_open( struct inode * inode, struct file * filp ) ...@@ -1176,7 +1171,7 @@ static int acsi_open( struct inode * inode, struct file * filp )
static int acsi_release( struct inode * inode, struct file * file ) static int acsi_release( struct inode * inode, struct file * file )
{ {
int device = minor(inode->i_rdev); int device = DEVICE_NR(inode->i_rdev);
if (--access_count[device] == 0 && acsi_info[device].removable) if (--access_count[device] == 0 && acsi_info[device].removable)
acsi_prevent_removal(device, 0); acsi_prevent_removal(device, 0);
return( 0 ); return( 0 );
...@@ -1204,7 +1199,7 @@ static void acsi_prevent_removal(int device, int flag) ...@@ -1204,7 +1199,7 @@ static void acsi_prevent_removal(int device, int flag)
static int acsi_media_change (kdev_t dev) static int acsi_media_change (kdev_t dev)
{ {
int device = minor(dev); int device = DEVICE_NR(dev);
struct acsi_info_struct *aip; struct acsi_info_struct *aip;
aip = &acsi_info[device]; aip = &acsi_info[device];
...@@ -1702,9 +1697,7 @@ static void acsi_geninit(void) ...@@ -1702,9 +1697,7 @@ static void acsi_geninit(void)
disk->first_minor = i << 4; disk->first_minor = i << 4;
disk->major_name = acsi_names + 4*i; disk->major_name = acsi_names + 4*i;
disk->minor_shift = (acsi_info[i].type==HARDDISK)?4:0; disk->minor_shift = (acsi_info[i].type==HARDDISK)?4:0;
disk->part = acsi_part + (i<<4);
disk->fops = &acsi_fops; disk->fops = &acsi_fops;
disk->nr_real = 1;
add_gendisk(disk); add_gendisk(disk);
register_disk(disk, mk_kdev(disk->major, disk->first_minor), register_disk(disk, mk_kdev(disk->major, disk->first_minor),
1<<disk->minor_shift, 1<<disk->minor_shift,
...@@ -1808,7 +1801,7 @@ void cleanup_module(void) ...@@ -1808,7 +1801,7 @@ void cleanup_module(void)
static int acsi_revalidate(kdev_t dev) static int acsi_revalidate(kdev_t dev)
{ {
int unit = DEVICE_NR(minor(dev)); int unit = DEVICE_NR(dev);
struct acsi_info_struct *aip = &acsi_info[unit]; struct acsi_info_struct *aip = &acsi_info[unit];
stdma_lock( NULL, NULL ); stdma_lock( NULL, NULL );
if (acsi_devinit(aip) != DEV_SUPPORTED) { if (acsi_devinit(aip) != DEV_SUPPORTED) {
...@@ -1822,6 +1815,6 @@ static int acsi_revalidate(kdev_t dev) ...@@ -1822,6 +1815,6 @@ static int acsi_revalidate(kdev_t dev)
ENABLE_IRQ(); ENABLE_IRQ();
stdma_release(); stdma_release();
acsi_part[minor(dev)].nr_sects = aip->size; set_capacity(acsi_gendisk + unit, aip->size);
return 0; return 0;
} }
...@@ -71,7 +71,6 @@ int add_partition(struct block_device *bdev, struct blkpg_partition *p) ...@@ -71,7 +71,6 @@ int add_partition(struct block_device *bdev, struct blkpg_partition *p)
long pstart, plength; long pstart, plength;
int i; int i;
kdev_t dev = to_kdev_t(bdev->bd_dev); kdev_t dev = to_kdev_t(bdev->bd_dev);
struct hd_struct *part;
/* convert bytes to sectors, check for fit in a hd_struct */ /* convert bytes to sectors, check for fit in a hd_struct */
ppstart = (p->start >> 9); ppstart = (p->start >> 9);
...@@ -86,7 +85,6 @@ int add_partition(struct block_device *bdev, struct blkpg_partition *p) ...@@ -86,7 +85,6 @@ int add_partition(struct block_device *bdev, struct blkpg_partition *p)
g = get_gendisk(dev); g = get_gendisk(dev);
if (!g) if (!g)
return -ENXIO; return -ENXIO;
part = g->part + minor(dev) - g->first_minor;
/* existing drive? */ /* existing drive? */
...@@ -97,19 +95,19 @@ int add_partition(struct block_device *bdev, struct blkpg_partition *p) ...@@ -97,19 +95,19 @@ int add_partition(struct block_device *bdev, struct blkpg_partition *p)
return -EINVAL; return -EINVAL;
/* partition number in use? */ /* partition number in use? */
if (part[p->pno].nr_sects != 0) if (g->part[p->pno - 1].nr_sects != 0)
return -EBUSY; return -EBUSY;
/* overlap? */ /* overlap? */
for (i = 1; i < (1<<g->minor_shift); i++) for (i = 0; i < (1<<g->minor_shift) - 1; i++)
if (!(pstart+plength <= part[i].start_sect || if (!(pstart+plength <= g->part[i].start_sect ||
pstart >= part[i].start_sect + part[i].nr_sects)) pstart >= g->part[i].start_sect + g->part[i].nr_sects))
return -EBUSY; return -EBUSY;
/* all seems OK */ /* all seems OK */
part[p->pno].start_sect = pstart; g->part[p->pno - 1].start_sect = pstart;
part[p->pno].nr_sects = plength; g->part[p->pno - 1].nr_sects = plength;
devfs_register_partitions (g, minor(dev), 0); update_partition(g, p->pno);
return 0; return 0;
} }
...@@ -128,22 +126,19 @@ int del_partition(struct block_device *bdev, struct blkpg_partition *p) ...@@ -128,22 +126,19 @@ int del_partition(struct block_device *bdev, struct blkpg_partition *p)
kdev_t dev = to_kdev_t(bdev->bd_dev); kdev_t dev = to_kdev_t(bdev->bd_dev);
struct gendisk *g; struct gendisk *g;
struct block_device *bdevp; struct block_device *bdevp;
struct hd_struct *part;
int holder; int holder;
/* find the drive major */ /* find the drive major */
g = get_gendisk(dev); g = get_gendisk(dev);
if (!g) if (!g)
return -ENXIO; return -ENXIO;
part = g->part + minor(dev) - g->first_minor;
if (bdev != bdev->bd_contains) if (bdev != bdev->bd_contains)
return -EINVAL; return -EINVAL;
if (p->pno <= 0 || p->pno >= (1 << g->minor_shift)) if (p->pno <= 0 || p->pno >= (1 << g->minor_shift))
return -EINVAL; return -EINVAL;
/* existing drive and partition? */ /* existing drive and partition? */
if (part[p->pno].nr_sects == 0) if (g->part[p->pno - 1].nr_sects == 0)
return -ENXIO; return -ENXIO;
/* partition in use? Incomplete check for now. */ /* partition in use? Incomplete check for now. */
...@@ -159,9 +154,9 @@ int del_partition(struct block_device *bdev, struct blkpg_partition *p) ...@@ -159,9 +154,9 @@ int del_partition(struct block_device *bdev, struct blkpg_partition *p)
fsync_bdev(bdevp); fsync_bdev(bdevp);
invalidate_bdev(bdevp, 0); invalidate_bdev(bdevp, 0);
part[p->pno].start_sect = 0; g->part[p->pno - 1].start_sect = 0;
part[p->pno].nr_sects = 0; g->part[p->pno - 1].nr_sects = 0;
devfs_register_partitions (g, minor(dev), 0); update_partition(g, p->pno);
bd_release(bdevp); bd_release(bdevp);
bdput(bdevp); bdput(bdevp);
......
...@@ -407,8 +407,7 @@ static int cciss_ioctl(struct inode *inode, struct file *filep, ...@@ -407,8 +407,7 @@ static int cciss_ioctl(struct inode *inode, struct file *filep,
driver_geo.sectors = 0x3f; driver_geo.sectors = 0x3f;
driver_geo.cylinders = hba[ctlr]->drv[dsk].nr_blocks / (0xff*0x3f); driver_geo.cylinders = hba[ctlr]->drv[dsk].nr_blocks / (0xff*0x3f);
} }
driver_geo.start= driver_geo.start= get_start_sect(inode->i_bdev);
hba[ctlr]->hd[minor(inode->i_rdev)].start_sect;
if (copy_to_user((void *) arg, &driver_geo, if (copy_to_user((void *) arg, &driver_geo,
sizeof( struct hd_geometry))) sizeof( struct hd_geometry)))
return -EFAULT; return -EFAULT;
...@@ -705,7 +704,7 @@ static int cciss_revalidate(kdev_t dev) ...@@ -705,7 +704,7 @@ static int cciss_revalidate(kdev_t dev)
int ctlr = major(dev) - MAJOR_NR; int ctlr = major(dev) - MAJOR_NR;
int target = minor(dev) >> NWD_SHIFT; int target = minor(dev) >> NWD_SHIFT;
struct gendisk *disk = &hba[ctlr]->gendisk[target]; struct gendisk *disk = &hba[ctlr]->gendisk[target];
disk->part[0].nr_sects = hba[ctlr]->drv[target].nr_blocks; set_capacity(disk, hba[ctlr]->drv[target].nr_blocks);
return 0; return 0;
} }
...@@ -742,7 +741,6 @@ static int revalidate_allvol(kdev_t dev) ...@@ -742,7 +741,6 @@ static int revalidate_allvol(kdev_t dev)
for(i=0; i< NWD; i++) { for(i=0; i< NWD; i++) {
struct gendisk *disk = &hba[ctlr]->gendisk[i]; struct gendisk *disk = &hba[ctlr]->gendisk[i];
if (disk->major_name) { if (disk->major_name) {
wipe_partitions(mk_kdev(disk->major, disk->first_minor));
del_gendisk(disk); del_gendisk(disk);
disk->major_name = NULL; disk->major_name = NULL;
} }
...@@ -752,7 +750,6 @@ static int revalidate_allvol(kdev_t dev) ...@@ -752,7 +750,6 @@ static int revalidate_allvol(kdev_t dev)
* Set the partition and block size structures for all volumes * Set the partition and block size structures for all volumes
* on this controller to zero. We will reread all of this data * on this controller to zero. We will reread all of this data
*/ */
memset(hba[ctlr]->hd, 0, sizeof(struct hd_struct) * 256);
memset(hba[ctlr]->drv, 0, sizeof(drive_info_struct) memset(hba[ctlr]->drv, 0, sizeof(drive_info_struct)
* CISS_MAX_LUN); * CISS_MAX_LUN);
/* /*
...@@ -802,7 +799,6 @@ static int deregister_disk(int ctlr, int logvol) ...@@ -802,7 +799,6 @@ static int deregister_disk(int ctlr, int logvol)
/* invalidate the devices and deregister the disk */ /* invalidate the devices and deregister the disk */
if (disk->major_name) { if (disk->major_name) {
wipe_partitions(mk_kdev(disk->major, disk->first_minor));
del_gendisk(disk); del_gendisk(disk);
disk->major_name = NULL; disk->major_name = NULL;
} }
...@@ -2448,8 +2444,6 @@ static int __init cciss_init_one(struct pci_dev *pdev, ...@@ -2448,8 +2444,6 @@ static int __init cciss_init_one(struct pci_dev *pdev,
disk->first_minor = j << NWD_SHIFT; disk->first_minor = j << NWD_SHIFT;
disk->major_name = NULL; disk->major_name = NULL;
disk->minor_shift = NWD_SHIFT; disk->minor_shift = NWD_SHIFT;
disk->part = hba[i]->hd + (j << NWD_SHIFT);
disk->nr_real = 1;
if( !(drv->nr_blocks)) if( !(drv->nr_blocks))
continue; continue;
(BLK_DEFAULT_QUEUE(MAJOR_NR + i))->hardsect_size = drv->block_size; (BLK_DEFAULT_QUEUE(MAJOR_NR + i))->hardsect_size = drv->block_size;
......
...@@ -83,9 +83,6 @@ struct ctlr_info ...@@ -83,9 +83,6 @@ struct ctlr_info
// Disk structures we need to pass back // Disk structures we need to pass back
struct gendisk gendisk[NWD]; struct gendisk gendisk[NWD];
char names[12 * NWD]; char names[12 * NWD];
// indexed by minor numbers
struct hd_struct hd[256];
int sizes[256];
#ifdef CONFIG_CISS_SCSI_TAPE #ifdef CONFIG_CISS_SCSI_TAPE
void *scsi_ctlr; /* ptr to structure containing scsi related stuff */ void *scsi_ctlr; /* ptr to structure containing scsi related stuff */
#endif #endif
......
...@@ -75,7 +75,6 @@ MODULE_LICENSE("GPL"); ...@@ -75,7 +75,6 @@ MODULE_LICENSE("GPL");
static int nr_ctlr; static int nr_ctlr;
static ctlr_info_t *hba[MAX_CTLR]; static ctlr_info_t *hba[MAX_CTLR];
static devfs_handle_t de_arr[MAX_CTLR][NWD];
static int eisa[8]; static int eisa[8];
...@@ -103,7 +102,6 @@ static struct board_type products[] = { ...@@ -103,7 +102,6 @@ static struct board_type products[] = {
{ 0x40580E11, "Smart Array 431", &smart4_access }, { 0x40580E11, "Smart Array 431", &smart4_access },
}; };
static struct hd_struct * ida;
static char *ida_names; static char *ida_names;
static struct gendisk ida_gendisk[MAX_CTLR * NWD]; static struct gendisk ida_gendisk[MAX_CTLR * NWD];
...@@ -321,7 +319,6 @@ void cleanup_module(void) ...@@ -321,7 +319,6 @@ void cleanup_module(void)
} }
devfs_find_and_unregister(NULL, "ida", 0, 0, 0, 0); devfs_find_and_unregister(NULL, "ida", 0, 0, 0, 0);
remove_proc_entry("cpqarray", proc_root_driver); remove_proc_entry("cpqarray", proc_root_driver);
kfree(ida);
kfree(ida_names); kfree(ida_names);
} }
#endif /* MODULE */ #endif /* MODULE */
...@@ -347,15 +344,12 @@ int __init cpqarray_init(void) ...@@ -347,15 +344,12 @@ int __init cpqarray_init(void)
printk("Found %d controller(s)\n", nr_ctlr); printk("Found %d controller(s)\n", nr_ctlr);
/* allocate space for disk structs */ /* allocate space for disk structs */
ida = kmalloc(sizeof(struct hd_struct)*nr_ctlr*NWD*16, GFP_KERNEL);
ida_names = kmalloc(nr_ctlr*NWD*10, GFP_KERNEL); ida_names = kmalloc(nr_ctlr*NWD*10, GFP_KERNEL);
if (!ida || !ida_names) { if (!ida_names) {
printk( KERN_ERR "cpqarray: out of memory"); printk( KERN_ERR "cpqarray: out of memory");
kfree(ida);
kfree(ida_names); kfree(ida_names);
return(num_cntlrs_reg); return(num_cntlrs_reg);
} }
memset(ida, 0, sizeof(struct hd_struct)*nr_ctlr*NWD*16);
/* /*
* register block devices * register block devices
* Find disks and fill in structs * Find disks and fill in structs
...@@ -408,7 +402,6 @@ int __init cpqarray_init(void) ...@@ -408,7 +402,6 @@ int __init cpqarray_init(void)
if (num_cntlrs_reg == 0) if (num_cntlrs_reg == 0)
{ {
kfree(ida);
kfree(ida_names); kfree(ida_names);
} }
return(num_cntlrs_reg); return(num_cntlrs_reg);
...@@ -450,9 +443,7 @@ int __init cpqarray_init(void) ...@@ -450,9 +443,7 @@ int __init cpqarray_init(void)
disk->major = MAJOR_NR + i; disk->major = MAJOR_NR + i;
disk->first_minor = j<<NWD_SHIFT; disk->first_minor = j<<NWD_SHIFT;
disk->minor_shift = NWD_SHIFT; disk->minor_shift = NWD_SHIFT;
disk->part = ida + i*256 + (j<<NWD_SHIFT); disk->flags = GENHD_FL_DEVFS;
disk->nr_real = 1;
disk->de_arr = &de_arr[i][j];
disk->fops = &ida_fops; disk->fops = &ida_fops;
if (!drv->nr_blks) if (!drv->nr_blks)
continue; continue;
...@@ -1461,11 +1452,9 @@ static int revalidate_allvol(kdev_t dev) ...@@ -1461,11 +1452,9 @@ static int revalidate_allvol(kdev_t dev)
struct gendisk *disk = ida_gendisk + ctlr*NWD + i; struct gendisk *disk = ida_gendisk + ctlr*NWD + i;
if (!disk->major_name) if (!disk->major_name)
continue; continue;
wipe_partitions(mk_kdev(disk->major, disk->first_minor));
del_gendisk(disk); del_gendisk(disk);
disk->major_name = NULL; disk->major_name = NULL;
} }
memset(ida+(ctlr*256), 0, sizeof(struct hd_struct)*NWD*16);
memset(hba[ctlr]->drv, 0, sizeof(drv_info_t)*NWD); memset(hba[ctlr]->drv, 0, sizeof(drv_info_t)*NWD);
/* /*
...@@ -1500,7 +1489,7 @@ static int ida_revalidate(kdev_t dev) ...@@ -1500,7 +1489,7 @@ static int ida_revalidate(kdev_t dev)
int ctlr = major(dev) - MAJOR_NR; int ctlr = major(dev) - MAJOR_NR;
int target = DEVICE_NR(dev); int target = DEVICE_NR(dev);
struct gendisk *gdev = &ida_gendisk[ctlr*NWD+target]; struct gendisk *gdev = &ida_gendisk[ctlr*NWD+target];
gdev->part[minor(dev)].nr_sects = hba[ctlr]->drv[target].nr_blks; set_capacity(gdev, hba[ctlr]->drv[target].nr_blks);
return 0; return 0;
} }
...@@ -1667,6 +1656,7 @@ static void getgeometry(int ctlr) ...@@ -1667,6 +1656,7 @@ static void getgeometry(int ctlr)
(log_index < id_ctlr_buf->nr_drvs) (log_index < id_ctlr_buf->nr_drvs)
&& (log_unit < NWD); && (log_unit < NWD);
log_unit++) { log_unit++) {
struct gendisk *disk = ida_gendisk + ctlr * NWD + log_unit;
size = sizeof(sense_log_drv_stat_t); size = sizeof(sense_log_drv_stat_t);
...@@ -1731,13 +1721,10 @@ static void getgeometry(int ctlr) ...@@ -1731,13 +1721,10 @@ static void getgeometry(int ctlr)
return; return;
} }
if (!de_arr[ctlr][log_unit]) { if (!disk->de) {
char txt[16]; char txt[16];
sprintf(txt,"ida/c%dd%d",ctlr,log_unit);
sprintf(txt, "ida/c%dd%d", ctlr, disk->de = devfs_mk_dir(NULL,txt,NULL);
log_unit);
de_arr[ctlr][log_unit] =
devfs_mk_dir(NULL, txt, NULL);
} }
info_p->phys_drives = info_p->phys_drives =
sense_config_buf->ctlr_phys_drv; sense_config_buf->ctlr_phys_drv;
......
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/seq_file.h> #include <linux/seq_file.h>
#include <linux/slab.h>
static rwlock_t gendisk_lock; static rwlock_t gendisk_lock;
...@@ -43,6 +44,19 @@ void ...@@ -43,6 +44,19 @@ void
add_gendisk(struct gendisk *gp) add_gendisk(struct gendisk *gp)
{ {
struct gendisk *sgp; struct gendisk *sgp;
struct hd_struct *p = NULL;
if (gp->minor_shift) {
size_t size = sizeof(struct hd_struct)*((1<<gp->minor_shift)-1);
p = kmalloc(size, GFP_KERNEL);
if (!p) {
printk(KERN_ERR "out of memory; no partitions for %s\n",
gp->major_name);
gp->minor_shift = 0;
} else
memset(p, 0, size);
}
gp->part = p;
write_lock(&gendisk_lock); write_lock(&gendisk_lock);
...@@ -67,32 +81,20 @@ add_gendisk(struct gendisk *gp) ...@@ -67,32 +81,20 @@ add_gendisk(struct gendisk *gp)
} }
EXPORT_SYMBOL(add_gendisk); EXPORT_SYMBOL(add_gendisk);
EXPORT_SYMBOL(del_gendisk);
void unlink_gendisk(struct gendisk *disk)
/**
* del_gendisk - remove partitioning information from kernel list
* @gp: per-device partitioning information
*
* This function unregisters the partitioning information in @gp
* with the kernel.
*/
void
del_gendisk(struct gendisk *gp)
{ {
struct gendisk **gpp; struct gendisk **p;
write_lock(&gendisk_lock); write_lock(&gendisk_lock);
for (gpp = &gendisk_head; *gpp; gpp = &((*gpp)->next)) for (p = &gendisk_head; *p; p = &((*p)->next))
if (*gpp == gp) if (*p == disk)
break; break;
if (*gpp) if (*p)
*gpp = (*gpp)->next; *p = (*p)->next;
write_unlock(&gendisk_lock); write_unlock(&gendisk_lock);
} }
EXPORT_SYMBOL(del_gendisk);
/** /**
* get_gendisk - get partitioning information for a given device * get_gendisk - get partitioning information for a given device
* @dev: device to get partitioning information for * @dev: device to get partitioning information for
...@@ -160,14 +162,17 @@ static int show_partition(struct seq_file *part, void *v) ...@@ -160,14 +162,17 @@ static int show_partition(struct seq_file *part, void *v)
seq_puts(part, "major minor #blocks name\n\n"); seq_puts(part, "major minor #blocks name\n\n");
/* show the full disk and all non-0 size partitions of it */ /* show the full disk and all non-0 size partitions of it */
for (n = 0; n < (sgp->nr_real << sgp->minor_shift); n++) { seq_printf(part, "%4d %4d %10ld %s\n",
int minormask = (1<<sgp->minor_shift) - 1; sgp->major, sgp->first_minor,
if ((n & minormask) && sgp->part[n].nr_sects == 0) get_capacity(sgp) >> 1,
disk_name(sgp, 0, buf));
for (n = 0; n < (1<<sgp->minor_shift) - 1; n++) {
if (sgp->part[n].nr_sects == 0)
continue; continue;
seq_printf(part, "%4d %4d %10ld %s\n", seq_printf(part, "%4d %4d %10ld %s\n",
sgp->major, n + sgp->first_minor, sgp->major, n + 1 + sgp->first_minor,
sgp->part[n].nr_sects >> 1 , sgp->part[n].nr_sects >> 1 ,
disk_name(sgp, n + sgp->first_minor, buf)); disk_name(sgp, n + 1, buf));
} }
return 0; return 0;
......
This diff is collapsed.
...@@ -271,8 +271,6 @@ static void pd_doorlock(int unit, int func); ...@@ -271,8 +271,6 @@ static void pd_doorlock(int unit, int func);
static int pd_check_media(kdev_t dev); static int pd_check_media(kdev_t dev);
static void pd_eject( int unit); static void pd_eject( int unit);
static struct hd_struct pd_hd[PD_DEVS];
#define PD_NAMELEN 8 #define PD_NAMELEN 8
struct pd_unit { struct pd_unit {
...@@ -438,9 +436,9 @@ static int pd_revalidate(kdev_t dev) ...@@ -438,9 +436,9 @@ static int pd_revalidate(kdev_t dev)
if ((unit >= PD_UNITS) || !PD.present) if ((unit >= PD_UNITS) || !PD.present)
return -ENODEV; return -ENODEV;
if (pd_identify(unit)) if (pd_identify(unit))
pd_hd[minor(dev)].nr_sects = PD.capacity; set_capacity(&PD.gd, PD.capacity);
else else
pd_hd[minor(dev)].nr_sects = 0; set_capacity(&PD.gd, 0);
return 0; return 0;
} }
...@@ -687,10 +685,8 @@ static int pd_detect( void ) ...@@ -687,10 +685,8 @@ static int pd_detect( void )
PD.gd.major_name = PD.name; PD.gd.major_name = PD.name;
PD.gd.minor_shift = PD_BITS; PD.gd.minor_shift = PD_BITS;
PD.gd.fops = &pd_fops; PD.gd.fops = &pd_fops;
PD.gd.nr_real = 1;
PD.gd.major = major; PD.gd.major = major;
PD.gd.first_minor = unit << PD_BITS; PD.gd.first_minor = unit << PD_BITS;
PD.gd.part = pd_hd + (unit << PD_BITS);
add_gendisk(&PD.gd); add_gendisk(&PD.gd);
register_disk(&PD.gd,mk_kdev(MAJOR_NR,unit<<PD_BITS), register_disk(&PD.gd,mk_kdev(MAJOR_NR,unit<<PD_BITS),
PD_PARTNS,&pd_fops, PD_PARTNS,&pd_fops,
...@@ -728,7 +724,7 @@ static void do_pd_request (request_queue_t * q) ...@@ -728,7 +724,7 @@ static void do_pd_request (request_queue_t * q)
pd_count = CURRENT->current_nr_sectors; pd_count = CURRENT->current_nr_sectors;
if ((pd_dev >= PD_DEVS) || if ((pd_dev >= PD_DEVS) ||
((pd_block+pd_count) > pd_hd[pd_dev].nr_sects)) { ((pd_block+pd_count) > get_capacity(&pd[unit].gd))) {
end_request(CURRENT, 0); end_request(CURRENT, 0);
goto repeat; goto repeat;
} }
......
...@@ -109,7 +109,6 @@ static DECLARE_WAIT_QUEUE_HEAD(ps2esdi_int); ...@@ -109,7 +109,6 @@ static DECLARE_WAIT_QUEUE_HEAD(ps2esdi_int);
static int no_int_yet; static int no_int_yet;
static int ps2esdi_drives; static int ps2esdi_drives;
static struct hd_struct ps2esdi[MAX_HD << 6];
static u_short io_base; static u_short io_base;
static struct timer_list esdi_timer = { function: ps2esdi_reset_timer }; static struct timer_list esdi_timer = { function: ps2esdi_reset_timer };
static int reset_status; static int reset_status;
...@@ -152,17 +151,13 @@ static struct gendisk ps2esdi_gendisk[2] = { ...@@ -152,17 +151,13 @@ static struct gendisk ps2esdi_gendisk[2] = {
major_name: "eda", major_name: "eda",
first_minor: 0, first_minor: 0,
minor_shift: 6, minor_shift: 6,
part: ps2esdi,
fops: &ps2esdi_fops, fops: &ps2esdi_fops,
nr_real: 1
},{ },{
major: MAJOR_NR, major: MAJOR_NR,
first_minor: 64, first_minor: 64,
major_name: "edb", major_name: "edb",
minor_shift: 6, minor_shift: 6,
part: ps2esdi+64,
fops: &ps2esdi_fops, fops: &ps2esdi_fops,
nr_real: 1
} }
}; };
...@@ -489,6 +484,7 @@ static void __init ps2esdi_get_device_cfg(void) ...@@ -489,6 +484,7 @@ static void __init ps2esdi_get_device_cfg(void)
static void do_ps2esdi_request(request_queue_t * q) static void do_ps2esdi_request(request_queue_t * q)
{ {
u_int block, count; u_int block, count;
int unit;
/* since, this routine is called with interrupts cleared - they /* since, this routine is called with interrupts cleared - they
must be before it finishes */ must be before it finishes */
...@@ -505,18 +501,19 @@ static void do_ps2esdi_request(request_queue_t * q) ...@@ -505,18 +501,19 @@ static void do_ps2esdi_request(request_queue_t * q)
if (blk_queue_empty(QUEUE)) if (blk_queue_empty(QUEUE))
return; return;
unit = DEVICE_NR(CURRENT->rq_dev);
if (isa_virt_to_bus(CURRENT->buffer + CURRENT->current_nr_sectors * 512) > 16 * MB) { if (isa_virt_to_bus(CURRENT->buffer + CURRENT->current_nr_sectors * 512) > 16 * MB) {
printk("%s: DMA above 16MB not supported\n", DEVICE_NAME); printk("%s: DMA above 16MB not supported\n", DEVICE_NAME);
end_request(CURRENT, FAIL); end_request(CURRENT, FAIL);
} /* check for above 16Mb dmas */ } /* check for above 16Mb dmas */
else if ((DEVICE_NR(CURRENT->rq_dev) < ps2esdi_drives) && else if ((unit < ps2esdi_drives) &&
(CURRENT->sector + CURRENT->current_nr_sectors <= (CURRENT->sector + CURRENT->current_nr_sectors <=
ps2esdi[minor(CURRENT->rq_dev)].nr_sects) && get_capacity(&ps2esdi_gendisk[unit])) &&
CURRENT->flags & REQ_CMD) { CURRENT->flags & REQ_CMD) {
#if 0 #if 0
printk("%s:got request. device : %d minor : %d command : %d sector : %ld count : %ld\n", printk("%s:got request. device : %d minor : %d command : %d sector : %ld count : %ld\n",
DEVICE_NAME, DEVICE_NAME,
DEVICE_NR(CURRENT->rq_dev), minor(CURRENT->rq_dev), unit, minor(CURRENT->rq_dev),
CURRENT->cmd, CURRENT->sector, CURRENT->cmd, CURRENT->sector,
CURRENT->current_nr_sectors); CURRENT->current_nr_sectors);
#endif #endif
...@@ -526,10 +523,10 @@ static void do_ps2esdi_request(request_queue_t * q) ...@@ -526,10 +523,10 @@ static void do_ps2esdi_request(request_queue_t * q)
switch (rq_data_dir(CURRENT)) { switch (rq_data_dir(CURRENT)) {
case READ: case READ:
ps2esdi_readwrite(READ, DEVICE_NR(CURRENT->rq_dev), block, count); ps2esdi_readwrite(READ, unit, block, count);
break; break;
case WRITE: case WRITE:
ps2esdi_readwrite(WRITE, DEVICE_NR(CURRENT->rq_dev), block, count); ps2esdi_readwrite(WRITE, unit, block, count);
break; break;
default: default:
printk("%s: Unknown command\n", DEVICE_NAME); printk("%s: Unknown command\n", DEVICE_NAME);
...@@ -540,7 +537,7 @@ static void do_ps2esdi_request(request_queue_t * q) ...@@ -540,7 +537,7 @@ static void do_ps2esdi_request(request_queue_t * q)
/* is request is valid */ /* is request is valid */
else { else {
printk("Grrr. error. ps2esdi_drives: %d, %lu %lu\n", ps2esdi_drives, printk("Grrr. error. ps2esdi_drives: %d, %lu %lu\n", ps2esdi_drives,
CURRENT->sector, ps2esdi[minor(CURRENT->rq_dev)].nr_sects); CURRENT->sector, get_capacity(&ps2esdi_gendisk[unit]));
end_request(CURRENT, FAIL); end_request(CURRENT, FAIL);
} }
......
...@@ -159,9 +159,6 @@ static struct cardinfo cards[MM_MAXCARDS]; ...@@ -159,9 +159,6 @@ static struct cardinfo cards[MM_MAXCARDS];
static struct block_device_operations mm_fops; static struct block_device_operations mm_fops;
static struct timer_list battery_timer; static struct timer_list battery_timer;
static struct hd_struct mm_partitions[MM_MAXCARDS << MM_SHIFT];
static int num_cards = 0; static int num_cards = 0;
static struct gendisk mm_gendisk[MM_MAXCARDS]; static struct gendisk mm_gendisk[MM_MAXCARDS];
...@@ -812,7 +809,7 @@ static void del_battery_timer(void) ...@@ -812,7 +809,7 @@ static void del_battery_timer(void)
static int mm_revalidate(kdev_t i_rdev) static int mm_revalidate(kdev_t i_rdev)
{ {
int card_number = DEVICE_NR(i_rdev); int card_number = DEVICE_NR(i_rdev);
mm_partitions[minor(i_rdev)].nr_sects = cards[card_number].mm_size << 1; set_capacity(mm_gendisk + card_number, cards[card_number].mm_size << 1);
return 0; return 0;
} }
/* /*
...@@ -1192,8 +1189,6 @@ int __init mm_init(void) ...@@ -1192,8 +1189,6 @@ int __init mm_init(void)
struct gendisk *disk = mm_gendisk + i; struct gendisk *disk = mm_gendisk + i;
sprintf(mm_names + i*6, "umem%c", 'a'+i); sprintf(mm_names + i*6, "umem%c", 'a'+i);
spin_lock_init(&cards[i].lock); spin_lock_init(&cards[i].lock);
disk->part = mm_partitions + (i << MM_SHIFT);
disk->nr_real = 1;
disk->major = major_nr; disk->major = major_nr;
disk->first_minor = i << MM_SHIFT; disk->first_minor = i << MM_SHIFT;
disk->major_name = mm_names + i*6; disk->major_name = mm_names + i*6;
...@@ -1222,10 +1217,8 @@ void __exit mm_cleanup(void) ...@@ -1222,10 +1217,8 @@ void __exit mm_cleanup(void)
del_battery_timer(); del_battery_timer();
for (i=0; i < num_cards ; i++) { for (i=0; i < num_cards ; i++)
devfs_register_partitions(mm_gendisk + i, i<<MM_SHIFT, 1);
del_gendisk(mm_gendisk + i); del_gendisk(mm_gendisk + i);
}
if (devfs_handle) if (devfs_handle)
devfs_unregister(devfs_handle); devfs_unregister(devfs_handle);
devfs_handle = NULL; devfs_handle = NULL;
......
...@@ -121,8 +121,6 @@ static unsigned int xd_bases[] __initdata = ...@@ -121,8 +121,6 @@ static unsigned int xd_bases[] __initdata =
0xE0000 0xE0000
}; };
static struct hd_struct xd_struct[XD_MAXDRIVES << 6];
static spinlock_t xd_lock = SPIN_LOCK_UNLOCKED; static spinlock_t xd_lock = SPIN_LOCK_UNLOCKED;
extern struct block_device_operations xd_fops; extern struct block_device_operations xd_fops;
...@@ -133,17 +131,13 @@ static struct gendisk xd_gendisk[2] = { ...@@ -133,17 +131,13 @@ static struct gendisk xd_gendisk[2] = {
.first_minor = 0, .first_minor = 0,
.major_name = "xda", .major_name = "xda",
.minor_shift = 6, .minor_shift = 6,
.part = xd_struct,
.fops = &xd_fops, .fops = &xd_fops,
.nr_real = 1
},{ },{
.major = MAJOR_NR, .major = MAJOR_NR,
.first_minor = 64, .first_minor = 64,
.major_name = "xdb", .major_name = "xdb",
.minor_shift = 6, .minor_shift = 6,
.part = xd_struct + 64,
.fops = &xd_fops, .fops = &xd_fops,
.nr_real = 1
} }
}; };
...@@ -281,15 +275,17 @@ static void do_xd_request (request_queue_t * q) ...@@ -281,15 +275,17 @@ static void do_xd_request (request_queue_t * q)
return; return;
while (1) { while (1) {
int unit;
code = 0; code = 0;
/* do some checking on the request structure */ /* do some checking on the request structure */
if (blk_queue_empty(QUEUE)) if (blk_queue_empty(QUEUE))
return; return;
if (DEVICE_NR(CURRENT->rq_dev) < xd_drives unit = DEVICE_NR(CURRENT->rq_dev);
if (unit < xd_drives
&& (CURRENT->flags & REQ_CMD) && (CURRENT->flags & REQ_CMD)
&& CURRENT->sector + CURRENT->nr_sectors && CURRENT->sector + CURRENT->nr_sectors
<= xd_struct[minor(CURRENT->rq_dev)].nr_sects) { <= get_capacity(xd_gendisk + unit)) {
block = CURRENT->sector; block = CURRENT->sector;
count = CURRENT->nr_sectors; count = CURRENT->nr_sectors;
...@@ -297,7 +293,7 @@ static void do_xd_request (request_queue_t * q) ...@@ -297,7 +293,7 @@ static void do_xd_request (request_queue_t * q)
case READ: case READ:
case WRITE: case WRITE:
for (retry = 0; (retry < XD_RETRIES) && !code; retry++) for (retry = 0; (retry < XD_RETRIES) && !code; retry++)
code = xd_readwrite(rq_data_dir(CURRENT),DEVICE_NR(CURRENT->rq_dev), code = xd_readwrite(rq_data_dir(CURRENT),unit,
CURRENT->buffer,block,count); CURRENT->buffer,block,count);
break; break;
default: default:
......
...@@ -254,6 +254,7 @@ ...@@ -254,6 +254,7 @@
#include <linux/config.h> #include <linux/config.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/fs.h> #include <linux/fs.h>
#include <linux/buffer_head.h>
#include <linux/major.h> #include <linux/major.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/errno.h> #include <linux/errno.h>
...@@ -1608,6 +1609,7 @@ int cdrom_ioctl(struct inode *ip, struct file *fp, unsigned int cmd, ...@@ -1608,6 +1609,7 @@ int cdrom_ioctl(struct inode *ip, struct file *fp, unsigned int cmd,
cdinfo(CD_DO_IOCTL, "entering CDROM_RESET\n"); cdinfo(CD_DO_IOCTL, "entering CDROM_RESET\n");
if (!CDROM_CAN(CDC_RESET)) if (!CDROM_CAN(CDC_RESET))
return -ENOSYS; return -ENOSYS;
invalidate_buffers(dev);
return cdo->reset(cdi); return cdo->reset(cdi);
} }
......
...@@ -331,12 +331,11 @@ static struct timer_list cdu31a_abort_timer; ...@@ -331,12 +331,11 @@ static struct timer_list cdu31a_abort_timer;
from the abort read. */ from the abort read. */
static int abort_read_started = 0; static int abort_read_started = 0;
/* /*
* This routine returns 1 if the disk has been changed since the last * Uniform cdrom interface function
* check or 0 if it hasn't. * report back, if disc has changed from time of last request.
*/ */
static int scd_disk_change(kdev_t full_dev) static int scd_media_changed(struct cdrom_device_info *cdi, int disc_nr)
{ {
int retval; int retval;
...@@ -346,15 +345,6 @@ static int scd_disk_change(kdev_t full_dev) ...@@ -346,15 +345,6 @@ static int scd_disk_change(kdev_t full_dev)
return retval; return retval;
} }
/*
* Uniform cdrom interface function
* report back, if disc has changed from time of last request.
*/
static int scd_media_changed(struct cdrom_device_info *cdi, int disc_nr)
{
return scd_disk_change(cdi->dev);
}
/* /*
* Uniform cdrom interface function * Uniform cdrom interface function
* report back, if drive is ready * report back, if drive is ready
......
...@@ -73,7 +73,6 @@ static const char *mcdx_c_version ...@@ -73,7 +73,6 @@ static const char *mcdx_c_version
#include <linux/major.h> #include <linux/major.h>
#define MAJOR_NR MITSUMI_X_CDROM_MAJOR #define MAJOR_NR MITSUMI_X_CDROM_MAJOR
#define DEVICE_NR(device) (minor(device))
#include <linux/blk.h> #include <linux/blk.h>
#include <linux/devfs_fs_kernel.h> #include <linux/devfs_fs_kernel.h>
...@@ -197,7 +196,6 @@ struct s_drive_stuff { ...@@ -197,7 +196,6 @@ struct s_drive_stuff {
void *rreg_status; /* r status */ void *rreg_status; /* r status */
int irq; /* irq used by this drive */ int irq; /* irq used by this drive */
int minor; /* minor number of this drive */
int present; /* drive present and its capabilities */ int present; /* drive present and its capabilities */
unsigned char readcmd; /* read cmd depends on single/double speed */ unsigned char readcmd; /* read cmd depends on single/double speed */
unsigned char playcmd; /* play should always be single speed */ unsigned char playcmd; /* play should always be single speed */
...@@ -207,6 +205,7 @@ struct s_drive_stuff { ...@@ -207,6 +205,7 @@ struct s_drive_stuff {
int lastsector; /* last block accessible */ int lastsector; /* last block accessible */
int status; /* last operation's error / status */ int status; /* last operation's error / status */
int readerrs; /* # of blocks read w/o error */ int readerrs; /* # of blocks read w/o error */
struct cdrom_device_info info;
}; };
...@@ -305,21 +304,13 @@ static struct cdrom_device_ops mcdx_dops = { ...@@ -305,21 +304,13 @@ static struct cdrom_device_ops mcdx_dops = {
CDC_PLAY_AUDIO | CDC_DRIVE_STATUS, CDC_PLAY_AUDIO | CDC_DRIVE_STATUS,
}; };
static struct cdrom_device_info mcdx_info = {
ops:&mcdx_dops,
speed:2,
capacity:1,
name:"mcdx",
};
/* KERNEL INTERFACE FUNCTIONS **************************************/ /* KERNEL INTERFACE FUNCTIONS **************************************/
static int mcdx_audio_ioctl(struct cdrom_device_info *cdi, static int mcdx_audio_ioctl(struct cdrom_device_info *cdi,
unsigned int cmd, void *arg) unsigned int cmd, void *arg)
{ {
struct s_drive_stuff *stuffp = mcdx_stuffp[minor(cdi->dev)]; struct s_drive_stuff *stuffp = cdi->handle;
if (!stuffp->present) if (!stuffp->present)
return -ENXIO; return -ENXIO;
...@@ -627,7 +618,7 @@ static int mcdx_open(struct cdrom_device_info *cdi, int purpose) ...@@ -627,7 +618,7 @@ static int mcdx_open(struct cdrom_device_info *cdi, int purpose)
{ {
struct s_drive_stuff *stuffp; struct s_drive_stuff *stuffp;
xtrace(OPENCLOSE, "open()\n"); xtrace(OPENCLOSE, "open()\n");
stuffp = mcdx_stuffp[minor(cdi->dev)]; stuffp = cdi->handle;
if (!stuffp->present) if (!stuffp->present)
return -ENXIO; return -ENXIO;
...@@ -776,7 +767,7 @@ static void mcdx_close(struct cdrom_device_info *cdi) ...@@ -776,7 +767,7 @@ static void mcdx_close(struct cdrom_device_info *cdi)
xtrace(OPENCLOSE, "close()\n"); xtrace(OPENCLOSE, "close()\n");
stuffp = mcdx_stuffp[minor(cdi->dev)]; stuffp = cdi->handle;
--stuffp->users; --stuffp->users;
} }
...@@ -787,10 +778,9 @@ static int mcdx_media_changed(struct cdrom_device_info *cdi, int disc_nr) ...@@ -787,10 +778,9 @@ static int mcdx_media_changed(struct cdrom_device_info *cdi, int disc_nr)
{ {
struct s_drive_stuff *stuffp; struct s_drive_stuff *stuffp;
xinfo("mcdx_media_changed called for device %s\n", xinfo("mcdx_media_changed called for device %s\n", cdi->name);
kdevname(cdi->dev));
stuffp = mcdx_stuffp[minor(cdi->dev)]; stuffp = cdi->handle;
mcdx_getstatus(stuffp, 1); mcdx_getstatus(stuffp, 1);
if (stuffp->yyy == 0) if (stuffp->yyy == 0)
...@@ -1027,14 +1017,13 @@ void __exit mcdx_exit(void) ...@@ -1027,14 +1017,13 @@ void __exit mcdx_exit(void)
xinfo("cleanup_module called\n"); xinfo("cleanup_module called\n");
for (i = 0; i < MCDX_NDRIVES; i++) { for (i = 0; i < MCDX_NDRIVES; i++) {
struct s_drive_stuff *stuffp; struct s_drive_stuff *stuffp = mcdx_stuffp[i];
if (unregister_cdrom(&mcdx_info)) { if (!stuffp)
continue;
if (unregister_cdrom(&stuffp->info)) {
printk(KERN_WARNING "Can't unregister cdrom mcdx\n"); printk(KERN_WARNING "Can't unregister cdrom mcdx\n");
return; return;
} }
stuffp = mcdx_stuffp[i];
if (!stuffp)
continue;
release_region((unsigned long) stuffp->wreg_data, release_region((unsigned long) stuffp->wreg_data,
MCDX_IO_SIZE); MCDX_IO_SIZE);
free_irq(stuffp->irq, NULL); free_irq(stuffp->irq, NULL);
...@@ -1208,15 +1197,19 @@ int __init mcdx_init_drive(int drive) ...@@ -1208,15 +1197,19 @@ int __init mcdx_init_drive(int drive)
xtrace(INIT, "init() set non dma but irq mode\n"); xtrace(INIT, "init() set non dma but irq mode\n");
mcdx_config(stuffp, 1); mcdx_config(stuffp, 1);
stuffp->minor = drive; stuffp->info.ops = &mcdx_dops;
stuffp->info.speed = 2;
stuffp->info.capacity = 1;
stuffp->info.handle = stuffp;
sprintf(stuffp->info.name, "mcdx%d", drive);
stuffp->info.dev = mk_kdev(MAJOR_NR, drive);
sprintf(msg, " mcdx: Mitsumi CD-ROM installed at 0x%3p, irq %d." sprintf(msg, " mcdx: Mitsumi CD-ROM installed at 0x%3p, irq %d."
" (Firmware version %c %x)\n", " (Firmware version %c %x)\n",
stuffp->wreg_data, stuffp->irq, version.code, version.ver); stuffp->wreg_data, stuffp->irq, version.code, version.ver);
mcdx_stuffp[drive] = stuffp; mcdx_stuffp[drive] = stuffp;
xtrace(INIT, "init() mcdx_stuffp[%d] = %p\n", drive, stuffp); xtrace(INIT, "init() mcdx_stuffp[%d] = %p\n", drive, stuffp);
mcdx_info.dev = mk_kdev(MAJOR_NR, 0); if (register_cdrom(&stuffp->info) != 0) {
if (register_cdrom(&mcdx_info) != 0) {
printk("Cannot register Mitsumi CD-ROM!\n"); printk("Cannot register Mitsumi CD-ROM!\n");
release_region((unsigned long) stuffp->wreg_data, release_region((unsigned long) stuffp->wreg_data,
MCDX_IO_SIZE); MCDX_IO_SIZE);
...@@ -1227,7 +1220,7 @@ int __init mcdx_init_drive(int drive) ...@@ -1227,7 +1220,7 @@ int __init mcdx_init_drive(int drive)
blk_cleanup_queue(BLK_DEFAULT_QUEUE(MAJOR_NR)); blk_cleanup_queue(BLK_DEFAULT_QUEUE(MAJOR_NR));
return 2; return 2;
} }
devfs_plain_cdrom(&mcdx_info, &mcdx_bdops); devfs_plain_cdrom(&stuffp->info, &mcdx_bdops);
printk(msg); printk(msg);
return 0; return 0;
} }
...@@ -1685,7 +1678,7 @@ mcdx_playtrk(struct s_drive_stuff *stuffp, const struct cdrom_ti *ti) ...@@ -1685,7 +1678,7 @@ mcdx_playtrk(struct s_drive_stuff *stuffp, const struct cdrom_ti *ti)
static int mcdx_tray_move(struct cdrom_device_info *cdi, int position) static int mcdx_tray_move(struct cdrom_device_info *cdi, int position)
{ {
struct s_drive_stuff *stuffp = mcdx_stuffp[minor(cdi->dev)]; struct s_drive_stuff *stuffp = cdi->handle;
if (!stuffp->present) if (!stuffp->present)
return -ENXIO; return -ENXIO;
...@@ -1875,7 +1868,7 @@ static int mcdx_reset(struct s_drive_stuff *stuffp, enum resetmodes mode, int tr ...@@ -1875,7 +1868,7 @@ static int mcdx_reset(struct s_drive_stuff *stuffp, enum resetmodes mode, int tr
static int mcdx_lockdoor(struct cdrom_device_info *cdi, int lock) static int mcdx_lockdoor(struct cdrom_device_info *cdi, int lock)
{ {
struct s_drive_stuff *stuffp = mcdx_stuffp[minor(cdi->dev)]; struct s_drive_stuff *stuffp = cdi->handle;
char cmd[2] = { 0xfe }; char cmd[2] = { 0xfe };
if (!(stuffp->present & DOOR)) if (!(stuffp->present & DOOR))
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -1516,8 +1516,6 @@ static void idedisk_add_settings(ide_drive_t *drive) ...@@ -1516,8 +1516,6 @@ static void idedisk_add_settings(ide_drive_t *drive)
static void idedisk_setup (ide_drive_t *drive) static void idedisk_setup (ide_drive_t *drive)
{ {
int i;
struct hd_driveid *id = drive->id; struct hd_driveid *id = drive->id;
unsigned long capacity; unsigned long capacity;
...@@ -1538,15 +1536,6 @@ static void idedisk_setup (ide_drive_t *drive) ...@@ -1538,15 +1536,6 @@ static void idedisk_setup (ide_drive_t *drive)
drive->doorlocking = 1; drive->doorlocking = 1;
} }
} }
for (i = 0; i < MAX_DRIVES; ++i) {
ide_hwif_t *hwif = HWIF(drive);
if (drive != &hwif->drives[i]) continue;
hwif->gd[i]->de_arr[i] = drive->de;
if (drive->removable)
hwif->gd[i]->flags[i] |= GENHD_FL_REMOVABLE;
break;
}
#if 1 #if 1
(void) probe_lba_addressing(drive, 1); (void) probe_lba_addressing(drive, 1);
...@@ -1629,9 +1618,7 @@ static void idedisk_setup (ide_drive_t *drive) ...@@ -1629,9 +1618,7 @@ static void idedisk_setup (ide_drive_t *drive)
static int idedisk_cleanup (ide_drive_t *drive) static int idedisk_cleanup (ide_drive_t *drive)
{ {
ide_hwif_t *hwif = HWIF(drive); struct gendisk *g = drive->disk;
int unit = drive - hwif->drives;
struct gendisk *g = hwif->gd[unit];
if ((drive->id->cfs_enable_2 & 0x3000) && drive->wcache) if ((drive->id->cfs_enable_2 & 0x3000) && drive->wcache)
if (do_idedisk_flushcache(drive)) if (do_idedisk_flushcache(drive))
printk (KERN_INFO "%s: Write Cache FAILED Flushing!\n", printk (KERN_INFO "%s: Write Cache FAILED Flushing!\n",
...@@ -1683,9 +1670,7 @@ MODULE_DESCRIPTION("ATA DISK Driver"); ...@@ -1683,9 +1670,7 @@ MODULE_DESCRIPTION("ATA DISK Driver");
static int idedisk_reinit(ide_drive_t *drive) static int idedisk_reinit(ide_drive_t *drive)
{ {
ide_hwif_t *hwif = HWIF(drive); struct gendisk *g = drive->disk;
int unit = drive - hwif->drives;
struct gendisk *g = hwif->gd[unit];
/* strstr("foo", "") is non-NULL */ /* strstr("foo", "") is non-NULL */
if (!strstr("ide-disk", drive->driver_req)) if (!strstr("ide-disk", drive->driver_req))
...@@ -1714,6 +1699,9 @@ static int idedisk_reinit(ide_drive_t *drive) ...@@ -1714,6 +1699,9 @@ static int idedisk_reinit(ide_drive_t *drive)
} }
DRIVER(drive)->busy--; DRIVER(drive)->busy--;
g->minor_shift = PARTN_BITS; g->minor_shift = PARTN_BITS;
g->de = drive->de;
g->flags = drive->removable ? GENHD_FL_REMOVABLE : 0;
g->flags |= GENHD_FL_DEVFS;
add_gendisk(g); add_gendisk(g);
register_disk(g, mk_kdev(g->major,g->first_minor), register_disk(g, mk_kdev(g->major,g->first_minor),
1<<g->minor_shift, ide_fops, 1<<g->minor_shift, ide_fops,
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment