diff options
Diffstat (limited to 'drivers/ide/ide-floppy_ioctl.c')
| -rw-r--r-- | drivers/ide/ide-floppy_ioctl.c | 54 | 
1 files changed, 52 insertions, 2 deletions
diff --git a/drivers/ide/ide-floppy_ioctl.c b/drivers/ide/ide-floppy_ioctl.c index 9723ed9c61b..a3a7a0809e2 100644 --- a/drivers/ide/ide-floppy_ioctl.c +++ b/drivers/ide/ide-floppy_ioctl.c @@ -223,8 +223,26 @@ static int ide_floppy_get_format_progress(ide_drive_t *drive, int __user *arg)  	return 0;  } -int ide_floppy_format_ioctl(ide_drive_t *drive, struct file *file, -			    unsigned int cmd, void __user *argp) +static int ide_floppy_lockdoor(ide_drive_t *drive, struct ide_atapi_pc *pc, +			       unsigned long arg, unsigned int cmd) +{ +	idefloppy_floppy_t *floppy = drive->driver_data; +	struct gendisk *disk = floppy->disk; +	int prevent = (arg && cmd != CDROMEJECT) ? 1 : 0; + +	if (floppy->openers > 1) +		return -EBUSY; + +	ide_set_media_lock(drive, disk, prevent); + +	if (cmd == CDROMEJECT) +		ide_do_start_stop(drive, disk, 2); + +	return 0; +} + +static int ide_floppy_format_ioctl(ide_drive_t *drive, struct file *file, +				   unsigned int cmd, void __user *argp)  {  	switch (cmd) {  	case IDEFLOPPY_IOCTL_FORMAT_SUPPORTED: @@ -241,3 +259,35 @@ int ide_floppy_format_ioctl(ide_drive_t *drive, struct file *file,  		return -ENOTTY;  	}  } + +int ide_floppy_ioctl(struct inode *inode, struct file *file, +		    unsigned int cmd, unsigned long arg) +{ +	struct block_device *bdev = inode->i_bdev; +	struct ide_floppy_obj *floppy = ide_drv_g(bdev->bd_disk, +						     ide_floppy_obj); +	ide_drive_t *drive = floppy->drive; +	struct ide_atapi_pc pc; +	void __user *argp = (void __user *)arg; +	int err; + +	if (cmd == CDROMEJECT || cmd == CDROM_LOCKDOOR) +		return ide_floppy_lockdoor(drive, &pc, arg, cmd); + +	err = ide_floppy_format_ioctl(drive, file, cmd, argp); +	if (err != -ENOTTY) +		return err; + +	/* +	 * skip SCSI_IOCTL_SEND_COMMAND (deprecated) +	 * and CDROM_SEND_PACKET (legacy) ioctls +	 */ +	if (cmd != CDROM_SEND_PACKET && cmd != SCSI_IOCTL_SEND_COMMAND) +		err = scsi_cmd_ioctl(file, bdev->bd_disk->queue, +					bdev->bd_disk, cmd, argp); + +	if (err == -ENOTTY) +		err = generic_ide_ioctl(drive, file, bdev, cmd, arg); + +	return err; +}  |