diff options
Diffstat (limited to 'drivers/scsi/st.c')
| -rw-r--r-- | drivers/scsi/st.c | 42 |
1 files changed, 9 insertions, 33 deletions
diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c index c4aade8f5345..13b1d3aac265 100644 --- a/drivers/scsi/st.c +++ b/drivers/scsi/st.c | |||
| @@ -38,6 +38,7 @@ static const char *verstr = "20050830"; | |||
| 38 | #include <linux/devfs_fs_kernel.h> | 38 | #include <linux/devfs_fs_kernel.h> |
| 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 | 42 | ||
| 42 | #include <asm/uaccess.h> | 43 | #include <asm/uaccess.h> |
| 43 | #include <asm/dma.h> | 44 | #include <asm/dma.h> |
| @@ -193,7 +194,6 @@ static int sgl_unmap_user_pages(struct scatterlist *, const unsigned int, int); | |||
| 193 | 194 | ||
| 194 | static int st_probe(struct device *); | 195 | static int st_probe(struct device *); |
| 195 | static int st_remove(struct device *); | 196 | static int st_remove(struct device *); |
| 196 | static int st_init_command(struct scsi_cmnd *); | ||
| 197 | 197 | ||
| 198 | static void do_create_driverfs_files(void); | 198 | static void do_create_driverfs_files(void); |
| 199 | static void do_remove_driverfs_files(void); | 199 | static void do_remove_driverfs_files(void); |
| @@ -206,7 +206,6 @@ static struct scsi_driver st_template = { | |||
| 206 | .probe = st_probe, | 206 | .probe = st_probe, |
| 207 | .remove = st_remove, | 207 | .remove = st_remove, |
| 208 | }, | 208 | }, |
| 209 | .init_command = st_init_command, | ||
| 210 | }; | 209 | }; |
| 211 | 210 | ||
| 212 | static int st_compression(struct scsi_tape *, int); | 211 | static int st_compression(struct scsi_tape *, int); |
| @@ -220,7 +219,7 @@ static void scsi_tape_release(struct kref *); | |||
| 220 | 219 | ||
| 221 | #define to_scsi_tape(obj) container_of(obj, struct scsi_tape, kref) | 220 | #define to_scsi_tape(obj) container_of(obj, struct scsi_tape, kref) |
| 222 | 221 | ||
| 223 | static DECLARE_MUTEX(st_ref_sem); | 222 | static DEFINE_MUTEX(st_ref_mutex); |
| 224 | 223 | ||
| 225 | 224 | ||
| 226 | #include "osst_detect.h" | 225 | #include "osst_detect.h" |
| @@ -237,7 +236,7 @@ static struct scsi_tape *scsi_tape_get(int dev) | |||
| 237 | { | 236 | { |
| 238 | struct scsi_tape *STp = NULL; | 237 | struct scsi_tape *STp = NULL; |
| 239 | 238 | ||
| 240 | down(&st_ref_sem); | 239 | mutex_lock(&st_ref_mutex); |
| 241 | write_lock(&st_dev_arr_lock); | 240 | write_lock(&st_dev_arr_lock); |
| 242 | 241 | ||
| 243 | if (dev < st_dev_max && scsi_tapes != NULL) | 242 | if (dev < st_dev_max && scsi_tapes != NULL) |
| @@ -259,7 +258,7 @@ out_put: | |||
| 259 | STp = NULL; | 258 | STp = NULL; |
| 260 | out: | 259 | out: |
| 261 | write_unlock(&st_dev_arr_lock); | 260 | write_unlock(&st_dev_arr_lock); |
| 262 | up(&st_ref_sem); | 261 | mutex_unlock(&st_ref_mutex); |
| 263 | return STp; | 262 | return STp; |
| 264 | } | 263 | } |
| 265 | 264 | ||
| @@ -267,10 +266,10 @@ static void scsi_tape_put(struct scsi_tape *STp) | |||
| 267 | { | 266 | { |
| 268 | struct scsi_device *sdev = STp->device; | 267 | struct scsi_device *sdev = STp->device; |
| 269 | 268 | ||
| 270 | down(&st_ref_sem); | 269 | mutex_lock(&st_ref_mutex); |
| 271 | kref_put(&STp->kref, scsi_tape_release); | 270 | kref_put(&STp->kref, scsi_tape_release); |
| 272 | scsi_device_put(sdev); | 271 | scsi_device_put(sdev); |
| 273 | up(&st_ref_sem); | 272 | mutex_unlock(&st_ref_mutex); |
| 274 | } | 273 | } |
| 275 | 274 | ||
| 276 | struct st_reject_data { | 275 | struct st_reject_data { |
| @@ -4141,9 +4140,9 @@ static int st_remove(struct device *dev) | |||
| 4141 | } | 4140 | } |
| 4142 | } | 4141 | } |
| 4143 | 4142 | ||
| 4144 | down(&st_ref_sem); | 4143 | mutex_lock(&st_ref_mutex); |
| 4145 | kref_put(&tpnt->kref, scsi_tape_release); | 4144 | kref_put(&tpnt->kref, scsi_tape_release); |
| 4146 | up(&st_ref_sem); | 4145 | mutex_unlock(&st_ref_mutex); |
| 4147 | return 0; | 4146 | return 0; |
| 4148 | } | 4147 | } |
| 4149 | } | 4148 | } |
| @@ -4156,7 +4155,7 @@ static int st_remove(struct device *dev) | |||
| 4156 | * scsi_tape_release - Called to free the Scsi_Tape structure | 4155 | * scsi_tape_release - Called to free the Scsi_Tape structure |
| 4157 | * @kref: pointer to embedded kref | 4156 | * @kref: pointer to embedded kref |
| 4158 | * | 4157 | * |
| 4159 | * st_ref_sem must be held entering this routine. Because it is | 4158 | * st_ref_mutex must be held entering this routine. Because it is |
| 4160 | * called on last put, you should always use the scsi_tape_get() | 4159 | * called on last put, you should always use the scsi_tape_get() |
| 4161 | * scsi_tape_put() helpers which manipulate the semaphore directly | 4160 | * scsi_tape_put() helpers which manipulate the semaphore directly |
| 4162 | * and never do a direct kref_put(). | 4161 | * and never do a direct kref_put(). |
| @@ -4180,29 +4179,6 @@ static void scsi_tape_release(struct kref *kref) | |||
| 4180 | return; | 4179 | return; |
| 4181 | } | 4180 | } |
| 4182 | 4181 | ||
| 4183 | static void st_intr(struct scsi_cmnd *SCpnt) | ||
| 4184 | { | ||
| 4185 | /* | ||
| 4186 | * The caller should be checking the request's errors | ||
| 4187 | * value. | ||
| 4188 | */ | ||
| 4189 | scsi_io_completion(SCpnt, SCpnt->bufflen, 0); | ||
| 4190 | } | ||
| 4191 | |||
| 4192 | /* | ||
| 4193 | * st_init_command: only called via the scsi_cmd_ioctl (block SG_IO) | ||
| 4194 | * interface for REQ_BLOCK_PC commands. | ||
| 4195 | */ | ||
| 4196 | static int st_init_command(struct scsi_cmnd *SCpnt) | ||
| 4197 | { | ||
| 4198 | if (!(SCpnt->request->flags & REQ_BLOCK_PC)) | ||
| 4199 | return 0; | ||
| 4200 | |||
| 4201 | scsi_setup_blk_pc_cmnd(SCpnt); | ||
| 4202 | SCpnt->done = st_intr; | ||
| 4203 | return 1; | ||
| 4204 | } | ||
| 4205 | |||
| 4206 | static int __init init_st(void) | 4182 | static int __init init_st(void) |
| 4207 | { | 4183 | { |
| 4208 | validate_options(); | 4184 | validate_options(); |
