diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/ide/ide-disk.c | 22 |
1 files changed, 13 insertions, 9 deletions
diff --git a/drivers/ide/ide-disk.c b/drivers/ide/ide-disk.c index 6c9c898aff62..289a533afbd6 100644 --- a/drivers/ide/ide-disk.c +++ b/drivers/ide/ide-disk.c | |||
@@ -817,12 +817,21 @@ static ide_driver_t idedisk_driver = { | |||
817 | static int idedisk_set_doorlock(ide_drive_t *drive, int on) | 817 | static int idedisk_set_doorlock(ide_drive_t *drive, int on) |
818 | { | 818 | { |
819 | ide_task_t task; | 819 | ide_task_t task; |
820 | int ret; | ||
821 | |||
822 | if ((drive->dev_flags & IDE_DFLAG_DOORLOCKING) == 0) | ||
823 | return 0; | ||
820 | 824 | ||
821 | memset(&task, 0, sizeof(task)); | 825 | memset(&task, 0, sizeof(task)); |
822 | task.tf.command = on ? ATA_CMD_MEDIA_LOCK : ATA_CMD_MEDIA_UNLOCK; | 826 | task.tf.command = on ? ATA_CMD_MEDIA_LOCK : ATA_CMD_MEDIA_UNLOCK; |
823 | task.tf_flags = IDE_TFLAG_TF | IDE_TFLAG_DEVICE; | 827 | task.tf_flags = IDE_TFLAG_TF | IDE_TFLAG_DEVICE; |
824 | 828 | ||
825 | return ide_no_data_taskfile(drive, &task); | 829 | ret = ide_no_data_taskfile(drive, &task); |
830 | |||
831 | if (ret) | ||
832 | drive->dev_flags &= ~IDE_DFLAG_DOORLOCKING; | ||
833 | |||
834 | return ret; | ||
826 | } | 835 | } |
827 | 836 | ||
828 | static int idedisk_open(struct inode *inode, struct file *filp) | 837 | static int idedisk_open(struct inode *inode, struct file *filp) |
@@ -845,9 +854,7 @@ static int idedisk_open(struct inode *inode, struct file *filp) | |||
845 | * since the open() has already succeeded, | 854 | * since the open() has already succeeded, |
846 | * and the door_lock is irrelevant at this point. | 855 | * and the door_lock is irrelevant at this point. |
847 | */ | 856 | */ |
848 | if ((drive->dev_flags & IDE_DFLAG_DOORLOCKING) && | 857 | idedisk_set_doorlock(drive, 1); |
849 | idedisk_set_doorlock(drive, 1)) | ||
850 | drive->dev_flags &= ~IDE_DFLAG_DOORLOCKING; | ||
851 | check_disk_change(inode->i_bdev); | 858 | check_disk_change(inode->i_bdev); |
852 | } | 859 | } |
853 | return 0; | 860 | return 0; |
@@ -862,11 +869,8 @@ static int idedisk_release(struct inode *inode, struct file *filp) | |||
862 | if (idkp->openers == 1) | 869 | if (idkp->openers == 1) |
863 | ide_cacheflush_p(drive); | 870 | ide_cacheflush_p(drive); |
864 | 871 | ||
865 | if ((drive->dev_flags & IDE_DFLAG_REMOVABLE) && idkp->openers == 1) { | 872 | if ((drive->dev_flags & IDE_DFLAG_REMOVABLE) && idkp->openers == 1) |
866 | if ((drive->dev_flags & IDE_DFLAG_DOORLOCKING) && | 873 | idedisk_set_doorlock(drive, 0); |
867 | idedisk_set_doorlock(drive, 0)) | ||
868 | drive->dev_flags &= ~IDE_DFLAG_DOORLOCKING; | ||
869 | } | ||
870 | 874 | ||
871 | idkp->openers--; | 875 | idkp->openers--; |
872 | 876 | ||