CDC_CD_R|CDC_CD_RW|CDC_DVD|CDC_DVD_R|CDC_DVD_RAM|CDC_GENERIC_PACKET| \
         CDC_MRW|CDC_MRW_W|CDC_RAM)
 
-static DEFINE_MUTEX(sr_mutex);
 static int sr_probe(struct device *);
 static int sr_remove(struct device *);
 static blk_status_t sr_init_command(struct scsi_cmnd *SCpnt);
        scsi_autopm_get_device(sdev);
        check_disk_change(bdev);
 
-       mutex_lock(&sr_mutex);
+       mutex_lock(&cd->lock);
        ret = cdrom_open(&cd->cdi, bdev, mode);
-       mutex_unlock(&sr_mutex);
+       mutex_unlock(&cd->lock);
 
        scsi_autopm_put_device(sdev);
        if (ret)
 static void sr_block_release(struct gendisk *disk, fmode_t mode)
 {
        struct scsi_cd *cd = scsi_cd(disk);
-       mutex_lock(&sr_mutex);
+       mutex_lock(&cd->lock);
        cdrom_release(&cd->cdi, mode);
        scsi_cd_put(cd);
-       mutex_unlock(&sr_mutex);
+       mutex_unlock(&cd->lock);
 }
 
 static int sr_block_ioctl(struct block_device *bdev, fmode_t mode, unsigned cmd,
        void __user *argp = (void __user *)arg;
        int ret;
 
-       mutex_lock(&sr_mutex);
+       mutex_lock(&cd->lock);
 
        ret = scsi_ioctl_block_when_processing_errors(sdev, cmd,
                        (mode & FMODE_NDELAY) != 0);
        scsi_autopm_put_device(sdev);
 
 out:
-       mutex_unlock(&sr_mutex);
+       mutex_unlock(&cd->lock);
        return ret;
 }
 
        void __user *argp = compat_ptr(arg);
        int ret;
 
-       mutex_lock(&sr_mutex);
+       mutex_lock(&cd->lock);
 
        ret = scsi_ioctl_block_when_processing_errors(sdev, cmd,
                        (mode & FMODE_NDELAY) != 0);
        scsi_autopm_put_device(sdev);
 
 out:
-       mutex_unlock(&sr_mutex);
+       mutex_unlock(&cd->lock);
        return ret;
 
 }
        disk = alloc_disk(1);
        if (!disk)
                goto fail_free;
+       mutex_init(&cd->lock);
 
        spin_lock(&sr_index_lock);
        minor = find_first_zero_bit(sr_index_bits, SR_DISKS);
 
        put_disk(disk);
 
+       mutex_destroy(&cd->lock);
+
        kfree(cd);
 }
 
 
 
 #include <linux/genhd.h>
 #include <linux/kref.h>
+#include <linux/mutex.h>
 
 #define MAX_RETRIES    3
 #define SR_TIMEOUT     (30 * HZ)
        bool ignore_get_event:1;        /* GET_EVENT is unreliable, use TUR */
 
        struct cdrom_device_info cdi;
+       struct mutex lock;
        /* We hold gendisk and scsi_device references on probe and use
         * the refs on this kref to decide when to release them */
        struct kref kref;