diff -urN B5-09262305/drivers/block/amiflop.c B5-amiflop-methods/drivers/block/amiflop.c --- B5-09262305/drivers/block/amiflop.c Mon Sep 8 19:25:05 2003 +++ B5-amiflop-methods/drivers/block/amiflop.c Fri Sep 26 20:57:35 2003 @@ -1437,16 +1437,18 @@ static int fd_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long param) { - int drive = iminor(inode) & 3; + struct block_device *bdev = inode->i_bdev; + struct amiga_floppy_struct *floppy = bdev->bd_disk->private_data; + int drive = floppy - unit; static struct floppy_struct getprm; switch(cmd){ case HDIO_GETGEO: { struct hd_geometry loc; - loc.heads = unit[drive].type->heads; - loc.sectors = unit[drive].dtype->sects * unit[drive].type->sect_mult; - loc.cylinders = unit[drive].type->tracks; + loc.heads = floppy->type->heads; + loc.sectors = floppy->dtype->sects * floppy->type->sect_mult; + loc.cylinders = floppy->type->tracks; loc.start = 0; if (copy_to_user((void *)param, (void *)&loc, sizeof(struct hd_geometry))) @@ -1459,7 +1461,7 @@ rel_fdc(); return -EBUSY; } - fsync_bdev(inode->i_bdev); + fsync_bdev(bdev); if (fd_motor_on(drive) == 0) { rel_fdc(); return -ENODEV; @@ -1472,12 +1474,12 @@ rel_fdc(); break; case FDFMTTRK: - if (param < unit[drive].type->tracks * unit[drive].type->heads) + if (param < floppy->type->tracks * floppy->type->heads) { get_fdc(drive); if (fd_seek(drive,param) != 0){ - memset(unit[drive].trackbuf, FD_FILL_BYTE, - unit[drive].dtype->sects * unit[drive].type->sect_mult * 512); + memset(floppy->trackbuf, FD_FILL_BYTE, + floppy->dtype->sects * floppy->type->sect_mult * 512); non_int_flush_track(drive); } floppy_off(drive); @@ -1488,14 +1490,14 @@ break; case FDFMTEND: floppy_off(drive); - invalidate_bdev(inode->i_bdev, 0); + invalidate_bdev(bdev, 0); break; case FDGETPRM: memset((void *)&getprm, 0, sizeof (getprm)); - getprm.track=unit[drive].type->tracks; - getprm.head=unit[drive].type->heads; - getprm.sect=unit[drive].dtype->sects * unit[drive].type->sect_mult; - getprm.size=unit[drive].blocks; + getprm.track=floppy->type->tracks; + getprm.head=floppy->type->heads; + getprm.sect=floppy->dtype->sects * floppy->type->sect_mult; + getprm.size=floppy->blocks; if (copy_to_user((void *)param, (void *)&getprm, sizeof(struct floppy_struct))) @@ -1511,10 +1513,10 @@ #ifdef RAW_IOCTL case IOCTL_RAW_TRACK: if (copy_to_user((void *)param, raw_buf, - unit[drive].type->read_size)) + floppy->type->read_size)) return -EFAULT; else - return unit[drive].type->read_size; + return floppy->type->read_size; #endif default: printk(KERN_DEBUG "fd_ioctl: unknown cmd %d for drive %d.", @@ -1561,7 +1563,9 @@ */ static int floppy_open(struct inode *inode, struct file *filp) { - int drive = iminor(inode) & 3; + struct block_device *bdev = inode->i_bdev; + struct amiga_floppy_struct *floppy = bdev->bd_disk->private_data; + int drive = floppy - unit; int system = (iminor(inode) & 4) >> 2; int old_dev; unsigned long flags; @@ -1572,7 +1576,7 @@ return -EBUSY; if (filp && filp->f_mode & 3) { - check_disk_change(inode->i_bdev); + check_disk_change(bdev); if (filp->f_mode & 2 ) { int wrprot; @@ -1591,27 +1595,30 @@ fd_ref[drive]++; fd_device[drive] = system; #ifdef MODULE - if (unit[drive].motor == 0) + if (floppy->motor == 0) MOD_INC_USE_COUNT; #endif local_irq_restore(flags); - unit[drive].dtype=&data_types[system]; - unit[drive].blocks=unit[drive].type->heads*unit[drive].type->tracks* - data_types[system].sects*unit[drive].type->sect_mult; - set_capacity(unit[drive].gendisk, unit[drive].blocks); - - printk(KERN_INFO "fd%d: accessing %s-disk with %s-layout\n",drive, - unit[drive].type->name, data_types[system].name); + floppy->dtype=&data_types[system]; + floppy->blocks=floppy->type->heads*floppy->type->tracks* + data_types[system].sects*floppy->type->sect_mult; + set_capacity(floppy->gendisk, floppy->blocks); + + printk(KERN_INFO "%s: accessing %s-disk with %s-layout\n", + bdev->bd_disk->disk_name, floppy->type->name, + data_types[system].name); return 0; } static int floppy_release(struct inode * inode, struct file * filp) { - int drive = iminor(inode) & 3; + struct block_device *bdev = inode->i_bdev; + struct amiga_floppy_struct *floppy = bdev->bd_disk->private_data; + int drive = floppy - unit; - if (unit[drive].dirty == 1) { + if (floppy->dirty == 1) { del_timer (flush_track_timer + drive); non_int_flush_track (drive); }