0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014 static int sg_version_num = 30536;
0015 #define SG_VERSION_STR "3.5.36"
0016
0017
0018
0019
0020
0021
0022
0023
0024 #include <linux/module.h>
0025
0026 #include <linux/fs.h>
0027 #include <linux/kernel.h>
0028 #include <linux/sched.h>
0029 #include <linux/string.h>
0030 #include <linux/mm.h>
0031 #include <linux/errno.h>
0032 #include <linux/mtio.h>
0033 #include <linux/ioctl.h>
0034 #include <linux/major.h>
0035 #include <linux/slab.h>
0036 #include <linux/fcntl.h>
0037 #include <linux/init.h>
0038 #include <linux/poll.h>
0039 #include <linux/moduleparam.h>
0040 #include <linux/cdev.h>
0041 #include <linux/idr.h>
0042 #include <linux/seq_file.h>
0043 #include <linux/blkdev.h>
0044 #include <linux/delay.h>
0045 #include <linux/blktrace_api.h>
0046 #include <linux/mutex.h>
0047 #include <linux/atomic.h>
0048 #include <linux/ratelimit.h>
0049 #include <linux/uio.h>
0050 #include <linux/cred.h> /* for sg_check_file_access() */
0051
0052 #include <scsi/scsi.h>
0053 #include <scsi/scsi_cmnd.h>
0054 #include <scsi/scsi_dbg.h>
0055 #include <scsi/scsi_device.h>
0056 #include <scsi/scsi_driver.h>
0057 #include <scsi/scsi_eh.h>
0058 #include <scsi/scsi_host.h>
0059 #include <scsi/scsi_ioctl.h>
0060 #include <scsi/scsi_tcq.h>
0061 #include <scsi/sg.h>
0062
0063 #include "scsi_logging.h"
0064
0065 #ifdef CONFIG_SCSI_PROC_FS
0066 #include <linux/proc_fs.h>
0067 static char *sg_version_date = "20140603";
0068
0069 static int sg_proc_init(void);
0070 #endif
0071
0072 #define SG_ALLOW_DIO_DEF 0
0073
0074 #define SG_MAX_DEVS 32768
0075
0076
0077
0078
0079
0080 #define SG_MAX_CDB_SIZE 252
0081
0082 #define SG_DEFAULT_TIMEOUT mult_frac(SG_DEFAULT_TIMEOUT_USER, HZ, USER_HZ)
0083
0084 static int sg_big_buff = SG_DEF_RESERVED_SIZE;
0085
0086
0087
0088
0089
0090
0091 static int def_reserved_size = -1;
0092 static int sg_allow_dio = SG_ALLOW_DIO_DEF;
0093
0094 static int scatter_elem_sz = SG_SCATTER_SZ;
0095 static int scatter_elem_sz_prev = SG_SCATTER_SZ;
0096
0097 #define SG_SECTOR_SZ 512
0098
0099 static int sg_add_device(struct device *, struct class_interface *);
0100 static void sg_remove_device(struct device *, struct class_interface *);
0101
0102 static DEFINE_IDR(sg_index_idr);
0103 static DEFINE_RWLOCK(sg_index_lock);
0104
0105
0106 static struct class_interface sg_interface = {
0107 .add_dev = sg_add_device,
0108 .remove_dev = sg_remove_device,
0109 };
0110
0111 typedef struct sg_scatter_hold {
0112 unsigned short k_use_sg;
0113 unsigned sglist_len;
0114 unsigned bufflen;
0115 struct page **pages;
0116 int page_order;
0117 char dio_in_use;
0118 unsigned char cmd_opcode;
0119 } Sg_scatter_hold;
0120
0121 struct sg_device;
0122 struct sg_fd;
0123
0124 typedef struct sg_request {
0125 struct list_head entry;
0126 struct sg_fd *parentfp;
0127 Sg_scatter_hold data;
0128 sg_io_hdr_t header;
0129 unsigned char sense_b[SCSI_SENSE_BUFFERSIZE];
0130 char res_used;
0131 char orphan;
0132 char sg_io_owned;
0133
0134 char done;
0135 struct request *rq;
0136 struct bio *bio;
0137 struct execute_work ew;
0138 } Sg_request;
0139
0140 typedef struct sg_fd {
0141 struct list_head sfd_siblings;
0142 struct sg_device *parentdp;
0143 wait_queue_head_t read_wait;
0144 rwlock_t rq_list_lock;
0145 struct mutex f_mutex;
0146 int timeout;
0147 int timeout_user;
0148 Sg_scatter_hold reserve;
0149 struct list_head rq_list;
0150 struct fasync_struct *async_qp;
0151 Sg_request req_arr[SG_MAX_QUEUE];
0152 char force_packid;
0153 char cmd_q;
0154 unsigned char next_cmd_len;
0155 char keep_orphan;
0156 char mmap_called;
0157 char res_in_use;
0158 struct kref f_ref;
0159 struct execute_work ew;
0160 } Sg_fd;
0161
0162 typedef struct sg_device {
0163 struct scsi_device *device;
0164 wait_queue_head_t open_wait;
0165 struct mutex open_rel_lock;
0166 int sg_tablesize;
0167 u32 index;
0168 struct list_head sfds;
0169 rwlock_t sfd_lock;
0170 atomic_t detaching;
0171 bool exclude;
0172 int open_cnt;
0173 char sgdebug;
0174 char name[DISK_NAME_LEN];
0175 struct cdev * cdev;
0176 struct kref d_ref;
0177 } Sg_device;
0178
0179
0180 static void sg_rq_end_io(struct request *rq, blk_status_t status);
0181 static int sg_start_req(Sg_request *srp, unsigned char *cmd);
0182 static int sg_finish_rem_req(Sg_request * srp);
0183 static int sg_build_indirect(Sg_scatter_hold * schp, Sg_fd * sfp, int buff_size);
0184 static ssize_t sg_new_read(Sg_fd * sfp, char __user *buf, size_t count,
0185 Sg_request * srp);
0186 static ssize_t sg_new_write(Sg_fd *sfp, struct file *file,
0187 const char __user *buf, size_t count, int blocking,
0188 int read_only, int sg_io_owned, Sg_request **o_srp);
0189 static int sg_common_write(Sg_fd * sfp, Sg_request * srp,
0190 unsigned char *cmnd, int timeout, int blocking);
0191 static int sg_read_oxfer(Sg_request * srp, char __user *outp, int num_read_xfer);
0192 static void sg_remove_scat(Sg_fd * sfp, Sg_scatter_hold * schp);
0193 static void sg_build_reserve(Sg_fd * sfp, int req_size);
0194 static void sg_link_reserve(Sg_fd * sfp, Sg_request * srp, int size);
0195 static void sg_unlink_reserve(Sg_fd * sfp, Sg_request * srp);
0196 static Sg_fd *sg_add_sfp(Sg_device * sdp);
0197 static void sg_remove_sfp(struct kref *);
0198 static Sg_request *sg_get_rq_mark(Sg_fd * sfp, int pack_id, bool *busy);
0199 static Sg_request *sg_add_request(Sg_fd * sfp);
0200 static int sg_remove_request(Sg_fd * sfp, Sg_request * srp);
0201 static Sg_device *sg_get_dev(int dev);
0202 static void sg_device_destroy(struct kref *kref);
0203
0204 #define SZ_SG_HEADER sizeof(struct sg_header)
0205 #define SZ_SG_IO_HDR sizeof(sg_io_hdr_t)
0206 #define SZ_SG_IOVEC sizeof(sg_iovec_t)
0207 #define SZ_SG_REQ_INFO sizeof(sg_req_info_t)
0208
0209 #define sg_printk(prefix, sdp, fmt, a...) \
0210 sdev_prefix_printk(prefix, (sdp)->device, (sdp)->name, fmt, ##a)
0211
0212
0213
0214
0215
0216
0217
0218
0219
0220
0221
0222
0223
0224 static int sg_check_file_access(struct file *filp, const char *caller)
0225 {
0226 if (filp->f_cred != current_real_cred()) {
0227 pr_err_once("%s: process %d (%s) changed security contexts after opening file descriptor, this is not allowed.\n",
0228 caller, task_tgid_vnr(current), current->comm);
0229 return -EPERM;
0230 }
0231 return 0;
0232 }
0233
0234 static int sg_allow_access(struct file *filp, unsigned char *cmd)
0235 {
0236 struct sg_fd *sfp = filp->private_data;
0237
0238 if (sfp->parentdp->device->type == TYPE_SCANNER)
0239 return 0;
0240 if (!scsi_cmd_allowed(cmd, filp->f_mode))
0241 return -EPERM;
0242 return 0;
0243 }
0244
0245 static int
0246 open_wait(Sg_device *sdp, int flags)
0247 {
0248 int retval = 0;
0249
0250 if (flags & O_EXCL) {
0251 while (sdp->open_cnt > 0) {
0252 mutex_unlock(&sdp->open_rel_lock);
0253 retval = wait_event_interruptible(sdp->open_wait,
0254 (atomic_read(&sdp->detaching) ||
0255 !sdp->open_cnt));
0256 mutex_lock(&sdp->open_rel_lock);
0257
0258 if (retval)
0259 return retval;
0260 if (atomic_read(&sdp->detaching))
0261 return -ENODEV;
0262 }
0263 } else {
0264 while (sdp->exclude) {
0265 mutex_unlock(&sdp->open_rel_lock);
0266 retval = wait_event_interruptible(sdp->open_wait,
0267 (atomic_read(&sdp->detaching) ||
0268 !sdp->exclude));
0269 mutex_lock(&sdp->open_rel_lock);
0270
0271 if (retval)
0272 return retval;
0273 if (atomic_read(&sdp->detaching))
0274 return -ENODEV;
0275 }
0276 }
0277
0278 return retval;
0279 }
0280
0281
0282 static int
0283 sg_open(struct inode *inode, struct file *filp)
0284 {
0285 int dev = iminor(inode);
0286 int flags = filp->f_flags;
0287 struct request_queue *q;
0288 Sg_device *sdp;
0289 Sg_fd *sfp;
0290 int retval;
0291
0292 nonseekable_open(inode, filp);
0293 if ((flags & O_EXCL) && (O_RDONLY == (flags & O_ACCMODE)))
0294 return -EPERM;
0295 sdp = sg_get_dev(dev);
0296 if (IS_ERR(sdp))
0297 return PTR_ERR(sdp);
0298
0299 SCSI_LOG_TIMEOUT(3, sg_printk(KERN_INFO, sdp,
0300 "sg_open: flags=0x%x\n", flags));
0301
0302
0303
0304 retval = scsi_device_get(sdp->device);
0305 if (retval)
0306 goto sg_put;
0307
0308 retval = scsi_autopm_get_device(sdp->device);
0309 if (retval)
0310 goto sdp_put;
0311
0312
0313
0314
0315 if (!((flags & O_NONBLOCK) ||
0316 scsi_block_when_processing_errors(sdp->device))) {
0317 retval = -ENXIO;
0318
0319 goto error_out;
0320 }
0321
0322 mutex_lock(&sdp->open_rel_lock);
0323 if (flags & O_NONBLOCK) {
0324 if (flags & O_EXCL) {
0325 if (sdp->open_cnt > 0) {
0326 retval = -EBUSY;
0327 goto error_mutex_locked;
0328 }
0329 } else {
0330 if (sdp->exclude) {
0331 retval = -EBUSY;
0332 goto error_mutex_locked;
0333 }
0334 }
0335 } else {
0336 retval = open_wait(sdp, flags);
0337 if (retval)
0338 goto error_mutex_locked;
0339 }
0340
0341
0342 if (flags & O_EXCL)
0343 sdp->exclude = true;
0344
0345 if (sdp->open_cnt < 1) {
0346 sdp->sgdebug = 0;
0347 q = sdp->device->request_queue;
0348 sdp->sg_tablesize = queue_max_segments(q);
0349 }
0350 sfp = sg_add_sfp(sdp);
0351 if (IS_ERR(sfp)) {
0352 retval = PTR_ERR(sfp);
0353 goto out_undo;
0354 }
0355
0356 filp->private_data = sfp;
0357 sdp->open_cnt++;
0358 mutex_unlock(&sdp->open_rel_lock);
0359
0360 retval = 0;
0361 sg_put:
0362 kref_put(&sdp->d_ref, sg_device_destroy);
0363 return retval;
0364
0365 out_undo:
0366 if (flags & O_EXCL) {
0367 sdp->exclude = false;
0368 wake_up_interruptible(&sdp->open_wait);
0369 }
0370 error_mutex_locked:
0371 mutex_unlock(&sdp->open_rel_lock);
0372 error_out:
0373 scsi_autopm_put_device(sdp->device);
0374 sdp_put:
0375 scsi_device_put(sdp->device);
0376 goto sg_put;
0377 }
0378
0379
0380
0381 static int
0382 sg_release(struct inode *inode, struct file *filp)
0383 {
0384 Sg_device *sdp;
0385 Sg_fd *sfp;
0386
0387 if ((!(sfp = (Sg_fd *) filp->private_data)) || (!(sdp = sfp->parentdp)))
0388 return -ENXIO;
0389 SCSI_LOG_TIMEOUT(3, sg_printk(KERN_INFO, sdp, "sg_release\n"));
0390
0391 mutex_lock(&sdp->open_rel_lock);
0392 scsi_autopm_put_device(sdp->device);
0393 kref_put(&sfp->f_ref, sg_remove_sfp);
0394 sdp->open_cnt--;
0395
0396
0397
0398 if (sdp->exclude) {
0399 sdp->exclude = false;
0400 wake_up_interruptible_all(&sdp->open_wait);
0401 } else if (0 == sdp->open_cnt) {
0402 wake_up_interruptible(&sdp->open_wait);
0403 }
0404 mutex_unlock(&sdp->open_rel_lock);
0405 return 0;
0406 }
0407
0408 static int get_sg_io_pack_id(int *pack_id, void __user *buf, size_t count)
0409 {
0410 struct sg_header __user *old_hdr = buf;
0411 int reply_len;
0412
0413 if (count >= SZ_SG_HEADER) {
0414
0415 if (get_user(reply_len, &old_hdr->reply_len))
0416 return -EFAULT;
0417
0418 if (reply_len >= 0)
0419 return get_user(*pack_id, &old_hdr->pack_id);
0420
0421 if (in_compat_syscall() &&
0422 count >= sizeof(struct compat_sg_io_hdr)) {
0423 struct compat_sg_io_hdr __user *hp = buf;
0424
0425 return get_user(*pack_id, &hp->pack_id);
0426 }
0427
0428 if (count >= sizeof(struct sg_io_hdr)) {
0429 struct sg_io_hdr __user *hp = buf;
0430
0431 return get_user(*pack_id, &hp->pack_id);
0432 }
0433 }
0434
0435
0436 *pack_id = -1;
0437 return 0;
0438 }
0439
0440 static ssize_t
0441 sg_read(struct file *filp, char __user *buf, size_t count, loff_t * ppos)
0442 {
0443 Sg_device *sdp;
0444 Sg_fd *sfp;
0445 Sg_request *srp;
0446 int req_pack_id = -1;
0447 bool busy;
0448 sg_io_hdr_t *hp;
0449 struct sg_header *old_hdr;
0450 int retval;
0451
0452
0453
0454
0455
0456 retval = sg_check_file_access(filp, __func__);
0457 if (retval)
0458 return retval;
0459
0460 if ((!(sfp = (Sg_fd *) filp->private_data)) || (!(sdp = sfp->parentdp)))
0461 return -ENXIO;
0462 SCSI_LOG_TIMEOUT(3, sg_printk(KERN_INFO, sdp,
0463 "sg_read: count=%d\n", (int) count));
0464
0465 if (sfp->force_packid)
0466 retval = get_sg_io_pack_id(&req_pack_id, buf, count);
0467 if (retval)
0468 return retval;
0469
0470 srp = sg_get_rq_mark(sfp, req_pack_id, &busy);
0471 if (!srp) {
0472 if (filp->f_flags & O_NONBLOCK)
0473 return -EAGAIN;
0474 retval = wait_event_interruptible(sfp->read_wait,
0475 ((srp = sg_get_rq_mark(sfp, req_pack_id, &busy)) ||
0476 (!busy && atomic_read(&sdp->detaching))));
0477 if (!srp)
0478
0479 return retval ? retval : -ENODEV;
0480 }
0481 if (srp->header.interface_id != '\0')
0482 return sg_new_read(sfp, buf, count, srp);
0483
0484 hp = &srp->header;
0485 old_hdr = kzalloc(SZ_SG_HEADER, GFP_KERNEL);
0486 if (!old_hdr)
0487 return -ENOMEM;
0488
0489 old_hdr->reply_len = (int) hp->timeout;
0490 old_hdr->pack_len = old_hdr->reply_len;
0491 old_hdr->pack_id = hp->pack_id;
0492 old_hdr->twelve_byte =
0493 ((srp->data.cmd_opcode >= 0xc0) && (12 == hp->cmd_len)) ? 1 : 0;
0494 old_hdr->target_status = hp->masked_status;
0495 old_hdr->host_status = hp->host_status;
0496 old_hdr->driver_status = hp->driver_status;
0497 if ((CHECK_CONDITION & hp->masked_status) ||
0498 (srp->sense_b[0] & 0x70) == 0x70) {
0499 old_hdr->driver_status = DRIVER_SENSE;
0500 memcpy(old_hdr->sense_buffer, srp->sense_b,
0501 sizeof (old_hdr->sense_buffer));
0502 }
0503 switch (hp->host_status) {
0504
0505
0506 case DID_OK:
0507 case DID_PASSTHROUGH:
0508 case DID_SOFT_ERROR:
0509 old_hdr->result = 0;
0510 break;
0511 case DID_NO_CONNECT:
0512 case DID_BUS_BUSY:
0513 case DID_TIME_OUT:
0514 old_hdr->result = EBUSY;
0515 break;
0516 case DID_BAD_TARGET:
0517 case DID_ABORT:
0518 case DID_PARITY:
0519 case DID_RESET:
0520 case DID_BAD_INTR:
0521 old_hdr->result = EIO;
0522 break;
0523 case DID_ERROR:
0524 old_hdr->result = (srp->sense_b[0] == 0 &&
0525 hp->masked_status == GOOD) ? 0 : EIO;
0526 break;
0527 default:
0528 old_hdr->result = EIO;
0529 break;
0530 }
0531
0532
0533 if (count >= SZ_SG_HEADER) {
0534 if (copy_to_user(buf, old_hdr, SZ_SG_HEADER)) {
0535 retval = -EFAULT;
0536 goto free_old_hdr;
0537 }
0538 buf += SZ_SG_HEADER;
0539 if (count > old_hdr->reply_len)
0540 count = old_hdr->reply_len;
0541 if (count > SZ_SG_HEADER) {
0542 if (sg_read_oxfer(srp, buf, count - SZ_SG_HEADER)) {
0543 retval = -EFAULT;
0544 goto free_old_hdr;
0545 }
0546 }
0547 } else
0548 count = (old_hdr->result == 0) ? 0 : -EIO;
0549 sg_finish_rem_req(srp);
0550 sg_remove_request(sfp, srp);
0551 retval = count;
0552 free_old_hdr:
0553 kfree(old_hdr);
0554 return retval;
0555 }
0556
0557 static ssize_t
0558 sg_new_read(Sg_fd * sfp, char __user *buf, size_t count, Sg_request * srp)
0559 {
0560 sg_io_hdr_t *hp = &srp->header;
0561 int err = 0, err2;
0562 int len;
0563
0564 if (in_compat_syscall()) {
0565 if (count < sizeof(struct compat_sg_io_hdr)) {
0566 err = -EINVAL;
0567 goto err_out;
0568 }
0569 } else if (count < SZ_SG_IO_HDR) {
0570 err = -EINVAL;
0571 goto err_out;
0572 }
0573 hp->sb_len_wr = 0;
0574 if ((hp->mx_sb_len > 0) && hp->sbp) {
0575 if ((CHECK_CONDITION & hp->masked_status) ||
0576 (srp->sense_b[0] & 0x70) == 0x70) {
0577 int sb_len = SCSI_SENSE_BUFFERSIZE;
0578 sb_len = (hp->mx_sb_len > sb_len) ? sb_len : hp->mx_sb_len;
0579 len = 8 + (int) srp->sense_b[7];
0580 len = (len > sb_len) ? sb_len : len;
0581 if (copy_to_user(hp->sbp, srp->sense_b, len)) {
0582 err = -EFAULT;
0583 goto err_out;
0584 }
0585 hp->driver_status = DRIVER_SENSE;
0586 hp->sb_len_wr = len;
0587 }
0588 }
0589 if (hp->masked_status || hp->host_status || hp->driver_status)
0590 hp->info |= SG_INFO_CHECK;
0591 err = put_sg_io_hdr(hp, buf);
0592 err_out:
0593 err2 = sg_finish_rem_req(srp);
0594 sg_remove_request(sfp, srp);
0595 return err ? : err2 ? : count;
0596 }
0597
0598 static ssize_t
0599 sg_write(struct file *filp, const char __user *buf, size_t count, loff_t * ppos)
0600 {
0601 int mxsize, cmd_size, k;
0602 int input_size, blocking;
0603 unsigned char opcode;
0604 Sg_device *sdp;
0605 Sg_fd *sfp;
0606 Sg_request *srp;
0607 struct sg_header old_hdr;
0608 sg_io_hdr_t *hp;
0609 unsigned char cmnd[SG_MAX_CDB_SIZE];
0610 int retval;
0611
0612 retval = sg_check_file_access(filp, __func__);
0613 if (retval)
0614 return retval;
0615
0616 if ((!(sfp = (Sg_fd *) filp->private_data)) || (!(sdp = sfp->parentdp)))
0617 return -ENXIO;
0618 SCSI_LOG_TIMEOUT(3, sg_printk(KERN_INFO, sdp,
0619 "sg_write: count=%d\n", (int) count));
0620 if (atomic_read(&sdp->detaching))
0621 return -ENODEV;
0622 if (!((filp->f_flags & O_NONBLOCK) ||
0623 scsi_block_when_processing_errors(sdp->device)))
0624 return -ENXIO;
0625
0626 if (count < SZ_SG_HEADER)
0627 return -EIO;
0628 if (copy_from_user(&old_hdr, buf, SZ_SG_HEADER))
0629 return -EFAULT;
0630 blocking = !(filp->f_flags & O_NONBLOCK);
0631 if (old_hdr.reply_len < 0)
0632 return sg_new_write(sfp, filp, buf, count,
0633 blocking, 0, 0, NULL);
0634 if (count < (SZ_SG_HEADER + 6))
0635 return -EIO;
0636
0637 buf += SZ_SG_HEADER;
0638 if (get_user(opcode, buf))
0639 return -EFAULT;
0640
0641 if (!(srp = sg_add_request(sfp))) {
0642 SCSI_LOG_TIMEOUT(1, sg_printk(KERN_INFO, sdp,
0643 "sg_write: queue full\n"));
0644 return -EDOM;
0645 }
0646 mutex_lock(&sfp->f_mutex);
0647 if (sfp->next_cmd_len > 0) {
0648 cmd_size = sfp->next_cmd_len;
0649 sfp->next_cmd_len = 0;
0650 } else {
0651 cmd_size = COMMAND_SIZE(opcode);
0652 if ((opcode >= 0xc0) && old_hdr.twelve_byte)
0653 cmd_size = 12;
0654 }
0655 mutex_unlock(&sfp->f_mutex);
0656 SCSI_LOG_TIMEOUT(4, sg_printk(KERN_INFO, sdp,
0657 "sg_write: scsi opcode=0x%02x, cmd_size=%d\n", (int) opcode, cmd_size));
0658
0659 input_size = count - cmd_size;
0660 mxsize = (input_size > old_hdr.reply_len) ? input_size : old_hdr.reply_len;
0661 mxsize -= SZ_SG_HEADER;
0662 input_size -= SZ_SG_HEADER;
0663 if (input_size < 0) {
0664 sg_remove_request(sfp, srp);
0665 return -EIO;
0666 }
0667 hp = &srp->header;
0668 hp->interface_id = '\0';
0669 hp->cmd_len = (unsigned char) cmd_size;
0670 hp->iovec_count = 0;
0671 hp->mx_sb_len = 0;
0672 if (input_size > 0)
0673 hp->dxfer_direction = (old_hdr.reply_len > SZ_SG_HEADER) ?
0674 SG_DXFER_TO_FROM_DEV : SG_DXFER_TO_DEV;
0675 else
0676 hp->dxfer_direction = (mxsize > 0) ? SG_DXFER_FROM_DEV : SG_DXFER_NONE;
0677 hp->dxfer_len = mxsize;
0678 if ((hp->dxfer_direction == SG_DXFER_TO_DEV) ||
0679 (hp->dxfer_direction == SG_DXFER_TO_FROM_DEV))
0680 hp->dxferp = (char __user *)buf + cmd_size;
0681 else
0682 hp->dxferp = NULL;
0683 hp->sbp = NULL;
0684 hp->timeout = old_hdr.reply_len;
0685 hp->flags = input_size;
0686 hp->pack_id = old_hdr.pack_id;
0687 hp->usr_ptr = NULL;
0688 if (copy_from_user(cmnd, buf, cmd_size)) {
0689 sg_remove_request(sfp, srp);
0690 return -EFAULT;
0691 }
0692
0693
0694
0695
0696
0697 if (hp->dxfer_direction == SG_DXFER_TO_FROM_DEV) {
0698 printk_ratelimited(KERN_WARNING
0699 "sg_write: data in/out %d/%d bytes "
0700 "for SCSI command 0x%x-- guessing "
0701 "data in;\n program %s not setting "
0702 "count and/or reply_len properly\n",
0703 old_hdr.reply_len - (int)SZ_SG_HEADER,
0704 input_size, (unsigned int) cmnd[0],
0705 current->comm);
0706 }
0707 k = sg_common_write(sfp, srp, cmnd, sfp->timeout, blocking);
0708 return (k < 0) ? k : count;
0709 }
0710
0711 static ssize_t
0712 sg_new_write(Sg_fd *sfp, struct file *file, const char __user *buf,
0713 size_t count, int blocking, int read_only, int sg_io_owned,
0714 Sg_request **o_srp)
0715 {
0716 int k;
0717 Sg_request *srp;
0718 sg_io_hdr_t *hp;
0719 unsigned char cmnd[SG_MAX_CDB_SIZE];
0720 int timeout;
0721 unsigned long ul_timeout;
0722
0723 if (count < SZ_SG_IO_HDR)
0724 return -EINVAL;
0725
0726 sfp->cmd_q = 1;
0727 if (!(srp = sg_add_request(sfp))) {
0728 SCSI_LOG_TIMEOUT(1, sg_printk(KERN_INFO, sfp->parentdp,
0729 "sg_new_write: queue full\n"));
0730 return -EDOM;
0731 }
0732 srp->sg_io_owned = sg_io_owned;
0733 hp = &srp->header;
0734 if (get_sg_io_hdr(hp, buf)) {
0735 sg_remove_request(sfp, srp);
0736 return -EFAULT;
0737 }
0738 if (hp->interface_id != 'S') {
0739 sg_remove_request(sfp, srp);
0740 return -ENOSYS;
0741 }
0742 if (hp->flags & SG_FLAG_MMAP_IO) {
0743 if (hp->dxfer_len > sfp->reserve.bufflen) {
0744 sg_remove_request(sfp, srp);
0745 return -ENOMEM;
0746 }
0747 if (hp->flags & SG_FLAG_DIRECT_IO) {
0748 sg_remove_request(sfp, srp);
0749 return -EINVAL;
0750 }
0751 if (sfp->res_in_use) {
0752 sg_remove_request(sfp, srp);
0753 return -EBUSY;
0754 }
0755 }
0756 ul_timeout = msecs_to_jiffies(srp->header.timeout);
0757 timeout = (ul_timeout < INT_MAX) ? ul_timeout : INT_MAX;
0758 if ((!hp->cmdp) || (hp->cmd_len < 6) || (hp->cmd_len > sizeof (cmnd))) {
0759 sg_remove_request(sfp, srp);
0760 return -EMSGSIZE;
0761 }
0762 if (copy_from_user(cmnd, hp->cmdp, hp->cmd_len)) {
0763 sg_remove_request(sfp, srp);
0764 return -EFAULT;
0765 }
0766 if (read_only && sg_allow_access(file, cmnd)) {
0767 sg_remove_request(sfp, srp);
0768 return -EPERM;
0769 }
0770 k = sg_common_write(sfp, srp, cmnd, timeout, blocking);
0771 if (k < 0)
0772 return k;
0773 if (o_srp)
0774 *o_srp = srp;
0775 return count;
0776 }
0777
0778 static int
0779 sg_common_write(Sg_fd * sfp, Sg_request * srp,
0780 unsigned char *cmnd, int timeout, int blocking)
0781 {
0782 int k, at_head;
0783 Sg_device *sdp = sfp->parentdp;
0784 sg_io_hdr_t *hp = &srp->header;
0785
0786 srp->data.cmd_opcode = cmnd[0];
0787 hp->status = 0;
0788 hp->masked_status = 0;
0789 hp->msg_status = 0;
0790 hp->info = 0;
0791 hp->host_status = 0;
0792 hp->driver_status = 0;
0793 hp->resid = 0;
0794 SCSI_LOG_TIMEOUT(4, sg_printk(KERN_INFO, sfp->parentdp,
0795 "sg_common_write: scsi opcode=0x%02x, cmd_size=%d\n",
0796 (int) cmnd[0], (int) hp->cmd_len));
0797
0798 if (hp->dxfer_len >= SZ_256M) {
0799 sg_remove_request(sfp, srp);
0800 return -EINVAL;
0801 }
0802
0803 k = sg_start_req(srp, cmnd);
0804 if (k) {
0805 SCSI_LOG_TIMEOUT(1, sg_printk(KERN_INFO, sfp->parentdp,
0806 "sg_common_write: start_req err=%d\n", k));
0807 sg_finish_rem_req(srp);
0808 sg_remove_request(sfp, srp);
0809 return k;
0810 }
0811 if (atomic_read(&sdp->detaching)) {
0812 if (srp->bio) {
0813 blk_mq_free_request(srp->rq);
0814 srp->rq = NULL;
0815 }
0816
0817 sg_finish_rem_req(srp);
0818 sg_remove_request(sfp, srp);
0819 return -ENODEV;
0820 }
0821
0822 hp->duration = jiffies_to_msecs(jiffies);
0823 if (hp->interface_id != '\0' &&
0824 (SG_FLAG_Q_AT_TAIL & hp->flags))
0825 at_head = 0;
0826 else
0827 at_head = 1;
0828
0829 srp->rq->timeout = timeout;
0830 kref_get(&sfp->f_ref);
0831 srp->rq->end_io = sg_rq_end_io;
0832 blk_execute_rq_nowait(srp->rq, at_head);
0833 return 0;
0834 }
0835
0836 static int srp_done(Sg_fd *sfp, Sg_request *srp)
0837 {
0838 unsigned long flags;
0839 int ret;
0840
0841 read_lock_irqsave(&sfp->rq_list_lock, flags);
0842 ret = srp->done;
0843 read_unlock_irqrestore(&sfp->rq_list_lock, flags);
0844 return ret;
0845 }
0846
0847 static int max_sectors_bytes(struct request_queue *q)
0848 {
0849 unsigned int max_sectors = queue_max_sectors(q);
0850
0851 max_sectors = min_t(unsigned int, max_sectors, INT_MAX >> 9);
0852
0853 return max_sectors << 9;
0854 }
0855
0856 static void
0857 sg_fill_request_table(Sg_fd *sfp, sg_req_info_t *rinfo)
0858 {
0859 Sg_request *srp;
0860 int val;
0861 unsigned int ms;
0862
0863 val = 0;
0864 list_for_each_entry(srp, &sfp->rq_list, entry) {
0865 if (val >= SG_MAX_QUEUE)
0866 break;
0867 rinfo[val].req_state = srp->done + 1;
0868 rinfo[val].problem =
0869 srp->header.masked_status &
0870 srp->header.host_status &
0871 srp->header.driver_status;
0872 if (srp->done)
0873 rinfo[val].duration =
0874 srp->header.duration;
0875 else {
0876 ms = jiffies_to_msecs(jiffies);
0877 rinfo[val].duration =
0878 (ms > srp->header.duration) ?
0879 (ms - srp->header.duration) : 0;
0880 }
0881 rinfo[val].orphan = srp->orphan;
0882 rinfo[val].sg_io_owned = srp->sg_io_owned;
0883 rinfo[val].pack_id = srp->header.pack_id;
0884 rinfo[val].usr_ptr = srp->header.usr_ptr;
0885 val++;
0886 }
0887 }
0888
0889 #ifdef CONFIG_COMPAT
0890 struct compat_sg_req_info {
0891 char req_state;
0892 char orphan;
0893 char sg_io_owned;
0894 char problem;
0895 int pack_id;
0896 compat_uptr_t usr_ptr;
0897 unsigned int duration;
0898 int unused;
0899 };
0900
0901 static int put_compat_request_table(struct compat_sg_req_info __user *o,
0902 struct sg_req_info *rinfo)
0903 {
0904 int i;
0905 for (i = 0; i < SG_MAX_QUEUE; i++) {
0906 if (copy_to_user(o + i, rinfo + i, offsetof(sg_req_info_t, usr_ptr)) ||
0907 put_user((uintptr_t)rinfo[i].usr_ptr, &o[i].usr_ptr) ||
0908 put_user(rinfo[i].duration, &o[i].duration) ||
0909 put_user(rinfo[i].unused, &o[i].unused))
0910 return -EFAULT;
0911 }
0912 return 0;
0913 }
0914 #endif
0915
0916 static long
0917 sg_ioctl_common(struct file *filp, Sg_device *sdp, Sg_fd *sfp,
0918 unsigned int cmd_in, void __user *p)
0919 {
0920 int __user *ip = p;
0921 int result, val, read_only;
0922 Sg_request *srp;
0923 unsigned long iflags;
0924
0925 SCSI_LOG_TIMEOUT(3, sg_printk(KERN_INFO, sdp,
0926 "sg_ioctl: cmd=0x%x\n", (int) cmd_in));
0927 read_only = (O_RDWR != (filp->f_flags & O_ACCMODE));
0928
0929 switch (cmd_in) {
0930 case SG_IO:
0931 if (atomic_read(&sdp->detaching))
0932 return -ENODEV;
0933 if (!scsi_block_when_processing_errors(sdp->device))
0934 return -ENXIO;
0935 result = sg_new_write(sfp, filp, p, SZ_SG_IO_HDR,
0936 1, read_only, 1, &srp);
0937 if (result < 0)
0938 return result;
0939 result = wait_event_interruptible(sfp->read_wait,
0940 srp_done(sfp, srp));
0941 write_lock_irq(&sfp->rq_list_lock);
0942 if (srp->done) {
0943 srp->done = 2;
0944 write_unlock_irq(&sfp->rq_list_lock);
0945 result = sg_new_read(sfp, p, SZ_SG_IO_HDR, srp);
0946 return (result < 0) ? result : 0;
0947 }
0948 srp->orphan = 1;
0949 write_unlock_irq(&sfp->rq_list_lock);
0950 return result;
0951 case SG_SET_TIMEOUT:
0952 result = get_user(val, ip);
0953 if (result)
0954 return result;
0955 if (val < 0)
0956 return -EIO;
0957 if (val >= mult_frac((s64)INT_MAX, USER_HZ, HZ))
0958 val = min_t(s64, mult_frac((s64)INT_MAX, USER_HZ, HZ),
0959 INT_MAX);
0960 sfp->timeout_user = val;
0961 sfp->timeout = mult_frac(val, HZ, USER_HZ);
0962
0963 return 0;
0964 case SG_GET_TIMEOUT:
0965
0966 return sfp->timeout_user;
0967 case SG_SET_FORCE_LOW_DMA:
0968
0969
0970
0971
0972
0973 return 0;
0974 case SG_GET_LOW_DMA:
0975 return put_user(0, ip);
0976 case SG_GET_SCSI_ID:
0977 {
0978 sg_scsi_id_t v;
0979
0980 if (atomic_read(&sdp->detaching))
0981 return -ENODEV;
0982 memset(&v, 0, sizeof(v));
0983 v.host_no = sdp->device->host->host_no;
0984 v.channel = sdp->device->channel;
0985 v.scsi_id = sdp->device->id;
0986 v.lun = sdp->device->lun;
0987 v.scsi_type = sdp->device->type;
0988 v.h_cmd_per_lun = sdp->device->host->cmd_per_lun;
0989 v.d_queue_depth = sdp->device->queue_depth;
0990 if (copy_to_user(p, &v, sizeof(sg_scsi_id_t)))
0991 return -EFAULT;
0992 return 0;
0993 }
0994 case SG_SET_FORCE_PACK_ID:
0995 result = get_user(val, ip);
0996 if (result)
0997 return result;
0998 sfp->force_packid = val ? 1 : 0;
0999 return 0;
1000 case SG_GET_PACK_ID:
1001 read_lock_irqsave(&sfp->rq_list_lock, iflags);
1002 list_for_each_entry(srp, &sfp->rq_list, entry) {
1003 if ((1 == srp->done) && (!srp->sg_io_owned)) {
1004 read_unlock_irqrestore(&sfp->rq_list_lock,
1005 iflags);
1006 return put_user(srp->header.pack_id, ip);
1007 }
1008 }
1009 read_unlock_irqrestore(&sfp->rq_list_lock, iflags);
1010 return put_user(-1, ip);
1011 case SG_GET_NUM_WAITING:
1012 read_lock_irqsave(&sfp->rq_list_lock, iflags);
1013 val = 0;
1014 list_for_each_entry(srp, &sfp->rq_list, entry) {
1015 if ((1 == srp->done) && (!srp->sg_io_owned))
1016 ++val;
1017 }
1018 read_unlock_irqrestore(&sfp->rq_list_lock, iflags);
1019 return put_user(val, ip);
1020 case SG_GET_SG_TABLESIZE:
1021 return put_user(sdp->sg_tablesize, ip);
1022 case SG_SET_RESERVED_SIZE:
1023 result = get_user(val, ip);
1024 if (result)
1025 return result;
1026 if (val < 0)
1027 return -EINVAL;
1028 val = min_t(int, val,
1029 max_sectors_bytes(sdp->device->request_queue));
1030 mutex_lock(&sfp->f_mutex);
1031 if (val != sfp->reserve.bufflen) {
1032 if (sfp->mmap_called ||
1033 sfp->res_in_use) {
1034 mutex_unlock(&sfp->f_mutex);
1035 return -EBUSY;
1036 }
1037
1038 sg_remove_scat(sfp, &sfp->reserve);
1039 sg_build_reserve(sfp, val);
1040 }
1041 mutex_unlock(&sfp->f_mutex);
1042 return 0;
1043 case SG_GET_RESERVED_SIZE:
1044 val = min_t(int, sfp->reserve.bufflen,
1045 max_sectors_bytes(sdp->device->request_queue));
1046 return put_user(val, ip);
1047 case SG_SET_COMMAND_Q:
1048 result = get_user(val, ip);
1049 if (result)
1050 return result;
1051 sfp->cmd_q = val ? 1 : 0;
1052 return 0;
1053 case SG_GET_COMMAND_Q:
1054 return put_user((int) sfp->cmd_q, ip);
1055 case SG_SET_KEEP_ORPHAN:
1056 result = get_user(val, ip);
1057 if (result)
1058 return result;
1059 sfp->keep_orphan = val;
1060 return 0;
1061 case SG_GET_KEEP_ORPHAN:
1062 return put_user((int) sfp->keep_orphan, ip);
1063 case SG_NEXT_CMD_LEN:
1064 result = get_user(val, ip);
1065 if (result)
1066 return result;
1067 if (val > SG_MAX_CDB_SIZE)
1068 return -ENOMEM;
1069 sfp->next_cmd_len = (val > 0) ? val : 0;
1070 return 0;
1071 case SG_GET_VERSION_NUM:
1072 return put_user(sg_version_num, ip);
1073 case SG_GET_ACCESS_COUNT:
1074
1075 val = (sdp->device ? 1 : 0);
1076 return put_user(val, ip);
1077 case SG_GET_REQUEST_TABLE:
1078 {
1079 sg_req_info_t *rinfo;
1080
1081 rinfo = kcalloc(SG_MAX_QUEUE, SZ_SG_REQ_INFO,
1082 GFP_KERNEL);
1083 if (!rinfo)
1084 return -ENOMEM;
1085 read_lock_irqsave(&sfp->rq_list_lock, iflags);
1086 sg_fill_request_table(sfp, rinfo);
1087 read_unlock_irqrestore(&sfp->rq_list_lock, iflags);
1088 #ifdef CONFIG_COMPAT
1089 if (in_compat_syscall())
1090 result = put_compat_request_table(p, rinfo);
1091 else
1092 #endif
1093 result = copy_to_user(p, rinfo,
1094 SZ_SG_REQ_INFO * SG_MAX_QUEUE);
1095 result = result ? -EFAULT : 0;
1096 kfree(rinfo);
1097 return result;
1098 }
1099 case SG_EMULATED_HOST:
1100 if (atomic_read(&sdp->detaching))
1101 return -ENODEV;
1102 return put_user(sdp->device->host->hostt->emulated, ip);
1103 case SCSI_IOCTL_SEND_COMMAND:
1104 if (atomic_read(&sdp->detaching))
1105 return -ENODEV;
1106 return scsi_ioctl(sdp->device, filp->f_mode, cmd_in, p);
1107 case SG_SET_DEBUG:
1108 result = get_user(val, ip);
1109 if (result)
1110 return result;
1111 sdp->sgdebug = (char) val;
1112 return 0;
1113 case BLKSECTGET:
1114 return put_user(max_sectors_bytes(sdp->device->request_queue),
1115 ip);
1116 case BLKTRACESETUP:
1117 return blk_trace_setup(sdp->device->request_queue, sdp->name,
1118 MKDEV(SCSI_GENERIC_MAJOR, sdp->index),
1119 NULL, p);
1120 case BLKTRACESTART:
1121 return blk_trace_startstop(sdp->device->request_queue, 1);
1122 case BLKTRACESTOP:
1123 return blk_trace_startstop(sdp->device->request_queue, 0);
1124 case BLKTRACETEARDOWN:
1125 return blk_trace_remove(sdp->device->request_queue);
1126 case SCSI_IOCTL_GET_IDLUN:
1127 case SCSI_IOCTL_GET_BUS_NUMBER:
1128 case SCSI_IOCTL_PROBE_HOST:
1129 case SG_GET_TRANSFORM:
1130 case SG_SCSI_RESET:
1131 if (atomic_read(&sdp->detaching))
1132 return -ENODEV;
1133 break;
1134 default:
1135 if (read_only)
1136 return -EPERM;
1137 break;
1138 }
1139
1140 result = scsi_ioctl_block_when_processing_errors(sdp->device,
1141 cmd_in, filp->f_flags & O_NDELAY);
1142 if (result)
1143 return result;
1144
1145 return -ENOIOCTLCMD;
1146 }
1147
1148 static long
1149 sg_ioctl(struct file *filp, unsigned int cmd_in, unsigned long arg)
1150 {
1151 void __user *p = (void __user *)arg;
1152 Sg_device *sdp;
1153 Sg_fd *sfp;
1154 int ret;
1155
1156 if ((!(sfp = (Sg_fd *) filp->private_data)) || (!(sdp = sfp->parentdp)))
1157 return -ENXIO;
1158
1159 ret = sg_ioctl_common(filp, sdp, sfp, cmd_in, p);
1160 if (ret != -ENOIOCTLCMD)
1161 return ret;
1162 return scsi_ioctl(sdp->device, filp->f_mode, cmd_in, p);
1163 }
1164
1165 static __poll_t
1166 sg_poll(struct file *filp, poll_table * wait)
1167 {
1168 __poll_t res = 0;
1169 Sg_device *sdp;
1170 Sg_fd *sfp;
1171 Sg_request *srp;
1172 int count = 0;
1173 unsigned long iflags;
1174
1175 sfp = filp->private_data;
1176 if (!sfp)
1177 return EPOLLERR;
1178 sdp = sfp->parentdp;
1179 if (!sdp)
1180 return EPOLLERR;
1181 poll_wait(filp, &sfp->read_wait, wait);
1182 read_lock_irqsave(&sfp->rq_list_lock, iflags);
1183 list_for_each_entry(srp, &sfp->rq_list, entry) {
1184
1185 if ((0 == res) && (1 == srp->done) && (!srp->sg_io_owned))
1186 res = EPOLLIN | EPOLLRDNORM;
1187 ++count;
1188 }
1189 read_unlock_irqrestore(&sfp->rq_list_lock, iflags);
1190
1191 if (atomic_read(&sdp->detaching))
1192 res |= EPOLLHUP;
1193 else if (!sfp->cmd_q) {
1194 if (0 == count)
1195 res |= EPOLLOUT | EPOLLWRNORM;
1196 } else if (count < SG_MAX_QUEUE)
1197 res |= EPOLLOUT | EPOLLWRNORM;
1198 SCSI_LOG_TIMEOUT(3, sg_printk(KERN_INFO, sdp,
1199 "sg_poll: res=0x%x\n", (__force u32) res));
1200 return res;
1201 }
1202
1203 static int
1204 sg_fasync(int fd, struct file *filp, int mode)
1205 {
1206 Sg_device *sdp;
1207 Sg_fd *sfp;
1208
1209 if ((!(sfp = (Sg_fd *) filp->private_data)) || (!(sdp = sfp->parentdp)))
1210 return -ENXIO;
1211 SCSI_LOG_TIMEOUT(3, sg_printk(KERN_INFO, sdp,
1212 "sg_fasync: mode=%d\n", mode));
1213
1214 return fasync_helper(fd, filp, mode, &sfp->async_qp);
1215 }
1216
1217 static vm_fault_t
1218 sg_vma_fault(struct vm_fault *vmf)
1219 {
1220 struct vm_area_struct *vma = vmf->vma;
1221 Sg_fd *sfp;
1222 unsigned long offset, len, sa;
1223 Sg_scatter_hold *rsv_schp;
1224 int k, length;
1225
1226 if ((NULL == vma) || (!(sfp = (Sg_fd *) vma->vm_private_data)))
1227 return VM_FAULT_SIGBUS;
1228 rsv_schp = &sfp->reserve;
1229 offset = vmf->pgoff << PAGE_SHIFT;
1230 if (offset >= rsv_schp->bufflen)
1231 return VM_FAULT_SIGBUS;
1232 SCSI_LOG_TIMEOUT(3, sg_printk(KERN_INFO, sfp->parentdp,
1233 "sg_vma_fault: offset=%lu, scatg=%d\n",
1234 offset, rsv_schp->k_use_sg));
1235 sa = vma->vm_start;
1236 length = 1 << (PAGE_SHIFT + rsv_schp->page_order);
1237 for (k = 0; k < rsv_schp->k_use_sg && sa < vma->vm_end; k++) {
1238 len = vma->vm_end - sa;
1239 len = (len < length) ? len : length;
1240 if (offset < len) {
1241 struct page *page = nth_page(rsv_schp->pages[k],
1242 offset >> PAGE_SHIFT);
1243 get_page(page);
1244 vmf->page = page;
1245 return 0;
1246 }
1247 sa += len;
1248 offset -= len;
1249 }
1250
1251 return VM_FAULT_SIGBUS;
1252 }
1253
1254 static const struct vm_operations_struct sg_mmap_vm_ops = {
1255 .fault = sg_vma_fault,
1256 };
1257
1258 static int
1259 sg_mmap(struct file *filp, struct vm_area_struct *vma)
1260 {
1261 Sg_fd *sfp;
1262 unsigned long req_sz, len, sa;
1263 Sg_scatter_hold *rsv_schp;
1264 int k, length;
1265 int ret = 0;
1266
1267 if ((!filp) || (!vma) || (!(sfp = (Sg_fd *) filp->private_data)))
1268 return -ENXIO;
1269 req_sz = vma->vm_end - vma->vm_start;
1270 SCSI_LOG_TIMEOUT(3, sg_printk(KERN_INFO, sfp->parentdp,
1271 "sg_mmap starting, vm_start=%p, len=%d\n",
1272 (void *) vma->vm_start, (int) req_sz));
1273 if (vma->vm_pgoff)
1274 return -EINVAL;
1275 rsv_schp = &sfp->reserve;
1276 mutex_lock(&sfp->f_mutex);
1277 if (req_sz > rsv_schp->bufflen) {
1278 ret = -ENOMEM;
1279 goto out;
1280 }
1281
1282 sa = vma->vm_start;
1283 length = 1 << (PAGE_SHIFT + rsv_schp->page_order);
1284 for (k = 0; k < rsv_schp->k_use_sg && sa < vma->vm_end; k++) {
1285 len = vma->vm_end - sa;
1286 len = (len < length) ? len : length;
1287 sa += len;
1288 }
1289
1290 sfp->mmap_called = 1;
1291 vma->vm_flags |= VM_IO | VM_DONTEXPAND | VM_DONTDUMP;
1292 vma->vm_private_data = sfp;
1293 vma->vm_ops = &sg_mmap_vm_ops;
1294 out:
1295 mutex_unlock(&sfp->f_mutex);
1296 return ret;
1297 }
1298
1299 static void
1300 sg_rq_end_io_usercontext(struct work_struct *work)
1301 {
1302 struct sg_request *srp = container_of(work, struct sg_request, ew.work);
1303 struct sg_fd *sfp = srp->parentfp;
1304
1305 sg_finish_rem_req(srp);
1306 sg_remove_request(sfp, srp);
1307 kref_put(&sfp->f_ref, sg_remove_sfp);
1308 }
1309
1310
1311
1312
1313
1314 static void
1315 sg_rq_end_io(struct request *rq, blk_status_t status)
1316 {
1317 struct scsi_cmnd *scmd = blk_mq_rq_to_pdu(rq);
1318 struct sg_request *srp = rq->end_io_data;
1319 Sg_device *sdp;
1320 Sg_fd *sfp;
1321 unsigned long iflags;
1322 unsigned int ms;
1323 char *sense;
1324 int result, resid, done = 1;
1325
1326 if (WARN_ON(srp->done != 0))
1327 return;
1328
1329 sfp = srp->parentfp;
1330 if (WARN_ON(sfp == NULL))
1331 return;
1332
1333 sdp = sfp->parentdp;
1334 if (unlikely(atomic_read(&sdp->detaching)))
1335 pr_info("%s: device detaching\n", __func__);
1336
1337 sense = scmd->sense_buffer;
1338 result = scmd->result;
1339 resid = scmd->resid_len;
1340
1341 SCSI_LOG_TIMEOUT(4, sg_printk(KERN_INFO, sdp,
1342 "sg_cmd_done: pack_id=%d, res=0x%x\n",
1343 srp->header.pack_id, result));
1344 srp->header.resid = resid;
1345 ms = jiffies_to_msecs(jiffies);
1346 srp->header.duration = (ms > srp->header.duration) ?
1347 (ms - srp->header.duration) : 0;
1348 if (0 != result) {
1349 struct scsi_sense_hdr sshdr;
1350
1351 srp->header.status = 0xff & result;
1352 srp->header.masked_status = status_byte(result);
1353 srp->header.msg_status = COMMAND_COMPLETE;
1354 srp->header.host_status = host_byte(result);
1355 srp->header.driver_status = driver_byte(result);
1356 if ((sdp->sgdebug > 0) &&
1357 ((CHECK_CONDITION == srp->header.masked_status) ||
1358 (COMMAND_TERMINATED == srp->header.masked_status)))
1359 __scsi_print_sense(sdp->device, __func__, sense,
1360 SCSI_SENSE_BUFFERSIZE);
1361
1362
1363 if (driver_byte(result) != 0
1364 && scsi_normalize_sense(sense, SCSI_SENSE_BUFFERSIZE, &sshdr)
1365 && !scsi_sense_is_deferred(&sshdr)
1366 && sshdr.sense_key == UNIT_ATTENTION
1367 && sdp->device->removable) {
1368
1369
1370 sdp->device->changed = 1;
1371 }
1372 }
1373
1374 if (scmd->sense_len)
1375 memcpy(srp->sense_b, scmd->sense_buffer, SCSI_SENSE_BUFFERSIZE);
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385 srp->rq = NULL;
1386 blk_mq_free_request(rq);
1387
1388 write_lock_irqsave(&sfp->rq_list_lock, iflags);
1389 if (unlikely(srp->orphan)) {
1390 if (sfp->keep_orphan)
1391 srp->sg_io_owned = 0;
1392 else
1393 done = 0;
1394 }
1395 srp->done = done;
1396 write_unlock_irqrestore(&sfp->rq_list_lock, iflags);
1397
1398 if (likely(done)) {
1399
1400
1401
1402 wake_up_interruptible(&sfp->read_wait);
1403 kill_fasync(&sfp->async_qp, SIGPOLL, POLL_IN);
1404 kref_put(&sfp->f_ref, sg_remove_sfp);
1405 } else {
1406 INIT_WORK(&srp->ew.work, sg_rq_end_io_usercontext);
1407 schedule_work(&srp->ew.work);
1408 }
1409 }
1410
1411 static const struct file_operations sg_fops = {
1412 .owner = THIS_MODULE,
1413 .read = sg_read,
1414 .write = sg_write,
1415 .poll = sg_poll,
1416 .unlocked_ioctl = sg_ioctl,
1417 .compat_ioctl = compat_ptr_ioctl,
1418 .open = sg_open,
1419 .mmap = sg_mmap,
1420 .release = sg_release,
1421 .fasync = sg_fasync,
1422 .llseek = no_llseek,
1423 };
1424
1425 static struct class *sg_sysfs_class;
1426
1427 static int sg_sysfs_valid = 0;
1428
1429 static Sg_device *
1430 sg_alloc(struct scsi_device *scsidp)
1431 {
1432 struct request_queue *q = scsidp->request_queue;
1433 Sg_device *sdp;
1434 unsigned long iflags;
1435 int error;
1436 u32 k;
1437
1438 sdp = kzalloc(sizeof(Sg_device), GFP_KERNEL);
1439 if (!sdp) {
1440 sdev_printk(KERN_WARNING, scsidp, "%s: kmalloc Sg_device "
1441 "failure\n", __func__);
1442 return ERR_PTR(-ENOMEM);
1443 }
1444
1445 idr_preload(GFP_KERNEL);
1446 write_lock_irqsave(&sg_index_lock, iflags);
1447
1448 error = idr_alloc(&sg_index_idr, sdp, 0, SG_MAX_DEVS, GFP_NOWAIT);
1449 if (error < 0) {
1450 if (error == -ENOSPC) {
1451 sdev_printk(KERN_WARNING, scsidp,
1452 "Unable to attach sg device type=%d, minor number exceeds %d\n",
1453 scsidp->type, SG_MAX_DEVS - 1);
1454 error = -ENODEV;
1455 } else {
1456 sdev_printk(KERN_WARNING, scsidp, "%s: idr "
1457 "allocation Sg_device failure: %d\n",
1458 __func__, error);
1459 }
1460 goto out_unlock;
1461 }
1462 k = error;
1463
1464 SCSI_LOG_TIMEOUT(3, sdev_printk(KERN_INFO, scsidp,
1465 "sg_alloc: dev=%d \n", k));
1466 sprintf(sdp->name, "sg%d", k);
1467 sdp->device = scsidp;
1468 mutex_init(&sdp->open_rel_lock);
1469 INIT_LIST_HEAD(&sdp->sfds);
1470 init_waitqueue_head(&sdp->open_wait);
1471 atomic_set(&sdp->detaching, 0);
1472 rwlock_init(&sdp->sfd_lock);
1473 sdp->sg_tablesize = queue_max_segments(q);
1474 sdp->index = k;
1475 kref_init(&sdp->d_ref);
1476 error = 0;
1477
1478 out_unlock:
1479 write_unlock_irqrestore(&sg_index_lock, iflags);
1480 idr_preload_end();
1481
1482 if (error) {
1483 kfree(sdp);
1484 return ERR_PTR(error);
1485 }
1486 return sdp;
1487 }
1488
1489 static int
1490 sg_add_device(struct device *cl_dev, struct class_interface *cl_intf)
1491 {
1492 struct scsi_device *scsidp = to_scsi_device(cl_dev->parent);
1493 Sg_device *sdp = NULL;
1494 struct cdev * cdev = NULL;
1495 int error;
1496 unsigned long iflags;
1497
1498 error = -ENOMEM;
1499 cdev = cdev_alloc();
1500 if (!cdev) {
1501 pr_warn("%s: cdev_alloc failed\n", __func__);
1502 goto out;
1503 }
1504 cdev->owner = THIS_MODULE;
1505 cdev->ops = &sg_fops;
1506
1507 sdp = sg_alloc(scsidp);
1508 if (IS_ERR(sdp)) {
1509 pr_warn("%s: sg_alloc failed\n", __func__);
1510 error = PTR_ERR(sdp);
1511 goto out;
1512 }
1513
1514 error = cdev_add(cdev, MKDEV(SCSI_GENERIC_MAJOR, sdp->index), 1);
1515 if (error)
1516 goto cdev_add_err;
1517
1518 sdp->cdev = cdev;
1519 if (sg_sysfs_valid) {
1520 struct device *sg_class_member;
1521
1522 sg_class_member = device_create(sg_sysfs_class, cl_dev->parent,
1523 MKDEV(SCSI_GENERIC_MAJOR,
1524 sdp->index),
1525 sdp, "%s", sdp->name);
1526 if (IS_ERR(sg_class_member)) {
1527 pr_err("%s: device_create failed\n", __func__);
1528 error = PTR_ERR(sg_class_member);
1529 goto cdev_add_err;
1530 }
1531 error = sysfs_create_link(&scsidp->sdev_gendev.kobj,
1532 &sg_class_member->kobj, "generic");
1533 if (error)
1534 pr_err("%s: unable to make symlink 'generic' back "
1535 "to sg%d\n", __func__, sdp->index);
1536 } else
1537 pr_warn("%s: sg_sys Invalid\n", __func__);
1538
1539 sdev_printk(KERN_NOTICE, scsidp, "Attached scsi generic sg%d "
1540 "type %d\n", sdp->index, scsidp->type);
1541
1542 dev_set_drvdata(cl_dev, sdp);
1543
1544 return 0;
1545
1546 cdev_add_err:
1547 write_lock_irqsave(&sg_index_lock, iflags);
1548 idr_remove(&sg_index_idr, sdp->index);
1549 write_unlock_irqrestore(&sg_index_lock, iflags);
1550 kfree(sdp);
1551
1552 out:
1553 if (cdev)
1554 cdev_del(cdev);
1555 return error;
1556 }
1557
1558 static void
1559 sg_device_destroy(struct kref *kref)
1560 {
1561 struct sg_device *sdp = container_of(kref, struct sg_device, d_ref);
1562 unsigned long flags;
1563
1564
1565
1566
1567
1568
1569 write_lock_irqsave(&sg_index_lock, flags);
1570 idr_remove(&sg_index_idr, sdp->index);
1571 write_unlock_irqrestore(&sg_index_lock, flags);
1572
1573 SCSI_LOG_TIMEOUT(3,
1574 sg_printk(KERN_INFO, sdp, "sg_device_destroy\n"));
1575
1576 kfree(sdp);
1577 }
1578
1579 static void
1580 sg_remove_device(struct device *cl_dev, struct class_interface *cl_intf)
1581 {
1582 struct scsi_device *scsidp = to_scsi_device(cl_dev->parent);
1583 Sg_device *sdp = dev_get_drvdata(cl_dev);
1584 unsigned long iflags;
1585 Sg_fd *sfp;
1586 int val;
1587
1588 if (!sdp)
1589 return;
1590
1591 val = atomic_inc_return(&sdp->detaching);
1592 if (val > 1)
1593 return;
1594
1595 SCSI_LOG_TIMEOUT(3, sg_printk(KERN_INFO, sdp,
1596 "%s\n", __func__));
1597
1598 read_lock_irqsave(&sdp->sfd_lock, iflags);
1599 list_for_each_entry(sfp, &sdp->sfds, sfd_siblings) {
1600 wake_up_interruptible_all(&sfp->read_wait);
1601 kill_fasync(&sfp->async_qp, SIGPOLL, POLL_HUP);
1602 }
1603 wake_up_interruptible_all(&sdp->open_wait);
1604 read_unlock_irqrestore(&sdp->sfd_lock, iflags);
1605
1606 sysfs_remove_link(&scsidp->sdev_gendev.kobj, "generic");
1607 device_destroy(sg_sysfs_class, MKDEV(SCSI_GENERIC_MAJOR, sdp->index));
1608 cdev_del(sdp->cdev);
1609 sdp->cdev = NULL;
1610
1611 kref_put(&sdp->d_ref, sg_device_destroy);
1612 }
1613
1614 module_param_named(scatter_elem_sz, scatter_elem_sz, int, S_IRUGO | S_IWUSR);
1615 module_param_named(def_reserved_size, def_reserved_size, int,
1616 S_IRUGO | S_IWUSR);
1617 module_param_named(allow_dio, sg_allow_dio, int, S_IRUGO | S_IWUSR);
1618
1619 MODULE_AUTHOR("Douglas Gilbert");
1620 MODULE_DESCRIPTION("SCSI generic (sg) driver");
1621 MODULE_LICENSE("GPL");
1622 MODULE_VERSION(SG_VERSION_STR);
1623 MODULE_ALIAS_CHARDEV_MAJOR(SCSI_GENERIC_MAJOR);
1624
1625 MODULE_PARM_DESC(scatter_elem_sz, "scatter gather element "
1626 "size (default: max(SG_SCATTER_SZ, PAGE_SIZE))");
1627 MODULE_PARM_DESC(def_reserved_size, "size of buffer reserved for each fd");
1628 MODULE_PARM_DESC(allow_dio, "allow direct I/O (default: 0 (disallow))");
1629
1630 #ifdef CONFIG_SYSCTL
1631 #include <linux/sysctl.h>
1632
1633 static struct ctl_table sg_sysctls[] = {
1634 {
1635 .procname = "sg-big-buff",
1636 .data = &sg_big_buff,
1637 .maxlen = sizeof(int),
1638 .mode = 0444,
1639 .proc_handler = proc_dointvec,
1640 },
1641 {}
1642 };
1643
1644 static struct ctl_table_header *hdr;
1645 static void register_sg_sysctls(void)
1646 {
1647 if (!hdr)
1648 hdr = register_sysctl("kernel", sg_sysctls);
1649 }
1650
1651 static void unregister_sg_sysctls(void)
1652 {
1653 if (hdr)
1654 unregister_sysctl_table(hdr);
1655 }
1656 #else
1657 #define register_sg_sysctls() do { } while (0)
1658 #define unregister_sg_sysctls() do { } while (0)
1659 #endif
1660
1661 static int __init
1662 init_sg(void)
1663 {
1664 int rc;
1665
1666 if (scatter_elem_sz < PAGE_SIZE) {
1667 scatter_elem_sz = PAGE_SIZE;
1668 scatter_elem_sz_prev = scatter_elem_sz;
1669 }
1670 if (def_reserved_size >= 0)
1671 sg_big_buff = def_reserved_size;
1672 else
1673 def_reserved_size = sg_big_buff;
1674
1675 rc = register_chrdev_region(MKDEV(SCSI_GENERIC_MAJOR, 0),
1676 SG_MAX_DEVS, "sg");
1677 if (rc)
1678 return rc;
1679 sg_sysfs_class = class_create(THIS_MODULE, "scsi_generic");
1680 if ( IS_ERR(sg_sysfs_class) ) {
1681 rc = PTR_ERR(sg_sysfs_class);
1682 goto err_out;
1683 }
1684 sg_sysfs_valid = 1;
1685 rc = scsi_register_interface(&sg_interface);
1686 if (0 == rc) {
1687 #ifdef CONFIG_SCSI_PROC_FS
1688 sg_proc_init();
1689 #endif
1690 return 0;
1691 }
1692 class_destroy(sg_sysfs_class);
1693 register_sg_sysctls();
1694 err_out:
1695 unregister_chrdev_region(MKDEV(SCSI_GENERIC_MAJOR, 0), SG_MAX_DEVS);
1696 return rc;
1697 }
1698
1699 static void __exit
1700 exit_sg(void)
1701 {
1702 unregister_sg_sysctls();
1703 #ifdef CONFIG_SCSI_PROC_FS
1704 remove_proc_subtree("scsi/sg", NULL);
1705 #endif
1706 scsi_unregister_interface(&sg_interface);
1707 class_destroy(sg_sysfs_class);
1708 sg_sysfs_valid = 0;
1709 unregister_chrdev_region(MKDEV(SCSI_GENERIC_MAJOR, 0),
1710 SG_MAX_DEVS);
1711 idr_destroy(&sg_index_idr);
1712 }
1713
1714 static int
1715 sg_start_req(Sg_request *srp, unsigned char *cmd)
1716 {
1717 int res;
1718 struct request *rq;
1719 Sg_fd *sfp = srp->parentfp;
1720 sg_io_hdr_t *hp = &srp->header;
1721 int dxfer_len = (int) hp->dxfer_len;
1722 int dxfer_dir = hp->dxfer_direction;
1723 unsigned int iov_count = hp->iovec_count;
1724 Sg_scatter_hold *req_schp = &srp->data;
1725 Sg_scatter_hold *rsv_schp = &sfp->reserve;
1726 struct request_queue *q = sfp->parentdp->device->request_queue;
1727 struct rq_map_data *md, map_data;
1728 int rw = hp->dxfer_direction == SG_DXFER_TO_DEV ? WRITE : READ;
1729 struct scsi_cmnd *scmd;
1730
1731 SCSI_LOG_TIMEOUT(4, sg_printk(KERN_INFO, sfp->parentdp,
1732 "sg_start_req: dxfer_len=%d\n",
1733 dxfer_len));
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746 rq = scsi_alloc_request(q, hp->dxfer_direction == SG_DXFER_TO_DEV ?
1747 REQ_OP_DRV_OUT : REQ_OP_DRV_IN, 0);
1748 if (IS_ERR(rq))
1749 return PTR_ERR(rq);
1750 scmd = blk_mq_rq_to_pdu(rq);
1751
1752 if (hp->cmd_len > sizeof(scmd->cmnd)) {
1753 blk_mq_free_request(rq);
1754 return -EINVAL;
1755 }
1756
1757 memcpy(scmd->cmnd, cmd, hp->cmd_len);
1758 scmd->cmd_len = hp->cmd_len;
1759
1760 srp->rq = rq;
1761 rq->end_io_data = srp;
1762 scmd->allowed = SG_DEFAULT_RETRIES;
1763
1764 if ((dxfer_len <= 0) || (dxfer_dir == SG_DXFER_NONE))
1765 return 0;
1766
1767 if (sg_allow_dio && hp->flags & SG_FLAG_DIRECT_IO &&
1768 dxfer_dir != SG_DXFER_UNKNOWN && !iov_count &&
1769 blk_rq_aligned(q, (unsigned long)hp->dxferp, dxfer_len))
1770 md = NULL;
1771 else
1772 md = &map_data;
1773
1774 if (md) {
1775 mutex_lock(&sfp->f_mutex);
1776 if (dxfer_len <= rsv_schp->bufflen &&
1777 !sfp->res_in_use) {
1778 sfp->res_in_use = 1;
1779 sg_link_reserve(sfp, srp, dxfer_len);
1780 } else if (hp->flags & SG_FLAG_MMAP_IO) {
1781 res = -EBUSY;
1782 if (dxfer_len > rsv_schp->bufflen)
1783 res = -ENOMEM;
1784 mutex_unlock(&sfp->f_mutex);
1785 return res;
1786 } else {
1787 res = sg_build_indirect(req_schp, sfp, dxfer_len);
1788 if (res) {
1789 mutex_unlock(&sfp->f_mutex);
1790 return res;
1791 }
1792 }
1793 mutex_unlock(&sfp->f_mutex);
1794
1795 md->pages = req_schp->pages;
1796 md->page_order = req_schp->page_order;
1797 md->nr_entries = req_schp->k_use_sg;
1798 md->offset = 0;
1799 md->null_mapped = hp->dxferp ? 0 : 1;
1800 if (dxfer_dir == SG_DXFER_TO_FROM_DEV)
1801 md->from_user = 1;
1802 else
1803 md->from_user = 0;
1804 }
1805
1806 if (iov_count) {
1807 struct iovec *iov = NULL;
1808 struct iov_iter i;
1809
1810 res = import_iovec(rw, hp->dxferp, iov_count, 0, &iov, &i);
1811 if (res < 0)
1812 return res;
1813
1814 iov_iter_truncate(&i, hp->dxfer_len);
1815 if (!iov_iter_count(&i)) {
1816 kfree(iov);
1817 return -EINVAL;
1818 }
1819
1820 res = blk_rq_map_user_iov(q, rq, md, &i, GFP_ATOMIC);
1821 kfree(iov);
1822 } else
1823 res = blk_rq_map_user(q, rq, md, hp->dxferp,
1824 hp->dxfer_len, GFP_ATOMIC);
1825
1826 if (!res) {
1827 srp->bio = rq->bio;
1828
1829 if (!md) {
1830 req_schp->dio_in_use = 1;
1831 hp->info |= SG_INFO_DIRECT_IO;
1832 }
1833 }
1834 return res;
1835 }
1836
1837 static int
1838 sg_finish_rem_req(Sg_request *srp)
1839 {
1840 int ret = 0;
1841
1842 Sg_fd *sfp = srp->parentfp;
1843 Sg_scatter_hold *req_schp = &srp->data;
1844
1845 SCSI_LOG_TIMEOUT(4, sg_printk(KERN_INFO, sfp->parentdp,
1846 "sg_finish_rem_req: res_used=%d\n",
1847 (int) srp->res_used));
1848 if (srp->bio)
1849 ret = blk_rq_unmap_user(srp->bio);
1850
1851 if (srp->rq)
1852 blk_mq_free_request(srp->rq);
1853
1854 if (srp->res_used)
1855 sg_unlink_reserve(sfp, srp);
1856 else
1857 sg_remove_scat(sfp, req_schp);
1858
1859 return ret;
1860 }
1861
1862 static int
1863 sg_build_sgat(Sg_scatter_hold * schp, const Sg_fd * sfp, int tablesize)
1864 {
1865 int sg_bufflen = tablesize * sizeof(struct page *);
1866 gfp_t gfp_flags = GFP_ATOMIC | __GFP_NOWARN;
1867
1868 schp->pages = kzalloc(sg_bufflen, gfp_flags);
1869 if (!schp->pages)
1870 return -ENOMEM;
1871 schp->sglist_len = sg_bufflen;
1872 return tablesize;
1873 }
1874
1875 static int
1876 sg_build_indirect(Sg_scatter_hold * schp, Sg_fd * sfp, int buff_size)
1877 {
1878 int ret_sz = 0, i, k, rem_sz, num, mx_sc_elems;
1879 int sg_tablesize = sfp->parentdp->sg_tablesize;
1880 int blk_size = buff_size, order;
1881 gfp_t gfp_mask = GFP_ATOMIC | __GFP_COMP | __GFP_NOWARN | __GFP_ZERO;
1882
1883 if (blk_size < 0)
1884 return -EFAULT;
1885 if (0 == blk_size)
1886 ++blk_size;
1887
1888 blk_size = ALIGN(blk_size, SG_SECTOR_SZ);
1889 SCSI_LOG_TIMEOUT(4, sg_printk(KERN_INFO, sfp->parentdp,
1890 "sg_build_indirect: buff_size=%d, blk_size=%d\n",
1891 buff_size, blk_size));
1892
1893
1894 mx_sc_elems = sg_build_sgat(schp, sfp, sg_tablesize);
1895 if (mx_sc_elems < 0)
1896 return mx_sc_elems;
1897
1898 num = scatter_elem_sz;
1899 if (unlikely(num != scatter_elem_sz_prev)) {
1900 if (num < PAGE_SIZE) {
1901 scatter_elem_sz = PAGE_SIZE;
1902 scatter_elem_sz_prev = PAGE_SIZE;
1903 } else
1904 scatter_elem_sz_prev = num;
1905 }
1906
1907 order = get_order(num);
1908 retry:
1909 ret_sz = 1 << (PAGE_SHIFT + order);
1910
1911 for (k = 0, rem_sz = blk_size; rem_sz > 0 && k < mx_sc_elems;
1912 k++, rem_sz -= ret_sz) {
1913
1914 num = (rem_sz > scatter_elem_sz_prev) ?
1915 scatter_elem_sz_prev : rem_sz;
1916
1917 schp->pages[k] = alloc_pages(gfp_mask, order);
1918 if (!schp->pages[k])
1919 goto out;
1920
1921 if (num == scatter_elem_sz_prev) {
1922 if (unlikely(ret_sz > scatter_elem_sz_prev)) {
1923 scatter_elem_sz = ret_sz;
1924 scatter_elem_sz_prev = ret_sz;
1925 }
1926 }
1927
1928 SCSI_LOG_TIMEOUT(5, sg_printk(KERN_INFO, sfp->parentdp,
1929 "sg_build_indirect: k=%d, num=%d, ret_sz=%d\n",
1930 k, num, ret_sz));
1931 }
1932
1933 schp->page_order = order;
1934 schp->k_use_sg = k;
1935 SCSI_LOG_TIMEOUT(5, sg_printk(KERN_INFO, sfp->parentdp,
1936 "sg_build_indirect: k_use_sg=%d, rem_sz=%d\n",
1937 k, rem_sz));
1938
1939 schp->bufflen = blk_size;
1940 if (rem_sz > 0)
1941 return -ENOMEM;
1942 return 0;
1943 out:
1944 for (i = 0; i < k; i++)
1945 __free_pages(schp->pages[i], order);
1946
1947 if (--order >= 0)
1948 goto retry;
1949
1950 return -ENOMEM;
1951 }
1952
1953 static void
1954 sg_remove_scat(Sg_fd * sfp, Sg_scatter_hold * schp)
1955 {
1956 SCSI_LOG_TIMEOUT(4, sg_printk(KERN_INFO, sfp->parentdp,
1957 "sg_remove_scat: k_use_sg=%d\n", schp->k_use_sg));
1958 if (schp->pages && schp->sglist_len > 0) {
1959 if (!schp->dio_in_use) {
1960 int k;
1961
1962 for (k = 0; k < schp->k_use_sg && schp->pages[k]; k++) {
1963 SCSI_LOG_TIMEOUT(5,
1964 sg_printk(KERN_INFO, sfp->parentdp,
1965 "sg_remove_scat: k=%d, pg=0x%p\n",
1966 k, schp->pages[k]));
1967 __free_pages(schp->pages[k], schp->page_order);
1968 }
1969
1970 kfree(schp->pages);
1971 }
1972 }
1973 memset(schp, 0, sizeof (*schp));
1974 }
1975
1976 static int
1977 sg_read_oxfer(Sg_request * srp, char __user *outp, int num_read_xfer)
1978 {
1979 Sg_scatter_hold *schp = &srp->data;
1980 int k, num;
1981
1982 SCSI_LOG_TIMEOUT(4, sg_printk(KERN_INFO, srp->parentfp->parentdp,
1983 "sg_read_oxfer: num_read_xfer=%d\n",
1984 num_read_xfer));
1985 if ((!outp) || (num_read_xfer <= 0))
1986 return 0;
1987
1988 num = 1 << (PAGE_SHIFT + schp->page_order);
1989 for (k = 0; k < schp->k_use_sg && schp->pages[k]; k++) {
1990 if (num > num_read_xfer) {
1991 if (copy_to_user(outp, page_address(schp->pages[k]),
1992 num_read_xfer))
1993 return -EFAULT;
1994 break;
1995 } else {
1996 if (copy_to_user(outp, page_address(schp->pages[k]),
1997 num))
1998 return -EFAULT;
1999 num_read_xfer -= num;
2000 if (num_read_xfer <= 0)
2001 break;
2002 outp += num;
2003 }
2004 }
2005
2006 return 0;
2007 }
2008
2009 static void
2010 sg_build_reserve(Sg_fd * sfp, int req_size)
2011 {
2012 Sg_scatter_hold *schp = &sfp->reserve;
2013
2014 SCSI_LOG_TIMEOUT(4, sg_printk(KERN_INFO, sfp->parentdp,
2015 "sg_build_reserve: req_size=%d\n", req_size));
2016 do {
2017 if (req_size < PAGE_SIZE)
2018 req_size = PAGE_SIZE;
2019 if (0 == sg_build_indirect(schp, sfp, req_size))
2020 return;
2021 else
2022 sg_remove_scat(sfp, schp);
2023 req_size >>= 1;
2024 } while (req_size > (PAGE_SIZE / 2));
2025 }
2026
2027 static void
2028 sg_link_reserve(Sg_fd * sfp, Sg_request * srp, int size)
2029 {
2030 Sg_scatter_hold *req_schp = &srp->data;
2031 Sg_scatter_hold *rsv_schp = &sfp->reserve;
2032 int k, num, rem;
2033
2034 srp->res_used = 1;
2035 SCSI_LOG_TIMEOUT(4, sg_printk(KERN_INFO, sfp->parentdp,
2036 "sg_link_reserve: size=%d\n", size));
2037 rem = size;
2038
2039 num = 1 << (PAGE_SHIFT + rsv_schp->page_order);
2040 for (k = 0; k < rsv_schp->k_use_sg; k++) {
2041 if (rem <= num) {
2042 req_schp->k_use_sg = k + 1;
2043 req_schp->sglist_len = rsv_schp->sglist_len;
2044 req_schp->pages = rsv_schp->pages;
2045
2046 req_schp->bufflen = size;
2047 req_schp->page_order = rsv_schp->page_order;
2048 break;
2049 } else
2050 rem -= num;
2051 }
2052
2053 if (k >= rsv_schp->k_use_sg)
2054 SCSI_LOG_TIMEOUT(1, sg_printk(KERN_INFO, sfp->parentdp,
2055 "sg_link_reserve: BAD size\n"));
2056 }
2057
2058 static void
2059 sg_unlink_reserve(Sg_fd * sfp, Sg_request * srp)
2060 {
2061 Sg_scatter_hold *req_schp = &srp->data;
2062
2063 SCSI_LOG_TIMEOUT(4, sg_printk(KERN_INFO, srp->parentfp->parentdp,
2064 "sg_unlink_reserve: req->k_use_sg=%d\n",
2065 (int) req_schp->k_use_sg));
2066 req_schp->k_use_sg = 0;
2067 req_schp->bufflen = 0;
2068 req_schp->pages = NULL;
2069 req_schp->page_order = 0;
2070 req_schp->sglist_len = 0;
2071 srp->res_used = 0;
2072
2073 sfp->res_in_use = 0;
2074 }
2075
2076 static Sg_request *
2077 sg_get_rq_mark(Sg_fd * sfp, int pack_id, bool *busy)
2078 {
2079 Sg_request *resp;
2080 unsigned long iflags;
2081
2082 *busy = false;
2083 write_lock_irqsave(&sfp->rq_list_lock, iflags);
2084 list_for_each_entry(resp, &sfp->rq_list, entry) {
2085
2086 if ((!resp->sg_io_owned) &&
2087 ((-1 == pack_id) || (resp->header.pack_id == pack_id))) {
2088 switch (resp->done) {
2089 case 0:
2090 *busy = true;
2091 break;
2092 case 1:
2093 resp->done = 2;
2094 write_unlock_irqrestore(&sfp->rq_list_lock, iflags);
2095 return resp;
2096 case 2:
2097 break;
2098 }
2099 }
2100 }
2101 write_unlock_irqrestore(&sfp->rq_list_lock, iflags);
2102 return NULL;
2103 }
2104
2105
2106 static Sg_request *
2107 sg_add_request(Sg_fd * sfp)
2108 {
2109 int k;
2110 unsigned long iflags;
2111 Sg_request *rp = sfp->req_arr;
2112
2113 write_lock_irqsave(&sfp->rq_list_lock, iflags);
2114 if (!list_empty(&sfp->rq_list)) {
2115 if (!sfp->cmd_q)
2116 goto out_unlock;
2117
2118 for (k = 0; k < SG_MAX_QUEUE; ++k, ++rp) {
2119 if (!rp->parentfp)
2120 break;
2121 }
2122 if (k >= SG_MAX_QUEUE)
2123 goto out_unlock;
2124 }
2125 memset(rp, 0, sizeof (Sg_request));
2126 rp->parentfp = sfp;
2127 rp->header.duration = jiffies_to_msecs(jiffies);
2128 list_add_tail(&rp->entry, &sfp->rq_list);
2129 write_unlock_irqrestore(&sfp->rq_list_lock, iflags);
2130 return rp;
2131 out_unlock:
2132 write_unlock_irqrestore(&sfp->rq_list_lock, iflags);
2133 return NULL;
2134 }
2135
2136
2137 static int
2138 sg_remove_request(Sg_fd * sfp, Sg_request * srp)
2139 {
2140 unsigned long iflags;
2141 int res = 0;
2142
2143 if (!sfp || !srp || list_empty(&sfp->rq_list))
2144 return res;
2145 write_lock_irqsave(&sfp->rq_list_lock, iflags);
2146 if (!list_empty(&srp->entry)) {
2147 list_del(&srp->entry);
2148 srp->parentfp = NULL;
2149 res = 1;
2150 }
2151 write_unlock_irqrestore(&sfp->rq_list_lock, iflags);
2152
2153
2154
2155
2156
2157
2158 if (unlikely(atomic_read(&sfp->parentdp->detaching)))
2159 wake_up_interruptible_all(&sfp->read_wait);
2160
2161 return res;
2162 }
2163
2164 static Sg_fd *
2165 sg_add_sfp(Sg_device * sdp)
2166 {
2167 Sg_fd *sfp;
2168 unsigned long iflags;
2169 int bufflen;
2170
2171 sfp = kzalloc(sizeof(*sfp), GFP_ATOMIC | __GFP_NOWARN);
2172 if (!sfp)
2173 return ERR_PTR(-ENOMEM);
2174
2175 init_waitqueue_head(&sfp->read_wait);
2176 rwlock_init(&sfp->rq_list_lock);
2177 INIT_LIST_HEAD(&sfp->rq_list);
2178 kref_init(&sfp->f_ref);
2179 mutex_init(&sfp->f_mutex);
2180 sfp->timeout = SG_DEFAULT_TIMEOUT;
2181 sfp->timeout_user = SG_DEFAULT_TIMEOUT_USER;
2182 sfp->force_packid = SG_DEF_FORCE_PACK_ID;
2183 sfp->cmd_q = SG_DEF_COMMAND_Q;
2184 sfp->keep_orphan = SG_DEF_KEEP_ORPHAN;
2185 sfp->parentdp = sdp;
2186 write_lock_irqsave(&sdp->sfd_lock, iflags);
2187 if (atomic_read(&sdp->detaching)) {
2188 write_unlock_irqrestore(&sdp->sfd_lock, iflags);
2189 kfree(sfp);
2190 return ERR_PTR(-ENODEV);
2191 }
2192 list_add_tail(&sfp->sfd_siblings, &sdp->sfds);
2193 write_unlock_irqrestore(&sdp->sfd_lock, iflags);
2194 SCSI_LOG_TIMEOUT(3, sg_printk(KERN_INFO, sdp,
2195 "sg_add_sfp: sfp=0x%p\n", sfp));
2196 if (unlikely(sg_big_buff != def_reserved_size))
2197 sg_big_buff = def_reserved_size;
2198
2199 bufflen = min_t(int, sg_big_buff,
2200 max_sectors_bytes(sdp->device->request_queue));
2201 sg_build_reserve(sfp, bufflen);
2202 SCSI_LOG_TIMEOUT(3, sg_printk(KERN_INFO, sdp,
2203 "sg_add_sfp: bufflen=%d, k_use_sg=%d\n",
2204 sfp->reserve.bufflen,
2205 sfp->reserve.k_use_sg));
2206
2207 kref_get(&sdp->d_ref);
2208 __module_get(THIS_MODULE);
2209 return sfp;
2210 }
2211
2212 static void
2213 sg_remove_sfp_usercontext(struct work_struct *work)
2214 {
2215 struct sg_fd *sfp = container_of(work, struct sg_fd, ew.work);
2216 struct sg_device *sdp = sfp->parentdp;
2217 Sg_request *srp;
2218 unsigned long iflags;
2219
2220
2221 write_lock_irqsave(&sfp->rq_list_lock, iflags);
2222 while (!list_empty(&sfp->rq_list)) {
2223 srp = list_first_entry(&sfp->rq_list, Sg_request, entry);
2224 sg_finish_rem_req(srp);
2225 list_del(&srp->entry);
2226 srp->parentfp = NULL;
2227 }
2228 write_unlock_irqrestore(&sfp->rq_list_lock, iflags);
2229
2230 if (sfp->reserve.bufflen > 0) {
2231 SCSI_LOG_TIMEOUT(6, sg_printk(KERN_INFO, sdp,
2232 "sg_remove_sfp: bufflen=%d, k_use_sg=%d\n",
2233 (int) sfp->reserve.bufflen,
2234 (int) sfp->reserve.k_use_sg));
2235 sg_remove_scat(sfp, &sfp->reserve);
2236 }
2237
2238 SCSI_LOG_TIMEOUT(6, sg_printk(KERN_INFO, sdp,
2239 "sg_remove_sfp: sfp=0x%p\n", sfp));
2240 kfree(sfp);
2241
2242 scsi_device_put(sdp->device);
2243 kref_put(&sdp->d_ref, sg_device_destroy);
2244 module_put(THIS_MODULE);
2245 }
2246
2247 static void
2248 sg_remove_sfp(struct kref *kref)
2249 {
2250 struct sg_fd *sfp = container_of(kref, struct sg_fd, f_ref);
2251 struct sg_device *sdp = sfp->parentdp;
2252 unsigned long iflags;
2253
2254 write_lock_irqsave(&sdp->sfd_lock, iflags);
2255 list_del(&sfp->sfd_siblings);
2256 write_unlock_irqrestore(&sdp->sfd_lock, iflags);
2257
2258 INIT_WORK(&sfp->ew.work, sg_remove_sfp_usercontext);
2259 schedule_work(&sfp->ew.work);
2260 }
2261
2262 #ifdef CONFIG_SCSI_PROC_FS
2263 static int
2264 sg_idr_max_id(int id, void *p, void *data)
2265 {
2266 int *k = data;
2267
2268 if (*k < id)
2269 *k = id;
2270
2271 return 0;
2272 }
2273
2274 static int
2275 sg_last_dev(void)
2276 {
2277 int k = -1;
2278 unsigned long iflags;
2279
2280 read_lock_irqsave(&sg_index_lock, iflags);
2281 idr_for_each(&sg_index_idr, sg_idr_max_id, &k);
2282 read_unlock_irqrestore(&sg_index_lock, iflags);
2283 return k + 1;
2284 }
2285 #endif
2286
2287
2288 static Sg_device *sg_lookup_dev(int dev)
2289 {
2290 return idr_find(&sg_index_idr, dev);
2291 }
2292
2293 static Sg_device *
2294 sg_get_dev(int dev)
2295 {
2296 struct sg_device *sdp;
2297 unsigned long flags;
2298
2299 read_lock_irqsave(&sg_index_lock, flags);
2300 sdp = sg_lookup_dev(dev);
2301 if (!sdp)
2302 sdp = ERR_PTR(-ENXIO);
2303 else if (atomic_read(&sdp->detaching)) {
2304
2305
2306
2307 sdp = ERR_PTR(-ENODEV);
2308 } else
2309 kref_get(&sdp->d_ref);
2310 read_unlock_irqrestore(&sg_index_lock, flags);
2311
2312 return sdp;
2313 }
2314
2315 #ifdef CONFIG_SCSI_PROC_FS
2316 static int sg_proc_seq_show_int(struct seq_file *s, void *v);
2317
2318 static int sg_proc_single_open_adio(struct inode *inode, struct file *file);
2319 static ssize_t sg_proc_write_adio(struct file *filp, const char __user *buffer,
2320 size_t count, loff_t *off);
2321 static const struct proc_ops adio_proc_ops = {
2322 .proc_open = sg_proc_single_open_adio,
2323 .proc_read = seq_read,
2324 .proc_lseek = seq_lseek,
2325 .proc_write = sg_proc_write_adio,
2326 .proc_release = single_release,
2327 };
2328
2329 static int sg_proc_single_open_dressz(struct inode *inode, struct file *file);
2330 static ssize_t sg_proc_write_dressz(struct file *filp,
2331 const char __user *buffer, size_t count, loff_t *off);
2332 static const struct proc_ops dressz_proc_ops = {
2333 .proc_open = sg_proc_single_open_dressz,
2334 .proc_read = seq_read,
2335 .proc_lseek = seq_lseek,
2336 .proc_write = sg_proc_write_dressz,
2337 .proc_release = single_release,
2338 };
2339
2340 static int sg_proc_seq_show_version(struct seq_file *s, void *v);
2341 static int sg_proc_seq_show_devhdr(struct seq_file *s, void *v);
2342 static int sg_proc_seq_show_dev(struct seq_file *s, void *v);
2343 static void * dev_seq_start(struct seq_file *s, loff_t *pos);
2344 static void * dev_seq_next(struct seq_file *s, void *v, loff_t *pos);
2345 static void dev_seq_stop(struct seq_file *s, void *v);
2346 static const struct seq_operations dev_seq_ops = {
2347 .start = dev_seq_start,
2348 .next = dev_seq_next,
2349 .stop = dev_seq_stop,
2350 .show = sg_proc_seq_show_dev,
2351 };
2352
2353 static int sg_proc_seq_show_devstrs(struct seq_file *s, void *v);
2354 static const struct seq_operations devstrs_seq_ops = {
2355 .start = dev_seq_start,
2356 .next = dev_seq_next,
2357 .stop = dev_seq_stop,
2358 .show = sg_proc_seq_show_devstrs,
2359 };
2360
2361 static int sg_proc_seq_show_debug(struct seq_file *s, void *v);
2362 static const struct seq_operations debug_seq_ops = {
2363 .start = dev_seq_start,
2364 .next = dev_seq_next,
2365 .stop = dev_seq_stop,
2366 .show = sg_proc_seq_show_debug,
2367 };
2368
2369 static int
2370 sg_proc_init(void)
2371 {
2372 struct proc_dir_entry *p;
2373
2374 p = proc_mkdir("scsi/sg", NULL);
2375 if (!p)
2376 return 1;
2377
2378 proc_create("allow_dio", S_IRUGO | S_IWUSR, p, &adio_proc_ops);
2379 proc_create_seq("debug", S_IRUGO, p, &debug_seq_ops);
2380 proc_create("def_reserved_size", S_IRUGO | S_IWUSR, p, &dressz_proc_ops);
2381 proc_create_single("device_hdr", S_IRUGO, p, sg_proc_seq_show_devhdr);
2382 proc_create_seq("devices", S_IRUGO, p, &dev_seq_ops);
2383 proc_create_seq("device_strs", S_IRUGO, p, &devstrs_seq_ops);
2384 proc_create_single("version", S_IRUGO, p, sg_proc_seq_show_version);
2385 return 0;
2386 }
2387
2388
2389 static int sg_proc_seq_show_int(struct seq_file *s, void *v)
2390 {
2391 seq_printf(s, "%d\n", *((int *)s->private));
2392 return 0;
2393 }
2394
2395 static int sg_proc_single_open_adio(struct inode *inode, struct file *file)
2396 {
2397 return single_open(file, sg_proc_seq_show_int, &sg_allow_dio);
2398 }
2399
2400 static ssize_t
2401 sg_proc_write_adio(struct file *filp, const char __user *buffer,
2402 size_t count, loff_t *off)
2403 {
2404 int err;
2405 unsigned long num;
2406
2407 if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RAWIO))
2408 return -EACCES;
2409 err = kstrtoul_from_user(buffer, count, 0, &num);
2410 if (err)
2411 return err;
2412 sg_allow_dio = num ? 1 : 0;
2413 return count;
2414 }
2415
2416 static int sg_proc_single_open_dressz(struct inode *inode, struct file *file)
2417 {
2418 return single_open(file, sg_proc_seq_show_int, &sg_big_buff);
2419 }
2420
2421 static ssize_t
2422 sg_proc_write_dressz(struct file *filp, const char __user *buffer,
2423 size_t count, loff_t *off)
2424 {
2425 int err;
2426 unsigned long k = ULONG_MAX;
2427
2428 if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RAWIO))
2429 return -EACCES;
2430
2431 err = kstrtoul_from_user(buffer, count, 0, &k);
2432 if (err)
2433 return err;
2434 if (k <= 1048576) {
2435 sg_big_buff = k;
2436 return count;
2437 }
2438 return -ERANGE;
2439 }
2440
2441 static int sg_proc_seq_show_version(struct seq_file *s, void *v)
2442 {
2443 seq_printf(s, "%d\t%s [%s]\n", sg_version_num, SG_VERSION_STR,
2444 sg_version_date);
2445 return 0;
2446 }
2447
2448 static int sg_proc_seq_show_devhdr(struct seq_file *s, void *v)
2449 {
2450 seq_puts(s, "host\tchan\tid\tlun\ttype\topens\tqdepth\tbusy\tonline\n");
2451 return 0;
2452 }
2453
2454 struct sg_proc_deviter {
2455 loff_t index;
2456 size_t max;
2457 };
2458
2459 static void * dev_seq_start(struct seq_file *s, loff_t *pos)
2460 {
2461 struct sg_proc_deviter * it = kmalloc(sizeof(*it), GFP_KERNEL);
2462
2463 s->private = it;
2464 if (! it)
2465 return NULL;
2466
2467 it->index = *pos;
2468 it->max = sg_last_dev();
2469 if (it->index >= it->max)
2470 return NULL;
2471 return it;
2472 }
2473
2474 static void * dev_seq_next(struct seq_file *s, void *v, loff_t *pos)
2475 {
2476 struct sg_proc_deviter * it = s->private;
2477
2478 *pos = ++it->index;
2479 return (it->index < it->max) ? it : NULL;
2480 }
2481
2482 static void dev_seq_stop(struct seq_file *s, void *v)
2483 {
2484 kfree(s->private);
2485 }
2486
2487 static int sg_proc_seq_show_dev(struct seq_file *s, void *v)
2488 {
2489 struct sg_proc_deviter * it = (struct sg_proc_deviter *) v;
2490 Sg_device *sdp;
2491 struct scsi_device *scsidp;
2492 unsigned long iflags;
2493
2494 read_lock_irqsave(&sg_index_lock, iflags);
2495 sdp = it ? sg_lookup_dev(it->index) : NULL;
2496 if ((NULL == sdp) || (NULL == sdp->device) ||
2497 (atomic_read(&sdp->detaching)))
2498 seq_puts(s, "-1\t-1\t-1\t-1\t-1\t-1\t-1\t-1\t-1\n");
2499 else {
2500 scsidp = sdp->device;
2501 seq_printf(s, "%d\t%d\t%d\t%llu\t%d\t%d\t%d\t%d\t%d\n",
2502 scsidp->host->host_no, scsidp->channel,
2503 scsidp->id, scsidp->lun, (int) scsidp->type,
2504 1,
2505 (int) scsidp->queue_depth,
2506 (int) scsi_device_busy(scsidp),
2507 (int) scsi_device_online(scsidp));
2508 }
2509 read_unlock_irqrestore(&sg_index_lock, iflags);
2510 return 0;
2511 }
2512
2513 static int sg_proc_seq_show_devstrs(struct seq_file *s, void *v)
2514 {
2515 struct sg_proc_deviter * it = (struct sg_proc_deviter *) v;
2516 Sg_device *sdp;
2517 struct scsi_device *scsidp;
2518 unsigned long iflags;
2519
2520 read_lock_irqsave(&sg_index_lock, iflags);
2521 sdp = it ? sg_lookup_dev(it->index) : NULL;
2522 scsidp = sdp ? sdp->device : NULL;
2523 if (sdp && scsidp && (!atomic_read(&sdp->detaching)))
2524 seq_printf(s, "%8.8s\t%16.16s\t%4.4s\n",
2525 scsidp->vendor, scsidp->model, scsidp->rev);
2526 else
2527 seq_puts(s, "<no active device>\n");
2528 read_unlock_irqrestore(&sg_index_lock, iflags);
2529 return 0;
2530 }
2531
2532
2533 static void sg_proc_debug_helper(struct seq_file *s, Sg_device * sdp)
2534 {
2535 int k, new_interface, blen, usg;
2536 Sg_request *srp;
2537 Sg_fd *fp;
2538 const sg_io_hdr_t *hp;
2539 const char * cp;
2540 unsigned int ms;
2541
2542 k = 0;
2543 list_for_each_entry(fp, &sdp->sfds, sfd_siblings) {
2544 k++;
2545 read_lock(&fp->rq_list_lock);
2546 seq_printf(s, " FD(%d): timeout=%dms bufflen=%d "
2547 "(res)sgat=%d low_dma=%d\n", k,
2548 jiffies_to_msecs(fp->timeout),
2549 fp->reserve.bufflen,
2550 (int) fp->reserve.k_use_sg, 0);
2551 seq_printf(s, " cmd_q=%d f_packid=%d k_orphan=%d closed=0\n",
2552 (int) fp->cmd_q, (int) fp->force_packid,
2553 (int) fp->keep_orphan);
2554 list_for_each_entry(srp, &fp->rq_list, entry) {
2555 hp = &srp->header;
2556 new_interface = (hp->interface_id == '\0') ? 0 : 1;
2557 if (srp->res_used) {
2558 if (new_interface &&
2559 (SG_FLAG_MMAP_IO & hp->flags))
2560 cp = " mmap>> ";
2561 else
2562 cp = " rb>> ";
2563 } else {
2564 if (SG_INFO_DIRECT_IO_MASK & hp->info)
2565 cp = " dio>> ";
2566 else
2567 cp = " ";
2568 }
2569 seq_puts(s, cp);
2570 blen = srp->data.bufflen;
2571 usg = srp->data.k_use_sg;
2572 seq_puts(s, srp->done ?
2573 ((1 == srp->done) ? "rcv:" : "fin:")
2574 : "act:");
2575 seq_printf(s, " id=%d blen=%d",
2576 srp->header.pack_id, blen);
2577 if (srp->done)
2578 seq_printf(s, " dur=%d", hp->duration);
2579 else {
2580 ms = jiffies_to_msecs(jiffies);
2581 seq_printf(s, " t_o/elap=%d/%d",
2582 (new_interface ? hp->timeout :
2583 jiffies_to_msecs(fp->timeout)),
2584 (ms > hp->duration ? ms - hp->duration : 0));
2585 }
2586 seq_printf(s, "ms sgat=%d op=0x%02x\n", usg,
2587 (int) srp->data.cmd_opcode);
2588 }
2589 if (list_empty(&fp->rq_list))
2590 seq_puts(s, " No requests active\n");
2591 read_unlock(&fp->rq_list_lock);
2592 }
2593 }
2594
2595 static int sg_proc_seq_show_debug(struct seq_file *s, void *v)
2596 {
2597 struct sg_proc_deviter * it = (struct sg_proc_deviter *) v;
2598 Sg_device *sdp;
2599 unsigned long iflags;
2600
2601 if (it && (0 == it->index))
2602 seq_printf(s, "max_active_device=%d def_reserved_size=%d\n",
2603 (int)it->max, sg_big_buff);
2604
2605 read_lock_irqsave(&sg_index_lock, iflags);
2606 sdp = it ? sg_lookup_dev(it->index) : NULL;
2607 if (NULL == sdp)
2608 goto skip;
2609 read_lock(&sdp->sfd_lock);
2610 if (!list_empty(&sdp->sfds)) {
2611 seq_printf(s, " >>> device=%s ", sdp->name);
2612 if (atomic_read(&sdp->detaching))
2613 seq_puts(s, "detaching pending close ");
2614 else if (sdp->device) {
2615 struct scsi_device *scsidp = sdp->device;
2616
2617 seq_printf(s, "%d:%d:%d:%llu em=%d",
2618 scsidp->host->host_no,
2619 scsidp->channel, scsidp->id,
2620 scsidp->lun,
2621 scsidp->host->hostt->emulated);
2622 }
2623 seq_printf(s, " sg_tablesize=%d excl=%d open_cnt=%d\n",
2624 sdp->sg_tablesize, sdp->exclude, sdp->open_cnt);
2625 sg_proc_debug_helper(s, sdp);
2626 }
2627 read_unlock(&sdp->sfd_lock);
2628 skip:
2629 read_unlock_irqrestore(&sg_index_lock, iflags);
2630 return 0;
2631 }
2632
2633 #endif
2634
2635 module_init(init_sg);
2636 module_exit(exit_sg);