diff -ur orig/drivers/scsi/scsi.h linux-rpc/drivers/scsi/scsi.h --- orig/drivers/scsi/scsi.h Mon Aug 5 13:31:23 2002 +++ linux-rpc/drivers/scsi/scsi.h Tue Sep 24 15:57:54 2002 @@ -598,6 +598,7 @@ unsigned changed:1; /* Data invalid due to media change */ unsigned busy:1; /* Used to prevent races */ unsigned lockable:1; /* Able to prevent media removal */ + unsigned locked:1; /* Media removal disabled */ unsigned borken:1; /* Tell the Seagate driver to be * painfully slow on this device */ unsigned tagged_supported:1; /* Supports SCSI-II tagged queuing */ diff -ur orig/drivers/scsi/scsi_ioctl.c linux-rpc/drivers/scsi/scsi_ioctl.c --- orig/drivers/scsi/scsi_ioctl.c Mon Aug 5 13:31:24 2002 +++ linux-rpc/drivers/scsi/scsi_ioctl.c Tue Sep 24 16:38:24 2002 @@ -153,6 +153,29 @@ return result; } +int scsi_set_medium_removal(Scsi_Device *dev, char state) +{ + char scsi_cmd[MAX_COMMAND_SIZE]; + int ret; + + if (!dev->removable || !dev->lockable) + return 0; + + scsi_cmd[0] = ALLOW_MEDIUM_REMOVAL; + scsi_cmd[1] = (dev->scsi_level <= SCSI_2) ? (dev->lun << 5) : 0; + scsi_cmd[2] = 0; + scsi_cmd[3] = 0; + scsi_cmd[4] = state; + scsi_cmd[5] = 0; + + ret = ioctl_internal_command(dev, scsi_cmd, IOCTL_NORMAL_TIMEOUT, NORMAL_RETRIES); + + if (ret == 0) + dev->locked = state == SCSI_REMOVAL_PREVENT; + + return ret; +} + /* * This interface is depreciated - users should use the scsi generic (sg) * interface instead, as this is a more flexible approach to performing @@ -449,24 +472,9 @@ return scsi_ioctl_send_command((Scsi_Device *) dev, (Scsi_Ioctl_Command *) arg); case SCSI_IOCTL_DOORLOCK: - if (!dev->removable || !dev->lockable) - return 0; - scsi_cmd[0] = ALLOW_MEDIUM_REMOVAL; - scsi_cmd[1] = cmd_byte1; - scsi_cmd[2] = scsi_cmd[3] = scsi_cmd[5] = 0; - scsi_cmd[4] = SCSI_REMOVAL_PREVENT; - return ioctl_internal_command((Scsi_Device *) dev, scsi_cmd, - IOCTL_NORMAL_TIMEOUT, NORMAL_RETRIES); - break; + return scsi_set_medium_removal(dev, SCSI_REMOVAL_PREVENT); case SCSI_IOCTL_DOORUNLOCK: - if (!dev->removable || !dev->lockable) - return 0; - scsi_cmd[0] = ALLOW_MEDIUM_REMOVAL; - scsi_cmd[1] = cmd_byte1; - scsi_cmd[2] = scsi_cmd[3] = scsi_cmd[5] = 0; - scsi_cmd[4] = SCSI_REMOVAL_ALLOW; - return ioctl_internal_command((Scsi_Device *) dev, scsi_cmd, - IOCTL_NORMAL_TIMEOUT, NORMAL_RETRIES); + return scsi_set_medium_removal(dev, SCSI_REMOVAL_ALLOW); case SCSI_IOCTL_TEST_UNIT_READY: scsi_cmd[0] = TEST_UNIT_READY; scsi_cmd[1] = cmd_byte1; diff -ur orig/drivers/scsi/sd.c linux-rpc/drivers/scsi/sd.c --- orig/drivers/scsi/sd.c Mon Aug 5 13:31:25 2002 +++ linux-rpc/drivers/scsi/sd.c Tue Sep 24 16:07:45 2002 @@ -524,7 +524,7 @@ if (SDev->removable) if (SDev->access_count==1) if (scsi_block_when_processing_errors(SDev)) - scsi_ioctl(SDev, SCSI_IOCTL_DOORLOCK, NULL); + scsi_set_medium_removal(SDev, SCSI_REMOVAL_PREVENT); return 0; @@ -553,7 +553,7 @@ if (SDev->removable) { if (!SDev->access_count) if (scsi_block_when_processing_errors(SDev)) - scsi_ioctl(SDev, SCSI_IOCTL_DOORUNLOCK, NULL); + scsi_set_medium_removal(SDev, SCSI_REMOVAL_ALLOW); } if (SDev->host->hostt->module) __MOD_DEC_USE_COUNT(SDev->host->hostt->module); diff -ur orig/drivers/scsi/sr_ioctl.c linux-rpc/drivers/scsi/sr_ioctl.c --- orig/drivers/scsi/sr_ioctl.c Mon Aug 5 13:31:26 2002 +++ linux-rpc/drivers/scsi/sr_ioctl.c Tue Sep 24 16:09:08 2002 @@ -216,9 +216,8 @@ int sr_lock_door(struct cdrom_device_info *cdi, int lock) { - return scsi_ioctl(scsi_CDs[MINOR(cdi->dev)].device, - lock ? SCSI_IOCTL_DOORLOCK : SCSI_IOCTL_DOORUNLOCK, - 0); + return scsi_set_medium_removal(scsi_CDs[MINOR(cdi->dev)].device, + lock ? SCSI_REMOVAL_PREVENT : SCSI_REMOVAL_ALLOW); } int sr_drive_status(struct cdrom_device_info *cdi, int slot)