diff options
Diffstat (limited to 'drivers/block/floppy.c')
-rw-r--r-- | drivers/block/floppy.c | 54 |
1 files changed, 24 insertions, 30 deletions
diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c index 2cea27aba9a0..14db747a636e 100644 --- a/drivers/block/floppy.c +++ b/drivers/block/floppy.c | |||
@@ -3450,14 +3450,14 @@ static int fd_getgeo(struct block_device *bdev, struct hd_geometry *geo) | |||
3450 | return 0; | 3450 | return 0; |
3451 | } | 3451 | } |
3452 | 3452 | ||
3453 | static int fd_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, | 3453 | static int fd_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd, |
3454 | unsigned long param) | 3454 | unsigned long param) |
3455 | { | 3455 | { |
3456 | #define FD_IOCTL_ALLOWED ((filp) && (filp)->private_data) | 3456 | #define FD_IOCTL_ALLOWED (mode & (FMODE_WRITE|FMODE_WRITE_IOCTL)) |
3457 | #define OUT(c,x) case c: outparam = (const char *) (x); break | 3457 | #define OUT(c,x) case c: outparam = (const char *) (x); break |
3458 | #define IN(c,x,tag) case c: *(x) = inparam. tag ; return 0 | 3458 | #define IN(c,x,tag) case c: *(x) = inparam. tag ; return 0 |
3459 | 3459 | ||
3460 | int drive = (long)inode->i_bdev->bd_disk->private_data; | 3460 | int drive = (long)bdev->bd_disk->private_data; |
3461 | int type = ITYPE(UDRS->fd_device); | 3461 | int type = ITYPE(UDRS->fd_device); |
3462 | int i; | 3462 | int i; |
3463 | int ret; | 3463 | int ret; |
@@ -3516,11 +3516,11 @@ static int fd_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, | |||
3516 | current_type[drive] = NULL; | 3516 | current_type[drive] = NULL; |
3517 | floppy_sizes[drive] = MAX_DISK_SIZE << 1; | 3517 | floppy_sizes[drive] = MAX_DISK_SIZE << 1; |
3518 | UDRS->keep_data = 0; | 3518 | UDRS->keep_data = 0; |
3519 | return invalidate_drive(inode->i_bdev); | 3519 | return invalidate_drive(bdev); |
3520 | case FDSETPRM: | 3520 | case FDSETPRM: |
3521 | case FDDEFPRM: | 3521 | case FDDEFPRM: |
3522 | return set_geometry(cmd, &inparam.g, | 3522 | return set_geometry(cmd, &inparam.g, |
3523 | drive, type, inode->i_bdev); | 3523 | drive, type, bdev); |
3524 | case FDGETPRM: | 3524 | case FDGETPRM: |
3525 | ECALL(get_floppy_geometry(drive, type, | 3525 | ECALL(get_floppy_geometry(drive, type, |
3526 | (struct floppy_struct **) | 3526 | (struct floppy_struct **) |
@@ -3551,7 +3551,7 @@ static int fd_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, | |||
3551 | case FDFMTEND: | 3551 | case FDFMTEND: |
3552 | case FDFLUSH: | 3552 | case FDFLUSH: |
3553 | LOCK_FDC(drive, 1); | 3553 | LOCK_FDC(drive, 1); |
3554 | return invalidate_drive(inode->i_bdev); | 3554 | return invalidate_drive(bdev); |
3555 | 3555 | ||
3556 | case FDSETEMSGTRESH: | 3556 | case FDSETEMSGTRESH: |
3557 | UDP->max_errors.reporting = | 3557 | UDP->max_errors.reporting = |
@@ -3659,9 +3659,9 @@ static void __init config_types(void) | |||
3659 | printk("\n"); | 3659 | printk("\n"); |
3660 | } | 3660 | } |
3661 | 3661 | ||
3662 | static int floppy_release(struct inode *inode, struct file *filp) | 3662 | static int floppy_release(struct gendisk *disk, fmode_t mode) |
3663 | { | 3663 | { |
3664 | int drive = (long)inode->i_bdev->bd_disk->private_data; | 3664 | int drive = (long)disk->private_data; |
3665 | 3665 | ||
3666 | mutex_lock(&open_lock); | 3666 | mutex_lock(&open_lock); |
3667 | if (UDRS->fd_ref < 0) | 3667 | if (UDRS->fd_ref < 0) |
@@ -3682,18 +3682,17 @@ static int floppy_release(struct inode *inode, struct file *filp) | |||
3682 | * /dev/PS0 etc), and disallows simultaneous access to the same | 3682 | * /dev/PS0 etc), and disallows simultaneous access to the same |
3683 | * drive with different device numbers. | 3683 | * drive with different device numbers. |
3684 | */ | 3684 | */ |
3685 | static int floppy_open(struct inode *inode, struct file *filp) | 3685 | static int floppy_open(struct block_device *bdev, fmode_t mode) |
3686 | { | 3686 | { |
3687 | int drive = (long)inode->i_bdev->bd_disk->private_data; | 3687 | int drive = (long)bdev->bd_disk->private_data; |
3688 | int old_dev; | 3688 | int old_dev, new_dev; |
3689 | int try; | 3689 | int try; |
3690 | int res = -EBUSY; | 3690 | int res = -EBUSY; |
3691 | char *tmp; | 3691 | char *tmp; |
3692 | 3692 | ||
3693 | filp->private_data = (void *)0; | ||
3694 | mutex_lock(&open_lock); | 3693 | mutex_lock(&open_lock); |
3695 | old_dev = UDRS->fd_device; | 3694 | old_dev = UDRS->fd_device; |
3696 | if (opened_bdev[drive] && opened_bdev[drive] != inode->i_bdev) | 3695 | if (opened_bdev[drive] && opened_bdev[drive] != bdev) |
3697 | goto out2; | 3696 | goto out2; |
3698 | 3697 | ||
3699 | if (!UDRS->fd_ref && (UDP->flags & FD_BROKEN_DCL)) { | 3698 | if (!UDRS->fd_ref && (UDP->flags & FD_BROKEN_DCL)) { |
@@ -3701,15 +3700,15 @@ static int floppy_open(struct inode *inode, struct file *filp) | |||
3701 | USETF(FD_VERIFY); | 3700 | USETF(FD_VERIFY); |
3702 | } | 3701 | } |
3703 | 3702 | ||
3704 | if (UDRS->fd_ref == -1 || (UDRS->fd_ref && (filp->f_flags & O_EXCL))) | 3703 | if (UDRS->fd_ref == -1 || (UDRS->fd_ref && (mode & FMODE_EXCL))) |
3705 | goto out2; | 3704 | goto out2; |
3706 | 3705 | ||
3707 | if (filp->f_flags & O_EXCL) | 3706 | if (mode & FMODE_EXCL) |
3708 | UDRS->fd_ref = -1; | 3707 | UDRS->fd_ref = -1; |
3709 | else | 3708 | else |
3710 | UDRS->fd_ref++; | 3709 | UDRS->fd_ref++; |
3711 | 3710 | ||
3712 | opened_bdev[drive] = inode->i_bdev; | 3711 | opened_bdev[drive] = bdev; |
3713 | 3712 | ||
3714 | res = -ENXIO; | 3713 | res = -ENXIO; |
3715 | 3714 | ||
@@ -3744,31 +3743,26 @@ static int floppy_open(struct inode *inode, struct file *filp) | |||
3744 | } | 3743 | } |
3745 | } | 3744 | } |
3746 | 3745 | ||
3747 | UDRS->fd_device = iminor(inode); | 3746 | new_dev = MINOR(bdev->bd_dev); |
3748 | set_capacity(disks[drive], floppy_sizes[iminor(inode)]); | 3747 | UDRS->fd_device = new_dev; |
3749 | if (old_dev != -1 && old_dev != iminor(inode)) { | 3748 | set_capacity(disks[drive], floppy_sizes[new_dev]); |
3749 | if (old_dev != -1 && old_dev != new_dev) { | ||
3750 | if (buffer_drive == drive) | 3750 | if (buffer_drive == drive) |
3751 | buffer_track = -1; | 3751 | buffer_track = -1; |
3752 | } | 3752 | } |
3753 | 3753 | ||
3754 | /* Allow ioctls if we have write-permissions even if read-only open. | ||
3755 | * Needed so that programs such as fdrawcmd still can work on write | ||
3756 | * protected disks */ | ||
3757 | if ((filp->f_mode & FMODE_WRITE) || !file_permission(filp, MAY_WRITE)) | ||
3758 | filp->private_data = (void *)8; | ||
3759 | |||
3760 | if (UFDCS->rawcmd == 1) | 3754 | if (UFDCS->rawcmd == 1) |
3761 | UFDCS->rawcmd = 2; | 3755 | UFDCS->rawcmd = 2; |
3762 | 3756 | ||
3763 | if (!(filp->f_flags & O_NDELAY)) { | 3757 | if (!(mode & FMODE_NDELAY)) { |
3764 | if (filp->f_mode & 3) { | 3758 | if (mode & (FMODE_READ|FMODE_WRITE)) { |
3765 | UDRS->last_checked = 0; | 3759 | UDRS->last_checked = 0; |
3766 | check_disk_change(inode->i_bdev); | 3760 | check_disk_change(bdev); |
3767 | if (UTESTF(FD_DISK_CHANGED)) | 3761 | if (UTESTF(FD_DISK_CHANGED)) |
3768 | goto out; | 3762 | goto out; |
3769 | } | 3763 | } |
3770 | res = -EROFS; | 3764 | res = -EROFS; |
3771 | if ((filp->f_mode & 2) && !(UTESTF(FD_DISK_WRITABLE))) | 3765 | if ((mode & FMODE_WRITE) && !(UTESTF(FD_DISK_WRITABLE))) |
3772 | goto out; | 3766 | goto out; |
3773 | } | 3767 | } |
3774 | mutex_unlock(&open_lock); | 3768 | mutex_unlock(&open_lock); |
@@ -3911,7 +3905,7 @@ static struct block_device_operations floppy_fops = { | |||
3911 | .owner = THIS_MODULE, | 3905 | .owner = THIS_MODULE, |
3912 | .open = floppy_open, | 3906 | .open = floppy_open, |
3913 | .release = floppy_release, | 3907 | .release = floppy_release, |
3914 | .ioctl = fd_ioctl, | 3908 | .locked_ioctl = fd_ioctl, |
3915 | .getgeo = fd_getgeo, | 3909 | .getgeo = fd_getgeo, |
3916 | .media_changed = check_floppy_change, | 3910 | .media_changed = check_floppy_change, |
3917 | .revalidate_disk = floppy_revalidate, | 3911 | .revalidate_disk = floppy_revalidate, |