mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-14 12:37:32 +00:00
[PATCH] switch amiflop
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
b564f027ad
commit
47225db519
1 changed files with 26 additions and 24 deletions
|
@ -1437,10 +1437,11 @@ static int fd_getgeo(struct block_device *bdev, struct hd_geometry *geo)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int fd_ioctl(struct inode *inode, struct file *filp,
|
static int fd_ioctl(struct block_device *bdev, fmode_t mode,
|
||||||
unsigned int cmd, unsigned long param)
|
unsigned int cmd, unsigned long param)
|
||||||
{
|
{
|
||||||
int drive = iminor(inode) & 3;
|
struct amiga_floppy_struct *p = bdev->bd_disk->private_data;
|
||||||
|
int drive = p - unit;
|
||||||
static struct floppy_struct getprm;
|
static struct floppy_struct getprm;
|
||||||
void __user *argp = (void __user *)param;
|
void __user *argp = (void __user *)param;
|
||||||
|
|
||||||
|
@ -1451,7 +1452,7 @@ static int fd_ioctl(struct inode *inode, struct file *filp,
|
||||||
rel_fdc();
|
rel_fdc();
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
}
|
}
|
||||||
fsync_bdev(inode->i_bdev);
|
fsync_bdev(bdev);
|
||||||
if (fd_motor_on(drive) == 0) {
|
if (fd_motor_on(drive) == 0) {
|
||||||
rel_fdc();
|
rel_fdc();
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
@ -1464,12 +1465,12 @@ static int fd_ioctl(struct inode *inode, struct file *filp,
|
||||||
rel_fdc();
|
rel_fdc();
|
||||||
break;
|
break;
|
||||||
case FDFMTTRK:
|
case FDFMTTRK:
|
||||||
if (param < unit[drive].type->tracks * unit[drive].type->heads)
|
if (param < p->type->tracks * p->type->heads)
|
||||||
{
|
{
|
||||||
get_fdc(drive);
|
get_fdc(drive);
|
||||||
if (fd_seek(drive,param) != 0){
|
if (fd_seek(drive,param) != 0){
|
||||||
memset(unit[drive].trackbuf, FD_FILL_BYTE,
|
memset(p->trackbuf, FD_FILL_BYTE,
|
||||||
unit[drive].dtype->sects * unit[drive].type->sect_mult * 512);
|
p->dtype->sects * p->type->sect_mult * 512);
|
||||||
non_int_flush_track(drive);
|
non_int_flush_track(drive);
|
||||||
}
|
}
|
||||||
floppy_off(drive);
|
floppy_off(drive);
|
||||||
|
@ -1480,14 +1481,14 @@ static int fd_ioctl(struct inode *inode, struct file *filp,
|
||||||
break;
|
break;
|
||||||
case FDFMTEND:
|
case FDFMTEND:
|
||||||
floppy_off(drive);
|
floppy_off(drive);
|
||||||
invalidate_bdev(inode->i_bdev);
|
invalidate_bdev(bdev);
|
||||||
break;
|
break;
|
||||||
case FDGETPRM:
|
case FDGETPRM:
|
||||||
memset((void *)&getprm, 0, sizeof (getprm));
|
memset((void *)&getprm, 0, sizeof (getprm));
|
||||||
getprm.track=unit[drive].type->tracks;
|
getprm.track=p->type->tracks;
|
||||||
getprm.head=unit[drive].type->heads;
|
getprm.head=p->type->heads;
|
||||||
getprm.sect=unit[drive].dtype->sects * unit[drive].type->sect_mult;
|
getprm.sect=p->dtype->sects * p->type->sect_mult;
|
||||||
getprm.size=unit[drive].blocks;
|
getprm.size=p->blocks;
|
||||||
if (copy_to_user(argp, &getprm, sizeof(struct floppy_struct)))
|
if (copy_to_user(argp, &getprm, sizeof(struct floppy_struct)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
break;
|
break;
|
||||||
|
@ -1500,10 +1501,10 @@ static int fd_ioctl(struct inode *inode, struct file *filp,
|
||||||
break;
|
break;
|
||||||
#ifdef RAW_IOCTL
|
#ifdef RAW_IOCTL
|
||||||
case IOCTL_RAW_TRACK:
|
case IOCTL_RAW_TRACK:
|
||||||
if (copy_to_user(argp, raw_buf, unit[drive].type->read_size))
|
if (copy_to_user(argp, raw_buf, p->type->read_size))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
else
|
else
|
||||||
return unit[drive].type->read_size;
|
return p->type->read_size;
|
||||||
#endif
|
#endif
|
||||||
default:
|
default:
|
||||||
printk(KERN_DEBUG "fd_ioctl: unknown cmd %d for drive %d.",
|
printk(KERN_DEBUG "fd_ioctl: unknown cmd %d for drive %d.",
|
||||||
|
@ -1548,10 +1549,10 @@ static void fd_probe(int dev)
|
||||||
* /dev/PS0 etc), and disallows simultaneous access to the same
|
* /dev/PS0 etc), and disallows simultaneous access to the same
|
||||||
* drive with different device numbers.
|
* drive with different device numbers.
|
||||||
*/
|
*/
|
||||||
static int floppy_open(struct inode *inode, struct file *filp)
|
static int floppy_open(struct block_device *bdev, fmode_t mode)
|
||||||
{
|
{
|
||||||
int drive = iminor(inode) & 3;
|
int drive = MINOR(bdev->bd_dev) & 3;
|
||||||
int system = (iminor(inode) & 4) >> 2;
|
int system = (MINOR(bdev->bd_dev) & 4) >> 2;
|
||||||
int old_dev;
|
int old_dev;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
|
@ -1560,9 +1561,9 @@ static int floppy_open(struct inode *inode, struct file *filp)
|
||||||
if (fd_ref[drive] && old_dev != system)
|
if (fd_ref[drive] && old_dev != system)
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
|
|
||||||
if (filp && filp->f_mode & (FMODE_READ|FMODE_WRITE)) {
|
if (mode & (FMODE_READ|FMODE_WRITE)) {
|
||||||
check_disk_change(inode->i_bdev);
|
check_disk_change(bdev);
|
||||||
if (filp->f_mode & FMODE_WRITE ) {
|
if (mode & FMODE_WRITE) {
|
||||||
int wrprot;
|
int wrprot;
|
||||||
|
|
||||||
get_fdc(drive);
|
get_fdc(drive);
|
||||||
|
@ -1592,9 +1593,10 @@ static int floppy_open(struct inode *inode, struct file *filp)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int floppy_release(struct inode * inode, struct file * filp)
|
static int floppy_release(struct gendisk *disk, fmode_t mode)
|
||||||
{
|
{
|
||||||
int drive = iminor(inode) & 3;
|
struct amiga_floppy_struct *p = disk->private_data;
|
||||||
|
int drive = p - unit;
|
||||||
|
|
||||||
if (unit[drive].dirty == 1) {
|
if (unit[drive].dirty == 1) {
|
||||||
del_timer (flush_track_timer + drive);
|
del_timer (flush_track_timer + drive);
|
||||||
|
@ -1648,9 +1650,9 @@ static int amiga_floppy_change(struct gendisk *disk)
|
||||||
|
|
||||||
static struct block_device_operations floppy_fops = {
|
static struct block_device_operations floppy_fops = {
|
||||||
.owner = THIS_MODULE,
|
.owner = THIS_MODULE,
|
||||||
.__open = floppy_open,
|
.open = floppy_open,
|
||||||
.__release = floppy_release,
|
.release = floppy_release,
|
||||||
.__ioctl = fd_ioctl,
|
.locked_ioctl = fd_ioctl,
|
||||||
.getgeo = fd_getgeo,
|
.getgeo = fd_getgeo,
|
||||||
.media_changed = amiga_floppy_change,
|
.media_changed = amiga_floppy_change,
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue