diff options
Diffstat (limited to 'drivers/scsi/st.c')
-rw-r--r-- | drivers/scsi/st.c | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c index 9e2c3a72ff4d..5b7388f1c835 100644 --- a/drivers/scsi/st.c +++ b/drivers/scsi/st.c | |||
@@ -39,7 +39,6 @@ static const char *verstr = "20100829"; | |||
39 | #include <linux/cdev.h> | 39 | #include <linux/cdev.h> |
40 | #include <linux/delay.h> | 40 | #include <linux/delay.h> |
41 | #include <linux/mutex.h> | 41 | #include <linux/mutex.h> |
42 | #include <linux/smp_lock.h> | ||
43 | 42 | ||
44 | #include <asm/uaccess.h> | 43 | #include <asm/uaccess.h> |
45 | #include <asm/dma.h> | 44 | #include <asm/dma.h> |
@@ -76,6 +75,7 @@ static const char *verstr = "20100829"; | |||
76 | #include "st_options.h" | 75 | #include "st_options.h" |
77 | #include "st.h" | 76 | #include "st.h" |
78 | 77 | ||
78 | static DEFINE_MUTEX(st_mutex); | ||
79 | static int buffer_kbs; | 79 | static int buffer_kbs; |
80 | static int max_sg_segs; | 80 | static int max_sg_segs; |
81 | static int try_direct_io = TRY_DIRECT_IO; | 81 | static int try_direct_io = TRY_DIRECT_IO; |
@@ -1180,7 +1180,7 @@ static int st_open(struct inode *inode, struct file *filp) | |||
1180 | int dev = TAPE_NR(inode); | 1180 | int dev = TAPE_NR(inode); |
1181 | char *name; | 1181 | char *name; |
1182 | 1182 | ||
1183 | lock_kernel(); | 1183 | mutex_lock(&st_mutex); |
1184 | /* | 1184 | /* |
1185 | * We really want to do nonseekable_open(inode, filp); here, but some | 1185 | * We really want to do nonseekable_open(inode, filp); here, but some |
1186 | * versions of tar incorrectly call lseek on tapes and bail out if that | 1186 | * versions of tar incorrectly call lseek on tapes and bail out if that |
@@ -1189,7 +1189,7 @@ static int st_open(struct inode *inode, struct file *filp) | |||
1189 | filp->f_mode &= ~(FMODE_PREAD | FMODE_PWRITE); | 1189 | filp->f_mode &= ~(FMODE_PREAD | FMODE_PWRITE); |
1190 | 1190 | ||
1191 | if (!(STp = scsi_tape_get(dev))) { | 1191 | if (!(STp = scsi_tape_get(dev))) { |
1192 | unlock_kernel(); | 1192 | mutex_unlock(&st_mutex); |
1193 | return -ENXIO; | 1193 | return -ENXIO; |
1194 | } | 1194 | } |
1195 | 1195 | ||
@@ -1200,7 +1200,7 @@ static int st_open(struct inode *inode, struct file *filp) | |||
1200 | if (STp->in_use) { | 1200 | if (STp->in_use) { |
1201 | write_unlock(&st_dev_arr_lock); | 1201 | write_unlock(&st_dev_arr_lock); |
1202 | scsi_tape_put(STp); | 1202 | scsi_tape_put(STp); |
1203 | unlock_kernel(); | 1203 | mutex_unlock(&st_mutex); |
1204 | DEB( printk(ST_DEB_MSG "%s: Device already in use.\n", name); ) | 1204 | DEB( printk(ST_DEB_MSG "%s: Device already in use.\n", name); ) |
1205 | return (-EBUSY); | 1205 | return (-EBUSY); |
1206 | } | 1206 | } |
@@ -1249,14 +1249,14 @@ static int st_open(struct inode *inode, struct file *filp) | |||
1249 | retval = (-EIO); | 1249 | retval = (-EIO); |
1250 | goto err_out; | 1250 | goto err_out; |
1251 | } | 1251 | } |
1252 | unlock_kernel(); | 1252 | mutex_unlock(&st_mutex); |
1253 | return 0; | 1253 | return 0; |
1254 | 1254 | ||
1255 | err_out: | 1255 | err_out: |
1256 | normalize_buffer(STp->buffer); | 1256 | normalize_buffer(STp->buffer); |
1257 | STp->in_use = 0; | 1257 | STp->in_use = 0; |
1258 | scsi_tape_put(STp); | 1258 | scsi_tape_put(STp); |
1259 | unlock_kernel(); | 1259 | mutex_unlock(&st_mutex); |
1260 | return retval; | 1260 | return retval; |
1261 | 1261 | ||
1262 | } | 1262 | } |