[SCSI] Revert "sg: checking sdp->detached isn't protected when open"
[platform/adaptation/renesas_rcar/renesas_kernel.git] / drivers / scsi / sg.c
1 /*
2  *  History:
3  *  Started: Aug 9 by Lawrence Foard (entropy@world.std.com),
4  *           to allow user process control of SCSI devices.
5  *  Development Sponsored by Killy Corp. NY NY
6  *
7  * Original driver (sg.c):
8  *        Copyright (C) 1992 Lawrence Foard
9  * Version 2 and 3 extensions to driver:
10  *        Copyright (C) 1998 - 2005 Douglas Gilbert
11  *
12  *  Modified  19-JAN-1998  Richard Gooch <rgooch@atnf.csiro.au>  Devfs support
13  *
14  * This program is free software; you can redistribute it and/or modify
15  * it under the terms of the GNU General Public License as published by
16  * the Free Software Foundation; either version 2, or (at your option)
17  * any later version.
18  *
19  */
20
21 static int sg_version_num = 30534;      /* 2 digits for each component */
22 #define SG_VERSION_STR "3.5.34"
23
24 /*
25  *  D. P. Gilbert (dgilbert@interlog.com, dougg@triode.net.au), notes:
26  *      - scsi logging is available via SCSI_LOG_TIMEOUT macros. First
27  *        the kernel/module needs to be built with CONFIG_SCSI_LOGGING
28  *        (otherwise the macros compile to empty statements).
29  *
30  */
31 #include <linux/module.h>
32
33 #include <linux/fs.h>
34 #include <linux/kernel.h>
35 #include <linux/sched.h>
36 #include <linux/string.h>
37 #include <linux/mm.h>
38 #include <linux/aio.h>
39 #include <linux/errno.h>
40 #include <linux/mtio.h>
41 #include <linux/ioctl.h>
42 #include <linux/slab.h>
43 #include <linux/fcntl.h>
44 #include <linux/init.h>
45 #include <linux/poll.h>
46 #include <linux/moduleparam.h>
47 #include <linux/cdev.h>
48 #include <linux/idr.h>
49 #include <linux/seq_file.h>
50 #include <linux/blkdev.h>
51 #include <linux/delay.h>
52 #include <linux/blktrace_api.h>
53 #include <linux/mutex.h>
54 #include <linux/ratelimit.h>
55
56 #include "scsi.h"
57 #include <scsi/scsi_dbg.h>
58 #include <scsi/scsi_host.h>
59 #include <scsi/scsi_driver.h>
60 #include <scsi/scsi_ioctl.h>
61 #include <scsi/sg.h>
62
63 #include "scsi_logging.h"
64
65 #ifdef CONFIG_SCSI_PROC_FS
66 #include <linux/proc_fs.h>
67 static char *sg_version_date = "20061027";
68
69 static int sg_proc_init(void);
70 static void sg_proc_cleanup(void);
71 #endif
72
73 #define SG_ALLOW_DIO_DEF 0
74
75 #define SG_MAX_DEVS 32768
76
77 /*
78  * Suppose you want to calculate the formula muldiv(x,m,d)=int(x * m / d)
79  * Then when using 32 bit integers x * m may overflow during the calculation.
80  * Replacing muldiv(x) by muldiv(x)=((x % d) * m) / d + int(x / d) * m
81  * calculates the same, but prevents the overflow when both m and d
82  * are "small" numbers (like HZ and USER_HZ).
83  * Of course an overflow is inavoidable if the result of muldiv doesn't fit
84  * in 32 bits.
85  */
86 #define MULDIV(X,MUL,DIV) ((((X % DIV) * MUL) / DIV) + ((X / DIV) * MUL))
87
88 #define SG_DEFAULT_TIMEOUT MULDIV(SG_DEFAULT_TIMEOUT_USER, HZ, USER_HZ)
89
90 int sg_big_buff = SG_DEF_RESERVED_SIZE;
91 /* N.B. This variable is readable and writeable via
92    /proc/scsi/sg/def_reserved_size . Each time sg_open() is called a buffer
93    of this size (or less if there is not enough memory) will be reserved
94    for use by this file descriptor. [Deprecated usage: this variable is also
95    readable via /proc/sys/kernel/sg-big-buff if the sg driver is built into
96    the kernel (i.e. it is not a module).] */
97 static int def_reserved_size = -1;      /* picks up init parameter */
98 static int sg_allow_dio = SG_ALLOW_DIO_DEF;
99
100 static int scatter_elem_sz = SG_SCATTER_SZ;
101 static int scatter_elem_sz_prev = SG_SCATTER_SZ;
102
103 #define SG_SECTOR_SZ 512
104
105 static int sg_add(struct device *, struct class_interface *);
106 static void sg_remove(struct device *, struct class_interface *);
107
108 static DEFINE_IDR(sg_index_idr);
109 static DEFINE_RWLOCK(sg_index_lock);    /* Also used to lock
110                                                            file descriptor list for device */
111
112 static struct class_interface sg_interface = {
113         .add_dev        = sg_add,
114         .remove_dev     = sg_remove,
115 };
116
117 typedef struct sg_scatter_hold { /* holding area for scsi scatter gather info */
118         unsigned short k_use_sg; /* Count of kernel scatter-gather pieces */
119         unsigned sglist_len; /* size of malloc'd scatter-gather list ++ */
120         unsigned bufflen;       /* Size of (aggregate) data buffer */
121         struct page **pages;
122         int page_order;
123         char dio_in_use;        /* 0->indirect IO (or mmap), 1->dio */
124         unsigned char cmd_opcode; /* first byte of command */
125 } Sg_scatter_hold;
126
127 struct sg_device;               /* forward declarations */
128 struct sg_fd;
129
130 typedef struct sg_request {     /* SG_MAX_QUEUE requests outstanding per file */
131         struct sg_request *nextrp;      /* NULL -> tail request (slist) */
132         struct sg_fd *parentfp; /* NULL -> not in use */
133         Sg_scatter_hold data;   /* hold buffer, perhaps scatter list */
134         sg_io_hdr_t header;     /* scsi command+info, see <scsi/sg.h> */
135         unsigned char sense_b[SCSI_SENSE_BUFFERSIZE];
136         char res_used;          /* 1 -> using reserve buffer, 0 -> not ... */
137         char orphan;            /* 1 -> drop on sight, 0 -> normal */
138         char sg_io_owned;       /* 1 -> packet belongs to SG_IO */
139         /* done protected by rq_list_lock */
140         char done;              /* 0->before bh, 1->before read, 2->read */
141         struct request *rq;
142         struct bio *bio;
143         struct execute_work ew;
144 } Sg_request;
145
146 typedef struct sg_fd {          /* holds the state of a file descriptor */
147         /* sfd_siblings is protected by sg_index_lock */
148         struct list_head sfd_siblings;
149         struct sg_device *parentdp;     /* owning device */
150         wait_queue_head_t read_wait;    /* queue read until command done */
151         rwlock_t rq_list_lock;  /* protect access to list in req_arr */
152         int timeout;            /* defaults to SG_DEFAULT_TIMEOUT      */
153         int timeout_user;       /* defaults to SG_DEFAULT_TIMEOUT_USER */
154         Sg_scatter_hold reserve;        /* buffer held for this file descriptor */
155         unsigned save_scat_len; /* original length of trunc. scat. element */
156         Sg_request *headrp;     /* head of request slist, NULL->empty */
157         struct fasync_struct *async_qp; /* used by asynchronous notification */
158         Sg_request req_arr[SG_MAX_QUEUE];       /* used as singly-linked list */
159         char low_dma;           /* as in parent but possibly overridden to 1 */
160         char force_packid;      /* 1 -> pack_id input to read(), 0 -> ignored */
161         char cmd_q;             /* 1 -> allow command queuing, 0 -> don't */
162         char next_cmd_len;      /* 0 -> automatic (def), >0 -> use on next write() */
163         char keep_orphan;       /* 0 -> drop orphan (def), 1 -> keep for read() */
164         char mmap_called;       /* 0 -> mmap() never called on this fd */
165         struct kref f_ref;
166         struct execute_work ew;
167 } Sg_fd;
168
169 typedef struct sg_device { /* holds the state of each scsi generic device */
170         struct scsi_device *device;
171         int sg_tablesize;       /* adapter's max scatter-gather table size */
172         u32 index;              /* device index number */
173         /* sfds is protected by sg_index_lock */
174         struct list_head sfds;
175         struct rw_semaphore o_sem;      /* exclude open should hold this rwsem */
176         volatile char detached; /* 0->attached, 1->detached pending removal */
177         char exclude;           /* opened for exclusive access */
178         char sgdebug;           /* 0->off, 1->sense, 9->dump dev, 10-> all devs */
179         struct gendisk *disk;
180         struct cdev * cdev;     /* char_dev [sysfs: /sys/cdev/major/sg<n>] */
181         struct kref d_ref;
182 } Sg_device;
183
184 /* tasklet or soft irq callback */
185 static void sg_rq_end_io(struct request *rq, int uptodate);
186 static int sg_start_req(Sg_request *srp, unsigned char *cmd);
187 static int sg_finish_rem_req(Sg_request * srp);
188 static int sg_build_indirect(Sg_scatter_hold * schp, Sg_fd * sfp, int buff_size);
189 static ssize_t sg_new_read(Sg_fd * sfp, char __user *buf, size_t count,
190                            Sg_request * srp);
191 static ssize_t sg_new_write(Sg_fd *sfp, struct file *file,
192                         const char __user *buf, size_t count, int blocking,
193                         int read_only, int sg_io_owned, Sg_request **o_srp);
194 static int sg_common_write(Sg_fd * sfp, Sg_request * srp,
195                            unsigned char *cmnd, int timeout, int blocking);
196 static int sg_read_oxfer(Sg_request * srp, char __user *outp, int num_read_xfer);
197 static void sg_remove_scat(Sg_scatter_hold * schp);
198 static void sg_build_reserve(Sg_fd * sfp, int req_size);
199 static void sg_link_reserve(Sg_fd * sfp, Sg_request * srp, int size);
200 static void sg_unlink_reserve(Sg_fd * sfp, Sg_request * srp);
201 static Sg_fd *sg_add_sfp(Sg_device * sdp, int dev);
202 static void sg_remove_sfp(struct kref *);
203 static Sg_request *sg_get_rq_mark(Sg_fd * sfp, int pack_id);
204 static Sg_request *sg_add_request(Sg_fd * sfp);
205 static int sg_remove_request(Sg_fd * sfp, Sg_request * srp);
206 static int sg_res_in_use(Sg_fd * sfp);
207 static Sg_device *sg_get_dev(int dev);
208 static void sg_put_dev(Sg_device *sdp);
209
210 #define SZ_SG_HEADER sizeof(struct sg_header)
211 #define SZ_SG_IO_HDR sizeof(sg_io_hdr_t)
212 #define SZ_SG_IOVEC sizeof(sg_iovec_t)
213 #define SZ_SG_REQ_INFO sizeof(sg_req_info_t)
214
215 static int sg_allow_access(struct file *filp, unsigned char *cmd)
216 {
217         struct sg_fd *sfp = filp->private_data;
218
219         if (sfp->parentdp->device->type == TYPE_SCANNER)
220                 return 0;
221
222         return blk_verify_command(cmd, filp->f_mode & FMODE_WRITE);
223 }
224
225 static int sfds_list_empty(Sg_device *sdp)
226 {
227         unsigned long flags;
228         int ret;
229
230         read_lock_irqsave(&sg_index_lock, flags);
231         ret = list_empty(&sdp->sfds);
232         read_unlock_irqrestore(&sg_index_lock, flags);
233         return ret;
234 }
235
236 static int
237 sg_open(struct inode *inode, struct file *filp)
238 {
239         int dev = iminor(inode);
240         int flags = filp->f_flags;
241         struct request_queue *q;
242         Sg_device *sdp;
243         Sg_fd *sfp;
244         int retval;
245
246         nonseekable_open(inode, filp);
247         SCSI_LOG_TIMEOUT(3, printk("sg_open: dev=%d, flags=0x%x\n", dev, flags));
248         sdp = sg_get_dev(dev);
249         if (IS_ERR(sdp)) {
250                 retval = PTR_ERR(sdp);
251                 sdp = NULL;
252                 goto sg_put;
253         }
254
255         /* This driver's module count bumped by fops_get in <linux/fs.h> */
256         /* Prevent the device driver from vanishing while we sleep */
257         retval = scsi_device_get(sdp->device);
258         if (retval)
259                 goto sg_put;
260
261         retval = scsi_autopm_get_device(sdp->device);
262         if (retval)
263                 goto sdp_put;
264
265         if (!((flags & O_NONBLOCK) ||
266               scsi_block_when_processing_errors(sdp->device))) {
267                 retval = -ENXIO;
268                 /* we are in error recovery for this device */
269                 goto error_out;
270         }
271
272         if ((flags & O_EXCL) && (O_RDONLY == (flags & O_ACCMODE))) {
273                 retval = -EPERM; /* Can't lock it with read only access */
274                 goto error_out;
275         }
276         if (flags & O_NONBLOCK) {
277                 if (flags & O_EXCL) {
278                         if (!down_write_trylock(&sdp->o_sem)) {
279                                 retval = -EBUSY;
280                                 goto error_out;
281                         }
282                 } else {
283                         if (!down_read_trylock(&sdp->o_sem)) {
284                                 retval = -EBUSY;
285                                 goto error_out;
286                         }
287                 }
288         } else {
289                 if (flags & O_EXCL)
290                         down_write(&sdp->o_sem);
291                 else
292                         down_read(&sdp->o_sem);
293         }
294         /* Since write lock is held, no need to check sfd_list */
295         if (flags & O_EXCL)
296                 sdp->exclude = 1;       /* used by release lock */
297
298         if (sdp->detached) {
299                 retval = -ENODEV;
300                 goto sem_out;
301         }
302         if (sfds_list_empty(sdp)) {     /* no existing opens on this device */
303                 sdp->sgdebug = 0;
304                 q = sdp->device->request_queue;
305                 sdp->sg_tablesize = queue_max_segments(q);
306         }
307         if ((sfp = sg_add_sfp(sdp, dev)))
308                 filp->private_data = sfp;
309                 /* retval is already provably zero at this point because of the
310                  * check after retval = scsi_autopm_get_device(sdp->device))
311                  */
312         else {
313                 retval = -ENOMEM;
314 sem_out:
315                 if (flags & O_EXCL) {
316                         sdp->exclude = 0;       /* undo if error */
317                         up_write(&sdp->o_sem);
318                 } else
319                         up_read(&sdp->o_sem);
320 error_out:
321                 scsi_autopm_put_device(sdp->device);
322 sdp_put:
323                 scsi_device_put(sdp->device);
324         }
325 sg_put:
326         if (sdp)
327                 sg_put_dev(sdp);
328         return retval;
329 }
330
331 /* Following function was formerly called 'sg_close' */
332 static int
333 sg_release(struct inode *inode, struct file *filp)
334 {
335         Sg_device *sdp;
336         Sg_fd *sfp;
337         int excl;
338
339         if ((!(sfp = (Sg_fd *) filp->private_data)) || (!(sdp = sfp->parentdp)))
340                 return -ENXIO;
341         SCSI_LOG_TIMEOUT(3, printk("sg_release: %s\n", sdp->disk->disk_name));
342
343         excl = sdp->exclude;
344         sdp->exclude = 0;
345         if (excl)
346                 up_write(&sdp->o_sem);
347         else
348                 up_read(&sdp->o_sem);
349
350         scsi_autopm_put_device(sdp->device);
351         kref_put(&sfp->f_ref, sg_remove_sfp);
352         return 0;
353 }
354
355 static ssize_t
356 sg_read(struct file *filp, char __user *buf, size_t count, loff_t * ppos)
357 {
358         Sg_device *sdp;
359         Sg_fd *sfp;
360         Sg_request *srp;
361         int req_pack_id = -1;
362         sg_io_hdr_t *hp;
363         struct sg_header *old_hdr = NULL;
364         int retval = 0;
365
366         if ((!(sfp = (Sg_fd *) filp->private_data)) || (!(sdp = sfp->parentdp)))
367                 return -ENXIO;
368         SCSI_LOG_TIMEOUT(3, printk("sg_read: %s, count=%d\n",
369                                    sdp->disk->disk_name, (int) count));
370
371         if (!access_ok(VERIFY_WRITE, buf, count))
372                 return -EFAULT;
373         if (sfp->force_packid && (count >= SZ_SG_HEADER)) {
374                 old_hdr = kmalloc(SZ_SG_HEADER, GFP_KERNEL);
375                 if (!old_hdr)
376                         return -ENOMEM;
377                 if (__copy_from_user(old_hdr, buf, SZ_SG_HEADER)) {
378                         retval = -EFAULT;
379                         goto free_old_hdr;
380                 }
381                 if (old_hdr->reply_len < 0) {
382                         if (count >= SZ_SG_IO_HDR) {
383                                 sg_io_hdr_t *new_hdr;
384                                 new_hdr = kmalloc(SZ_SG_IO_HDR, GFP_KERNEL);
385                                 if (!new_hdr) {
386                                         retval = -ENOMEM;
387                                         goto free_old_hdr;
388                                 }
389                                 retval =__copy_from_user
390                                     (new_hdr, buf, SZ_SG_IO_HDR);
391                                 req_pack_id = new_hdr->pack_id;
392                                 kfree(new_hdr);
393                                 if (retval) {
394                                         retval = -EFAULT;
395                                         goto free_old_hdr;
396                                 }
397                         }
398                 } else
399                         req_pack_id = old_hdr->pack_id;
400         }
401         srp = sg_get_rq_mark(sfp, req_pack_id);
402         if (!srp) {             /* now wait on packet to arrive */
403                 if (sdp->detached) {
404                         retval = -ENODEV;
405                         goto free_old_hdr;
406                 }
407                 if (filp->f_flags & O_NONBLOCK) {
408                         retval = -EAGAIN;
409                         goto free_old_hdr;
410                 }
411                 retval = wait_event_interruptible(sfp->read_wait,
412                         (sdp->detached ||
413                         (srp = sg_get_rq_mark(sfp, req_pack_id))));
414                 if (sdp->detached) {
415                         retval = -ENODEV;
416                         goto free_old_hdr;
417                 }
418                 if (retval) {
419                         /* -ERESTARTSYS as signal hit process */
420                         goto free_old_hdr;
421                 }
422         }
423         if (srp->header.interface_id != '\0') {
424                 retval = sg_new_read(sfp, buf, count, srp);
425                 goto free_old_hdr;
426         }
427
428         hp = &srp->header;
429         if (old_hdr == NULL) {
430                 old_hdr = kmalloc(SZ_SG_HEADER, GFP_KERNEL);
431                 if (! old_hdr) {
432                         retval = -ENOMEM;
433                         goto free_old_hdr;
434                 }
435         }
436         memset(old_hdr, 0, SZ_SG_HEADER);
437         old_hdr->reply_len = (int) hp->timeout;
438         old_hdr->pack_len = old_hdr->reply_len; /* old, strange behaviour */
439         old_hdr->pack_id = hp->pack_id;
440         old_hdr->twelve_byte =
441             ((srp->data.cmd_opcode >= 0xc0) && (12 == hp->cmd_len)) ? 1 : 0;
442         old_hdr->target_status = hp->masked_status;
443         old_hdr->host_status = hp->host_status;
444         old_hdr->driver_status = hp->driver_status;
445         if ((CHECK_CONDITION & hp->masked_status) ||
446             (DRIVER_SENSE & hp->driver_status))
447                 memcpy(old_hdr->sense_buffer, srp->sense_b,
448                        sizeof (old_hdr->sense_buffer));
449         switch (hp->host_status) {
450         /* This setup of 'result' is for backward compatibility and is best
451            ignored by the user who should use target, host + driver status */
452         case DID_OK:
453         case DID_PASSTHROUGH:
454         case DID_SOFT_ERROR:
455                 old_hdr->result = 0;
456                 break;
457         case DID_NO_CONNECT:
458         case DID_BUS_BUSY:
459         case DID_TIME_OUT:
460                 old_hdr->result = EBUSY;
461                 break;
462         case DID_BAD_TARGET:
463         case DID_ABORT:
464         case DID_PARITY:
465         case DID_RESET:
466         case DID_BAD_INTR:
467                 old_hdr->result = EIO;
468                 break;
469         case DID_ERROR:
470                 old_hdr->result = (srp->sense_b[0] == 0 && 
471                                   hp->masked_status == GOOD) ? 0 : EIO;
472                 break;
473         default:
474                 old_hdr->result = EIO;
475                 break;
476         }
477
478         /* Now copy the result back to the user buffer.  */
479         if (count >= SZ_SG_HEADER) {
480                 if (__copy_to_user(buf, old_hdr, SZ_SG_HEADER)) {
481                         retval = -EFAULT;
482                         goto free_old_hdr;
483                 }
484                 buf += SZ_SG_HEADER;
485                 if (count > old_hdr->reply_len)
486                         count = old_hdr->reply_len;
487                 if (count > SZ_SG_HEADER) {
488                         if (sg_read_oxfer(srp, buf, count - SZ_SG_HEADER)) {
489                                 retval = -EFAULT;
490                                 goto free_old_hdr;
491                         }
492                 }
493         } else
494                 count = (old_hdr->result == 0) ? 0 : -EIO;
495         sg_finish_rem_req(srp);
496         retval = count;
497 free_old_hdr:
498         kfree(old_hdr);
499         return retval;
500 }
501
502 static ssize_t
503 sg_new_read(Sg_fd * sfp, char __user *buf, size_t count, Sg_request * srp)
504 {
505         sg_io_hdr_t *hp = &srp->header;
506         int err = 0;
507         int len;
508
509         if (count < SZ_SG_IO_HDR) {
510                 err = -EINVAL;
511                 goto err_out;
512         }
513         hp->sb_len_wr = 0;
514         if ((hp->mx_sb_len > 0) && hp->sbp) {
515                 if ((CHECK_CONDITION & hp->masked_status) ||
516                     (DRIVER_SENSE & hp->driver_status)) {
517                         int sb_len = SCSI_SENSE_BUFFERSIZE;
518                         sb_len = (hp->mx_sb_len > sb_len) ? sb_len : hp->mx_sb_len;
519                         len = 8 + (int) srp->sense_b[7];        /* Additional sense length field */
520                         len = (len > sb_len) ? sb_len : len;
521                         if (copy_to_user(hp->sbp, srp->sense_b, len)) {
522                                 err = -EFAULT;
523                                 goto err_out;
524                         }
525                         hp->sb_len_wr = len;
526                 }
527         }
528         if (hp->masked_status || hp->host_status || hp->driver_status)
529                 hp->info |= SG_INFO_CHECK;
530         if (copy_to_user(buf, hp, SZ_SG_IO_HDR)) {
531                 err = -EFAULT;
532                 goto err_out;
533         }
534 err_out:
535         err = sg_finish_rem_req(srp);
536         return (0 == err) ? count : err;
537 }
538
539 static ssize_t
540 sg_write(struct file *filp, const char __user *buf, size_t count, loff_t * ppos)
541 {
542         int mxsize, cmd_size, k;
543         int input_size, blocking;
544         unsigned char opcode;
545         Sg_device *sdp;
546         Sg_fd *sfp;
547         Sg_request *srp;
548         struct sg_header old_hdr;
549         sg_io_hdr_t *hp;
550         unsigned char cmnd[MAX_COMMAND_SIZE];
551
552         if ((!(sfp = (Sg_fd *) filp->private_data)) || (!(sdp = sfp->parentdp)))
553                 return -ENXIO;
554         SCSI_LOG_TIMEOUT(3, printk("sg_write: %s, count=%d\n",
555                                    sdp->disk->disk_name, (int) count));
556         if (sdp->detached)
557                 return -ENODEV;
558         if (!((filp->f_flags & O_NONBLOCK) ||
559               scsi_block_when_processing_errors(sdp->device)))
560                 return -ENXIO;
561
562         if (!access_ok(VERIFY_READ, buf, count))
563                 return -EFAULT; /* protects following copy_from_user()s + get_user()s */
564         if (count < SZ_SG_HEADER)
565                 return -EIO;
566         if (__copy_from_user(&old_hdr, buf, SZ_SG_HEADER))
567                 return -EFAULT;
568         blocking = !(filp->f_flags & O_NONBLOCK);
569         if (old_hdr.reply_len < 0)
570                 return sg_new_write(sfp, filp, buf, count,
571                                     blocking, 0, 0, NULL);
572         if (count < (SZ_SG_HEADER + 6))
573                 return -EIO;    /* The minimum scsi command length is 6 bytes. */
574
575         if (!(srp = sg_add_request(sfp))) {
576                 SCSI_LOG_TIMEOUT(1, printk("sg_write: queue full\n"));
577                 return -EDOM;
578         }
579         buf += SZ_SG_HEADER;
580         __get_user(opcode, buf);
581         if (sfp->next_cmd_len > 0) {
582                 if (sfp->next_cmd_len > MAX_COMMAND_SIZE) {
583                         SCSI_LOG_TIMEOUT(1, printk("sg_write: command length too long\n"));
584                         sfp->next_cmd_len = 0;
585                         sg_remove_request(sfp, srp);
586                         return -EIO;
587                 }
588                 cmd_size = sfp->next_cmd_len;
589                 sfp->next_cmd_len = 0;  /* reset so only this write() effected */
590         } else {
591                 cmd_size = COMMAND_SIZE(opcode);        /* based on SCSI command group */
592                 if ((opcode >= 0xc0) && old_hdr.twelve_byte)
593                         cmd_size = 12;
594         }
595         SCSI_LOG_TIMEOUT(4, printk(
596                 "sg_write:   scsi opcode=0x%02x, cmd_size=%d\n", (int) opcode, cmd_size));
597 /* Determine buffer size.  */
598         input_size = count - cmd_size;
599         mxsize = (input_size > old_hdr.reply_len) ? input_size : old_hdr.reply_len;
600         mxsize -= SZ_SG_HEADER;
601         input_size -= SZ_SG_HEADER;
602         if (input_size < 0) {
603                 sg_remove_request(sfp, srp);
604                 return -EIO;    /* User did not pass enough bytes for this command. */
605         }
606         hp = &srp->header;
607         hp->interface_id = '\0';        /* indicator of old interface tunnelled */
608         hp->cmd_len = (unsigned char) cmd_size;
609         hp->iovec_count = 0;
610         hp->mx_sb_len = 0;
611         if (input_size > 0)
612                 hp->dxfer_direction = (old_hdr.reply_len > SZ_SG_HEADER) ?
613                     SG_DXFER_TO_FROM_DEV : SG_DXFER_TO_DEV;
614         else
615                 hp->dxfer_direction = (mxsize > 0) ? SG_DXFER_FROM_DEV : SG_DXFER_NONE;
616         hp->dxfer_len = mxsize;
617         if (hp->dxfer_direction == SG_DXFER_TO_DEV)
618                 hp->dxferp = (char __user *)buf + cmd_size;
619         else
620                 hp->dxferp = NULL;
621         hp->sbp = NULL;
622         hp->timeout = old_hdr.reply_len;        /* structure abuse ... */
623         hp->flags = input_size; /* structure abuse ... */
624         hp->pack_id = old_hdr.pack_id;
625         hp->usr_ptr = NULL;
626         if (__copy_from_user(cmnd, buf, cmd_size))
627                 return -EFAULT;
628         /*
629          * SG_DXFER_TO_FROM_DEV is functionally equivalent to SG_DXFER_FROM_DEV,
630          * but is is possible that the app intended SG_DXFER_TO_DEV, because there
631          * is a non-zero input_size, so emit a warning.
632          */
633         if (hp->dxfer_direction == SG_DXFER_TO_FROM_DEV) {
634                 static char cmd[TASK_COMM_LEN];
635                 if (strcmp(current->comm, cmd)) {
636                         printk_ratelimited(KERN_WARNING
637                                            "sg_write: data in/out %d/%d bytes "
638                                            "for SCSI command 0x%x-- guessing "
639                                            "data in;\n   program %s not setting "
640                                            "count and/or reply_len properly\n",
641                                            old_hdr.reply_len - (int)SZ_SG_HEADER,
642                                            input_size, (unsigned int) cmnd[0],
643                                            current->comm);
644                         strcpy(cmd, current->comm);
645                 }
646         }
647         k = sg_common_write(sfp, srp, cmnd, sfp->timeout, blocking);
648         return (k < 0) ? k : count;
649 }
650
651 static ssize_t
652 sg_new_write(Sg_fd *sfp, struct file *file, const char __user *buf,
653                  size_t count, int blocking, int read_only, int sg_io_owned,
654                  Sg_request **o_srp)
655 {
656         int k;
657         Sg_request *srp;
658         sg_io_hdr_t *hp;
659         unsigned char cmnd[MAX_COMMAND_SIZE];
660         int timeout;
661         unsigned long ul_timeout;
662
663         if (count < SZ_SG_IO_HDR)
664                 return -EINVAL;
665         if (!access_ok(VERIFY_READ, buf, count))
666                 return -EFAULT; /* protects following copy_from_user()s + get_user()s */
667
668         sfp->cmd_q = 1; /* when sg_io_hdr seen, set command queuing on */
669         if (!(srp = sg_add_request(sfp))) {
670                 SCSI_LOG_TIMEOUT(1, printk("sg_new_write: queue full\n"));
671                 return -EDOM;
672         }
673         srp->sg_io_owned = sg_io_owned;
674         hp = &srp->header;
675         if (__copy_from_user(hp, buf, SZ_SG_IO_HDR)) {
676                 sg_remove_request(sfp, srp);
677                 return -EFAULT;
678         }
679         if (hp->interface_id != 'S') {
680                 sg_remove_request(sfp, srp);
681                 return -ENOSYS;
682         }
683         if (hp->flags & SG_FLAG_MMAP_IO) {
684                 if (hp->dxfer_len > sfp->reserve.bufflen) {
685                         sg_remove_request(sfp, srp);
686                         return -ENOMEM; /* MMAP_IO size must fit in reserve buffer */
687                 }
688                 if (hp->flags & SG_FLAG_DIRECT_IO) {
689                         sg_remove_request(sfp, srp);
690                         return -EINVAL; /* either MMAP_IO or DIRECT_IO (not both) */
691                 }
692                 if (sg_res_in_use(sfp)) {
693                         sg_remove_request(sfp, srp);
694                         return -EBUSY;  /* reserve buffer already being used */
695                 }
696         }
697         ul_timeout = msecs_to_jiffies(srp->header.timeout);
698         timeout = (ul_timeout < INT_MAX) ? ul_timeout : INT_MAX;
699         if ((!hp->cmdp) || (hp->cmd_len < 6) || (hp->cmd_len > sizeof (cmnd))) {
700                 sg_remove_request(sfp, srp);
701                 return -EMSGSIZE;
702         }
703         if (!access_ok(VERIFY_READ, hp->cmdp, hp->cmd_len)) {
704                 sg_remove_request(sfp, srp);
705                 return -EFAULT; /* protects following copy_from_user()s + get_user()s */
706         }
707         if (__copy_from_user(cmnd, hp->cmdp, hp->cmd_len)) {
708                 sg_remove_request(sfp, srp);
709                 return -EFAULT;
710         }
711         if (read_only && sg_allow_access(file, cmnd)) {
712                 sg_remove_request(sfp, srp);
713                 return -EPERM;
714         }
715         k = sg_common_write(sfp, srp, cmnd, timeout, blocking);
716         if (k < 0)
717                 return k;
718         if (o_srp)
719                 *o_srp = srp;
720         return count;
721 }
722
723 static int
724 sg_common_write(Sg_fd * sfp, Sg_request * srp,
725                 unsigned char *cmnd, int timeout, int blocking)
726 {
727         int k, data_dir;
728         Sg_device *sdp = sfp->parentdp;
729         sg_io_hdr_t *hp = &srp->header;
730
731         srp->data.cmd_opcode = cmnd[0]; /* hold opcode of command */
732         hp->status = 0;
733         hp->masked_status = 0;
734         hp->msg_status = 0;
735         hp->info = 0;
736         hp->host_status = 0;
737         hp->driver_status = 0;
738         hp->resid = 0;
739         SCSI_LOG_TIMEOUT(4, printk("sg_common_write:  scsi opcode=0x%02x, cmd_size=%d\n",
740                           (int) cmnd[0], (int) hp->cmd_len));
741
742         k = sg_start_req(srp, cmnd);
743         if (k) {
744                 SCSI_LOG_TIMEOUT(1, printk("sg_common_write: start_req err=%d\n", k));
745                 sg_finish_rem_req(srp);
746                 return k;       /* probably out of space --> ENOMEM */
747         }
748         if (sdp->detached) {
749                 if (srp->bio)
750                         blk_end_request_all(srp->rq, -EIO);
751                 sg_finish_rem_req(srp);
752                 return -ENODEV;
753         }
754
755         switch (hp->dxfer_direction) {
756         case SG_DXFER_TO_FROM_DEV:
757         case SG_DXFER_FROM_DEV:
758                 data_dir = DMA_FROM_DEVICE;
759                 break;
760         case SG_DXFER_TO_DEV:
761                 data_dir = DMA_TO_DEVICE;
762                 break;
763         case SG_DXFER_UNKNOWN:
764                 data_dir = DMA_BIDIRECTIONAL;
765                 break;
766         default:
767                 data_dir = DMA_NONE;
768                 break;
769         }
770         hp->duration = jiffies_to_msecs(jiffies);
771
772         srp->rq->timeout = timeout;
773         kref_get(&sfp->f_ref); /* sg_rq_end_io() does kref_put(). */
774         blk_execute_rq_nowait(sdp->device->request_queue, sdp->disk,
775                               srp->rq, 1, sg_rq_end_io);
776         return 0;
777 }
778
779 static int srp_done(Sg_fd *sfp, Sg_request *srp)
780 {
781         unsigned long flags;
782         int ret;
783
784         read_lock_irqsave(&sfp->rq_list_lock, flags);
785         ret = srp->done;
786         read_unlock_irqrestore(&sfp->rq_list_lock, flags);
787         return ret;
788 }
789
790 static long
791 sg_ioctl(struct file *filp, unsigned int cmd_in, unsigned long arg)
792 {
793         void __user *p = (void __user *)arg;
794         int __user *ip = p;
795         int result, val, read_only;
796         Sg_device *sdp;
797         Sg_fd *sfp;
798         Sg_request *srp;
799         unsigned long iflags;
800
801         if ((!(sfp = (Sg_fd *) filp->private_data)) || (!(sdp = sfp->parentdp)))
802                 return -ENXIO;
803
804         SCSI_LOG_TIMEOUT(3, printk("sg_ioctl: %s, cmd=0x%x\n",
805                                    sdp->disk->disk_name, (int) cmd_in));
806         read_only = (O_RDWR != (filp->f_flags & O_ACCMODE));
807
808         switch (cmd_in) {
809         case SG_IO:
810                 if (sdp->detached)
811                         return -ENODEV;
812                 if (!scsi_block_when_processing_errors(sdp->device))
813                         return -ENXIO;
814                 if (!access_ok(VERIFY_WRITE, p, SZ_SG_IO_HDR))
815                         return -EFAULT;
816                 result = sg_new_write(sfp, filp, p, SZ_SG_IO_HDR,
817                                  1, read_only, 1, &srp);
818                 if (result < 0)
819                         return result;
820                 result = wait_event_interruptible(sfp->read_wait,
821                         (srp_done(sfp, srp) || sdp->detached));
822                 if (sdp->detached)
823                         return -ENODEV;
824                 write_lock_irq(&sfp->rq_list_lock);
825                 if (srp->done) {
826                         srp->done = 2;
827                         write_unlock_irq(&sfp->rq_list_lock);
828                         result = sg_new_read(sfp, p, SZ_SG_IO_HDR, srp);
829                         return (result < 0) ? result : 0;
830                 }
831                 srp->orphan = 1;
832                 write_unlock_irq(&sfp->rq_list_lock);
833                 return result;  /* -ERESTARTSYS because signal hit process */
834         case SG_SET_TIMEOUT:
835                 result = get_user(val, ip);
836                 if (result)
837                         return result;
838                 if (val < 0)
839                         return -EIO;
840                 if (val >= MULDIV (INT_MAX, USER_HZ, HZ))
841                     val = MULDIV (INT_MAX, USER_HZ, HZ);
842                 sfp->timeout_user = val;
843                 sfp->timeout = MULDIV (val, HZ, USER_HZ);
844
845                 return 0;
846         case SG_GET_TIMEOUT:    /* N.B. User receives timeout as return value */
847                                 /* strange ..., for backward compatibility */
848                 return sfp->timeout_user;
849         case SG_SET_FORCE_LOW_DMA:
850                 result = get_user(val, ip);
851                 if (result)
852                         return result;
853                 if (val) {
854                         sfp->low_dma = 1;
855                         if ((0 == sfp->low_dma) && (0 == sg_res_in_use(sfp))) {
856                                 val = (int) sfp->reserve.bufflen;
857                                 sg_remove_scat(&sfp->reserve);
858                                 sg_build_reserve(sfp, val);
859                         }
860                 } else {
861                         if (sdp->detached)
862                                 return -ENODEV;
863                         sfp->low_dma = sdp->device->host->unchecked_isa_dma;
864                 }
865                 return 0;
866         case SG_GET_LOW_DMA:
867                 return put_user((int) sfp->low_dma, ip);
868         case SG_GET_SCSI_ID:
869                 if (!access_ok(VERIFY_WRITE, p, sizeof (sg_scsi_id_t)))
870                         return -EFAULT;
871                 else {
872                         sg_scsi_id_t __user *sg_idp = p;
873
874                         if (sdp->detached)
875                                 return -ENODEV;
876                         __put_user((int) sdp->device->host->host_no,
877                                    &sg_idp->host_no);
878                         __put_user((int) sdp->device->channel,
879                                    &sg_idp->channel);
880                         __put_user((int) sdp->device->id, &sg_idp->scsi_id);
881                         __put_user((int) sdp->device->lun, &sg_idp->lun);
882                         __put_user((int) sdp->device->type, &sg_idp->scsi_type);
883                         __put_user((short) sdp->device->host->cmd_per_lun,
884                                    &sg_idp->h_cmd_per_lun);
885                         __put_user((short) sdp->device->queue_depth,
886                                    &sg_idp->d_queue_depth);
887                         __put_user(0, &sg_idp->unused[0]);
888                         __put_user(0, &sg_idp->unused[1]);
889                         return 0;
890                 }
891         case SG_SET_FORCE_PACK_ID:
892                 result = get_user(val, ip);
893                 if (result)
894                         return result;
895                 sfp->force_packid = val ? 1 : 0;
896                 return 0;
897         case SG_GET_PACK_ID:
898                 if (!access_ok(VERIFY_WRITE, ip, sizeof (int)))
899                         return -EFAULT;
900                 read_lock_irqsave(&sfp->rq_list_lock, iflags);
901                 for (srp = sfp->headrp; srp; srp = srp->nextrp) {
902                         if ((1 == srp->done) && (!srp->sg_io_owned)) {
903                                 read_unlock_irqrestore(&sfp->rq_list_lock,
904                                                        iflags);
905                                 __put_user(srp->header.pack_id, ip);
906                                 return 0;
907                         }
908                 }
909                 read_unlock_irqrestore(&sfp->rq_list_lock, iflags);
910                 __put_user(-1, ip);
911                 return 0;
912         case SG_GET_NUM_WAITING:
913                 read_lock_irqsave(&sfp->rq_list_lock, iflags);
914                 for (val = 0, srp = sfp->headrp; srp; srp = srp->nextrp) {
915                         if ((1 == srp->done) && (!srp->sg_io_owned))
916                                 ++val;
917                 }
918                 read_unlock_irqrestore(&sfp->rq_list_lock, iflags);
919                 return put_user(val, ip);
920         case SG_GET_SG_TABLESIZE:
921                 return put_user(sdp->sg_tablesize, ip);
922         case SG_SET_RESERVED_SIZE:
923                 result = get_user(val, ip);
924                 if (result)
925                         return result;
926                 if (val < 0)
927                         return -EINVAL;
928                 val = min_t(int, val,
929                             queue_max_sectors(sdp->device->request_queue) * 512);
930                 if (val != sfp->reserve.bufflen) {
931                         if (sg_res_in_use(sfp) || sfp->mmap_called)
932                                 return -EBUSY;
933                         sg_remove_scat(&sfp->reserve);
934                         sg_build_reserve(sfp, val);
935                 }
936                 return 0;
937         case SG_GET_RESERVED_SIZE:
938                 val = min_t(int, sfp->reserve.bufflen,
939                             queue_max_sectors(sdp->device->request_queue) * 512);
940                 return put_user(val, ip);
941         case SG_SET_COMMAND_Q:
942                 result = get_user(val, ip);
943                 if (result)
944                         return result;
945                 sfp->cmd_q = val ? 1 : 0;
946                 return 0;
947         case SG_GET_COMMAND_Q:
948                 return put_user((int) sfp->cmd_q, ip);
949         case SG_SET_KEEP_ORPHAN:
950                 result = get_user(val, ip);
951                 if (result)
952                         return result;
953                 sfp->keep_orphan = val;
954                 return 0;
955         case SG_GET_KEEP_ORPHAN:
956                 return put_user((int) sfp->keep_orphan, ip);
957         case SG_NEXT_CMD_LEN:
958                 result = get_user(val, ip);
959                 if (result)
960                         return result;
961                 sfp->next_cmd_len = (val > 0) ? val : 0;
962                 return 0;
963         case SG_GET_VERSION_NUM:
964                 return put_user(sg_version_num, ip);
965         case SG_GET_ACCESS_COUNT:
966                 /* faked - we don't have a real access count anymore */
967                 val = (sdp->device ? 1 : 0);
968                 return put_user(val, ip);
969         case SG_GET_REQUEST_TABLE:
970                 if (!access_ok(VERIFY_WRITE, p, SZ_SG_REQ_INFO * SG_MAX_QUEUE))
971                         return -EFAULT;
972                 else {
973                         sg_req_info_t *rinfo;
974                         unsigned int ms;
975
976                         rinfo = kmalloc(SZ_SG_REQ_INFO * SG_MAX_QUEUE,
977                                                                 GFP_KERNEL);
978                         if (!rinfo)
979                                 return -ENOMEM;
980                         read_lock_irqsave(&sfp->rq_list_lock, iflags);
981                         for (srp = sfp->headrp, val = 0; val < SG_MAX_QUEUE;
982                              ++val, srp = srp ? srp->nextrp : srp) {
983                                 memset(&rinfo[val], 0, SZ_SG_REQ_INFO);
984                                 if (srp) {
985                                         rinfo[val].req_state = srp->done + 1;
986                                         rinfo[val].problem =
987                                             srp->header.masked_status & 
988                                             srp->header.host_status & 
989                                             srp->header.driver_status;
990                                         if (srp->done)
991                                                 rinfo[val].duration =
992                                                         srp->header.duration;
993                                         else {
994                                                 ms = jiffies_to_msecs(jiffies);
995                                                 rinfo[val].duration =
996                                                     (ms > srp->header.duration) ?
997                                                     (ms - srp->header.duration) : 0;
998                                         }
999                                         rinfo[val].orphan = srp->orphan;
1000                                         rinfo[val].sg_io_owned =
1001                                                         srp->sg_io_owned;
1002                                         rinfo[val].pack_id =
1003                                                         srp->header.pack_id;
1004                                         rinfo[val].usr_ptr =
1005                                                         srp->header.usr_ptr;
1006                                 }
1007                         }
1008                         read_unlock_irqrestore(&sfp->rq_list_lock, iflags);
1009                         result = __copy_to_user(p, rinfo, 
1010                                                 SZ_SG_REQ_INFO * SG_MAX_QUEUE);
1011                         result = result ? -EFAULT : 0;
1012                         kfree(rinfo);
1013                         return result;
1014                 }
1015         case SG_EMULATED_HOST:
1016                 if (sdp->detached)
1017                         return -ENODEV;
1018                 return put_user(sdp->device->host->hostt->emulated, ip);
1019         case SG_SCSI_RESET:
1020                 if (sdp->detached)
1021                         return -ENODEV;
1022                 if (filp->f_flags & O_NONBLOCK) {
1023                         if (scsi_host_in_recovery(sdp->device->host))
1024                                 return -EBUSY;
1025                 } else if (!scsi_block_when_processing_errors(sdp->device))
1026                         return -EBUSY;
1027                 result = get_user(val, ip);
1028                 if (result)
1029                         return result;
1030                 if (SG_SCSI_RESET_NOTHING == val)
1031                         return 0;
1032                 switch (val) {
1033                 case SG_SCSI_RESET_DEVICE:
1034                         val = SCSI_TRY_RESET_DEVICE;
1035                         break;
1036                 case SG_SCSI_RESET_TARGET:
1037                         val = SCSI_TRY_RESET_TARGET;
1038                         break;
1039                 case SG_SCSI_RESET_BUS:
1040                         val = SCSI_TRY_RESET_BUS;
1041                         break;
1042                 case SG_SCSI_RESET_HOST:
1043                         val = SCSI_TRY_RESET_HOST;
1044                         break;
1045                 default:
1046                         return -EINVAL;
1047                 }
1048                 if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RAWIO))
1049                         return -EACCES;
1050                 return (scsi_reset_provider(sdp->device, val) ==
1051                         SUCCESS) ? 0 : -EIO;
1052         case SCSI_IOCTL_SEND_COMMAND:
1053                 if (sdp->detached)
1054                         return -ENODEV;
1055                 if (read_only) {
1056                         unsigned char opcode = WRITE_6;
1057                         Scsi_Ioctl_Command __user *siocp = p;
1058
1059                         if (copy_from_user(&opcode, siocp->data, 1))
1060                                 return -EFAULT;
1061                         if (sg_allow_access(filp, &opcode))
1062                                 return -EPERM;
1063                 }
1064                 return sg_scsi_ioctl(sdp->device->request_queue, NULL, filp->f_mode, p);
1065         case SG_SET_DEBUG:
1066                 result = get_user(val, ip);
1067                 if (result)
1068                         return result;
1069                 sdp->sgdebug = (char) val;
1070                 return 0;
1071         case SCSI_IOCTL_GET_IDLUN:
1072         case SCSI_IOCTL_GET_BUS_NUMBER:
1073         case SCSI_IOCTL_PROBE_HOST:
1074         case SG_GET_TRANSFORM:
1075                 if (sdp->detached)
1076                         return -ENODEV;
1077                 return scsi_ioctl(sdp->device, cmd_in, p);
1078         case BLKSECTGET:
1079                 return put_user(queue_max_sectors(sdp->device->request_queue) * 512,
1080                                 ip);
1081         case BLKTRACESETUP:
1082                 return blk_trace_setup(sdp->device->request_queue,
1083                                        sdp->disk->disk_name,
1084                                        MKDEV(SCSI_GENERIC_MAJOR, sdp->index),
1085                                        NULL,
1086                                        (char *)arg);
1087         case BLKTRACESTART:
1088                 return blk_trace_startstop(sdp->device->request_queue, 1);
1089         case BLKTRACESTOP:
1090                 return blk_trace_startstop(sdp->device->request_queue, 0);
1091         case BLKTRACETEARDOWN:
1092                 return blk_trace_remove(sdp->device->request_queue);
1093         default:
1094                 if (read_only)
1095                         return -EPERM;  /* don't know so take safe approach */
1096                 return scsi_ioctl(sdp->device, cmd_in, p);
1097         }
1098 }
1099
1100 #ifdef CONFIG_COMPAT
1101 static long sg_compat_ioctl(struct file *filp, unsigned int cmd_in, unsigned long arg)
1102 {
1103         Sg_device *sdp;
1104         Sg_fd *sfp;
1105         struct scsi_device *sdev;
1106
1107         if ((!(sfp = (Sg_fd *) filp->private_data)) || (!(sdp = sfp->parentdp)))
1108                 return -ENXIO;
1109
1110         sdev = sdp->device;
1111         if (sdev->host->hostt->compat_ioctl) { 
1112                 int ret;
1113
1114                 ret = sdev->host->hostt->compat_ioctl(sdev, cmd_in, (void __user *)arg);
1115
1116                 return ret;
1117         }
1118         
1119         return -ENOIOCTLCMD;
1120 }
1121 #endif
1122
1123 static unsigned int
1124 sg_poll(struct file *filp, poll_table * wait)
1125 {
1126         unsigned int res = 0;
1127         Sg_device *sdp;
1128         Sg_fd *sfp;
1129         Sg_request *srp;
1130         int count = 0;
1131         unsigned long iflags;
1132
1133         sfp = filp->private_data;
1134         if (!sfp)
1135                 return POLLERR;
1136         sdp = sfp->parentdp;
1137         if (!sdp)
1138                 return POLLERR;
1139         poll_wait(filp, &sfp->read_wait, wait);
1140         read_lock_irqsave(&sfp->rq_list_lock, iflags);
1141         for (srp = sfp->headrp; srp; srp = srp->nextrp) {
1142                 /* if any read waiting, flag it */
1143                 if ((0 == res) && (1 == srp->done) && (!srp->sg_io_owned))
1144                         res = POLLIN | POLLRDNORM;
1145                 ++count;
1146         }
1147         read_unlock_irqrestore(&sfp->rq_list_lock, iflags);
1148
1149         if (sdp->detached)
1150                 res |= POLLHUP;
1151         else if (!sfp->cmd_q) {
1152                 if (0 == count)
1153                         res |= POLLOUT | POLLWRNORM;
1154         } else if (count < SG_MAX_QUEUE)
1155                 res |= POLLOUT | POLLWRNORM;
1156         SCSI_LOG_TIMEOUT(3, printk("sg_poll: %s, res=0x%x\n",
1157                                    sdp->disk->disk_name, (int) res));
1158         return res;
1159 }
1160
1161 static int
1162 sg_fasync(int fd, struct file *filp, int mode)
1163 {
1164         Sg_device *sdp;
1165         Sg_fd *sfp;
1166
1167         if ((!(sfp = (Sg_fd *) filp->private_data)) || (!(sdp = sfp->parentdp)))
1168                 return -ENXIO;
1169         SCSI_LOG_TIMEOUT(3, printk("sg_fasync: %s, mode=%d\n",
1170                                    sdp->disk->disk_name, mode));
1171
1172         return fasync_helper(fd, filp, mode, &sfp->async_qp);
1173 }
1174
1175 static int
1176 sg_vma_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
1177 {
1178         Sg_fd *sfp;
1179         unsigned long offset, len, sa;
1180         Sg_scatter_hold *rsv_schp;
1181         int k, length;
1182
1183         if ((NULL == vma) || (!(sfp = (Sg_fd *) vma->vm_private_data)))
1184                 return VM_FAULT_SIGBUS;
1185         rsv_schp = &sfp->reserve;
1186         offset = vmf->pgoff << PAGE_SHIFT;
1187         if (offset >= rsv_schp->bufflen)
1188                 return VM_FAULT_SIGBUS;
1189         SCSI_LOG_TIMEOUT(3, printk("sg_vma_fault: offset=%lu, scatg=%d\n",
1190                                    offset, rsv_schp->k_use_sg));
1191         sa = vma->vm_start;
1192         length = 1 << (PAGE_SHIFT + rsv_schp->page_order);
1193         for (k = 0; k < rsv_schp->k_use_sg && sa < vma->vm_end; k++) {
1194                 len = vma->vm_end - sa;
1195                 len = (len < length) ? len : length;
1196                 if (offset < len) {
1197                         struct page *page = nth_page(rsv_schp->pages[k],
1198                                                      offset >> PAGE_SHIFT);
1199                         get_page(page); /* increment page count */
1200                         vmf->page = page;
1201                         return 0; /* success */
1202                 }
1203                 sa += len;
1204                 offset -= len;
1205         }
1206
1207         return VM_FAULT_SIGBUS;
1208 }
1209
1210 static const struct vm_operations_struct sg_mmap_vm_ops = {
1211         .fault = sg_vma_fault,
1212 };
1213
1214 static int
1215 sg_mmap(struct file *filp, struct vm_area_struct *vma)
1216 {
1217         Sg_fd *sfp;
1218         unsigned long req_sz, len, sa;
1219         Sg_scatter_hold *rsv_schp;
1220         int k, length;
1221
1222         if ((!filp) || (!vma) || (!(sfp = (Sg_fd *) filp->private_data)))
1223                 return -ENXIO;
1224         req_sz = vma->vm_end - vma->vm_start;
1225         SCSI_LOG_TIMEOUT(3, printk("sg_mmap starting, vm_start=%p, len=%d\n",
1226                                    (void *) vma->vm_start, (int) req_sz));
1227         if (vma->vm_pgoff)
1228                 return -EINVAL; /* want no offset */
1229         rsv_schp = &sfp->reserve;
1230         if (req_sz > rsv_schp->bufflen)
1231                 return -ENOMEM; /* cannot map more than reserved buffer */
1232
1233         sa = vma->vm_start;
1234         length = 1 << (PAGE_SHIFT + rsv_schp->page_order);
1235         for (k = 0; k < rsv_schp->k_use_sg && sa < vma->vm_end; k++) {
1236                 len = vma->vm_end - sa;
1237                 len = (len < length) ? len : length;
1238                 sa += len;
1239         }
1240
1241         sfp->mmap_called = 1;
1242         vma->vm_flags |= VM_DONTEXPAND | VM_DONTDUMP;
1243         vma->vm_private_data = sfp;
1244         vma->vm_ops = &sg_mmap_vm_ops;
1245         return 0;
1246 }
1247
1248 static void sg_rq_end_io_usercontext(struct work_struct *work)
1249 {
1250         struct sg_request *srp = container_of(work, struct sg_request, ew.work);
1251         struct sg_fd *sfp = srp->parentfp;
1252
1253         sg_finish_rem_req(srp);
1254         kref_put(&sfp->f_ref, sg_remove_sfp);
1255 }
1256
1257 /*
1258  * This function is a "bottom half" handler that is called by the mid
1259  * level when a command is completed (or has failed).
1260  */
1261 static void sg_rq_end_io(struct request *rq, int uptodate)
1262 {
1263         struct sg_request *srp = rq->end_io_data;
1264         Sg_device *sdp;
1265         Sg_fd *sfp;
1266         unsigned long iflags;
1267         unsigned int ms;
1268         char *sense;
1269         int result, resid, done = 1;
1270
1271         if (WARN_ON(srp->done != 0))
1272                 return;
1273
1274         sfp = srp->parentfp;
1275         if (WARN_ON(sfp == NULL))
1276                 return;
1277
1278         sdp = sfp->parentdp;
1279         if (unlikely(sdp->detached))
1280                 printk(KERN_INFO "sg_rq_end_io: device detached\n");
1281
1282         sense = rq->sense;
1283         result = rq->errors;
1284         resid = rq->resid_len;
1285
1286         SCSI_LOG_TIMEOUT(4, printk("sg_cmd_done: %s, pack_id=%d, res=0x%x\n",
1287                 sdp->disk->disk_name, srp->header.pack_id, result));
1288         srp->header.resid = resid;
1289         ms = jiffies_to_msecs(jiffies);
1290         srp->header.duration = (ms > srp->header.duration) ?
1291                                 (ms - srp->header.duration) : 0;
1292         if (0 != result) {
1293                 struct scsi_sense_hdr sshdr;
1294
1295                 srp->header.status = 0xff & result;
1296                 srp->header.masked_status = status_byte(result);
1297                 srp->header.msg_status = msg_byte(result);
1298                 srp->header.host_status = host_byte(result);
1299                 srp->header.driver_status = driver_byte(result);
1300                 if ((sdp->sgdebug > 0) &&
1301                     ((CHECK_CONDITION == srp->header.masked_status) ||
1302                      (COMMAND_TERMINATED == srp->header.masked_status)))
1303                         __scsi_print_sense("sg_cmd_done", sense,
1304                                            SCSI_SENSE_BUFFERSIZE);
1305
1306                 /* Following if statement is a patch supplied by Eric Youngdale */
1307                 if (driver_byte(result) != 0
1308                     && scsi_normalize_sense(sense, SCSI_SENSE_BUFFERSIZE, &sshdr)
1309                     && !scsi_sense_is_deferred(&sshdr)
1310                     && sshdr.sense_key == UNIT_ATTENTION
1311                     && sdp->device->removable) {
1312                         /* Detected possible disc change. Set the bit - this */
1313                         /* may be used if there are filesystems using this device */
1314                         sdp->device->changed = 1;
1315                 }
1316         }
1317         /* Rely on write phase to clean out srp status values, so no "else" */
1318
1319         write_lock_irqsave(&sfp->rq_list_lock, iflags);
1320         if (unlikely(srp->orphan)) {
1321                 if (sfp->keep_orphan)
1322                         srp->sg_io_owned = 0;
1323                 else
1324                         done = 0;
1325         }
1326         srp->done = done;
1327         write_unlock_irqrestore(&sfp->rq_list_lock, iflags);
1328
1329         if (likely(done)) {
1330                 /* Now wake up any sg_read() that is waiting for this
1331                  * packet.
1332                  */
1333                 wake_up_interruptible(&sfp->read_wait);
1334                 kill_fasync(&sfp->async_qp, SIGPOLL, POLL_IN);
1335                 kref_put(&sfp->f_ref, sg_remove_sfp);
1336         } else {
1337                 INIT_WORK(&srp->ew.work, sg_rq_end_io_usercontext);
1338                 schedule_work(&srp->ew.work);
1339         }
1340 }
1341
1342 static const struct file_operations sg_fops = {
1343         .owner = THIS_MODULE,
1344         .read = sg_read,
1345         .write = sg_write,
1346         .poll = sg_poll,
1347         .unlocked_ioctl = sg_ioctl,
1348 #ifdef CONFIG_COMPAT
1349         .compat_ioctl = sg_compat_ioctl,
1350 #endif
1351         .open = sg_open,
1352         .mmap = sg_mmap,
1353         .release = sg_release,
1354         .fasync = sg_fasync,
1355         .llseek = no_llseek,
1356 };
1357
1358 static struct class *sg_sysfs_class;
1359
1360 static int sg_sysfs_valid = 0;
1361
1362 static Sg_device *sg_alloc(struct gendisk *disk, struct scsi_device *scsidp)
1363 {
1364         struct request_queue *q = scsidp->request_queue;
1365         Sg_device *sdp;
1366         unsigned long iflags;
1367         int error;
1368         u32 k;
1369
1370         sdp = kzalloc(sizeof(Sg_device), GFP_KERNEL);
1371         if (!sdp) {
1372                 printk(KERN_WARNING "kmalloc Sg_device failure\n");
1373                 return ERR_PTR(-ENOMEM);
1374         }
1375
1376         idr_preload(GFP_KERNEL);
1377         write_lock_irqsave(&sg_index_lock, iflags);
1378
1379         error = idr_alloc(&sg_index_idr, sdp, 0, SG_MAX_DEVS, GFP_NOWAIT);
1380         if (error < 0) {
1381                 if (error == -ENOSPC) {
1382                         sdev_printk(KERN_WARNING, scsidp,
1383                                     "Unable to attach sg device type=%d, minor number exceeds %d\n",
1384                                     scsidp->type, SG_MAX_DEVS - 1);
1385                         error = -ENODEV;
1386                 } else {
1387                         printk(KERN_WARNING
1388                                "idr allocation Sg_device failure: %d\n", error);
1389                 }
1390                 goto out_unlock;
1391         }
1392         k = error;
1393
1394         SCSI_LOG_TIMEOUT(3, printk("sg_alloc: dev=%d \n", k));
1395         sprintf(disk->disk_name, "sg%d", k);
1396         disk->first_minor = k;
1397         sdp->disk = disk;
1398         sdp->device = scsidp;
1399         INIT_LIST_HEAD(&sdp->sfds);
1400         init_rwsem(&sdp->o_sem);
1401         sdp->sg_tablesize = queue_max_segments(q);
1402         sdp->index = k;
1403         kref_init(&sdp->d_ref);
1404         error = 0;
1405
1406 out_unlock:
1407         write_unlock_irqrestore(&sg_index_lock, iflags);
1408         idr_preload_end();
1409
1410         if (error) {
1411                 kfree(sdp);
1412                 return ERR_PTR(error);
1413         }
1414         return sdp;
1415 }
1416
1417 static int
1418 sg_add(struct device *cl_dev, struct class_interface *cl_intf)
1419 {
1420         struct scsi_device *scsidp = to_scsi_device(cl_dev->parent);
1421         struct gendisk *disk;
1422         Sg_device *sdp = NULL;
1423         struct cdev * cdev = NULL;
1424         int error;
1425         unsigned long iflags;
1426
1427         disk = alloc_disk(1);
1428         if (!disk) {
1429                 printk(KERN_WARNING "alloc_disk failed\n");
1430                 return -ENOMEM;
1431         }
1432         disk->major = SCSI_GENERIC_MAJOR;
1433
1434         error = -ENOMEM;
1435         cdev = cdev_alloc();
1436         if (!cdev) {
1437                 printk(KERN_WARNING "cdev_alloc failed\n");
1438                 goto out;
1439         }
1440         cdev->owner = THIS_MODULE;
1441         cdev->ops = &sg_fops;
1442
1443         sdp = sg_alloc(disk, scsidp);
1444         if (IS_ERR(sdp)) {
1445                 printk(KERN_WARNING "sg_alloc failed\n");
1446                 error = PTR_ERR(sdp);
1447                 goto out;
1448         }
1449
1450         error = cdev_add(cdev, MKDEV(SCSI_GENERIC_MAJOR, sdp->index), 1);
1451         if (error)
1452                 goto cdev_add_err;
1453
1454         sdp->cdev = cdev;
1455         if (sg_sysfs_valid) {
1456                 struct device *sg_class_member;
1457
1458                 sg_class_member = device_create(sg_sysfs_class, cl_dev->parent,
1459                                                 MKDEV(SCSI_GENERIC_MAJOR,
1460                                                       sdp->index),
1461                                                 sdp, "%s", disk->disk_name);
1462                 if (IS_ERR(sg_class_member)) {
1463                         printk(KERN_ERR "sg_add: "
1464                                "device_create failed\n");
1465                         error = PTR_ERR(sg_class_member);
1466                         goto cdev_add_err;
1467                 }
1468                 error = sysfs_create_link(&scsidp->sdev_gendev.kobj,
1469                                           &sg_class_member->kobj, "generic");
1470                 if (error)
1471                         printk(KERN_ERR "sg_add: unable to make symlink "
1472                                         "'generic' back to sg%d\n", sdp->index);
1473         } else
1474                 printk(KERN_WARNING "sg_add: sg_sys Invalid\n");
1475
1476         sdev_printk(KERN_NOTICE, scsidp,
1477                     "Attached scsi generic sg%d type %d\n", sdp->index,
1478                     scsidp->type);
1479
1480         dev_set_drvdata(cl_dev, sdp);
1481
1482         return 0;
1483
1484 cdev_add_err:
1485         write_lock_irqsave(&sg_index_lock, iflags);
1486         idr_remove(&sg_index_idr, sdp->index);
1487         write_unlock_irqrestore(&sg_index_lock, iflags);
1488         kfree(sdp);
1489
1490 out:
1491         put_disk(disk);
1492         if (cdev)
1493                 cdev_del(cdev);
1494         return error;
1495 }
1496
1497 static void sg_device_destroy(struct kref *kref)
1498 {
1499         struct sg_device *sdp = container_of(kref, struct sg_device, d_ref);
1500         unsigned long flags;
1501
1502         /* CAUTION!  Note that the device can still be found via idr_find()
1503          * even though the refcount is 0.  Therefore, do idr_remove() BEFORE
1504          * any other cleanup.
1505          */
1506
1507         write_lock_irqsave(&sg_index_lock, flags);
1508         idr_remove(&sg_index_idr, sdp->index);
1509         write_unlock_irqrestore(&sg_index_lock, flags);
1510
1511         SCSI_LOG_TIMEOUT(3,
1512                 printk("sg_device_destroy: %s\n",
1513                         sdp->disk->disk_name));
1514
1515         put_disk(sdp->disk);
1516         kfree(sdp);
1517 }
1518
1519 static void sg_remove(struct device *cl_dev, struct class_interface *cl_intf)
1520 {
1521         struct scsi_device *scsidp = to_scsi_device(cl_dev->parent);
1522         Sg_device *sdp = dev_get_drvdata(cl_dev);
1523         unsigned long iflags;
1524         Sg_fd *sfp;
1525
1526         if (!sdp || sdp->detached)
1527                 return;
1528
1529         SCSI_LOG_TIMEOUT(3, printk("sg_remove: %s\n", sdp->disk->disk_name));
1530
1531         /* Need a write lock to set sdp->detached. */
1532         write_lock_irqsave(&sg_index_lock, iflags);
1533         sdp->detached = 1;
1534         list_for_each_entry(sfp, &sdp->sfds, sfd_siblings) {
1535                 wake_up_interruptible(&sfp->read_wait);
1536                 kill_fasync(&sfp->async_qp, SIGPOLL, POLL_HUP);
1537         }
1538         write_unlock_irqrestore(&sg_index_lock, iflags);
1539
1540         sysfs_remove_link(&scsidp->sdev_gendev.kobj, "generic");
1541         device_destroy(sg_sysfs_class, MKDEV(SCSI_GENERIC_MAJOR, sdp->index));
1542         cdev_del(sdp->cdev);
1543         sdp->cdev = NULL;
1544
1545         sg_put_dev(sdp);
1546 }
1547
1548 module_param_named(scatter_elem_sz, scatter_elem_sz, int, S_IRUGO | S_IWUSR);
1549 module_param_named(def_reserved_size, def_reserved_size, int,
1550                    S_IRUGO | S_IWUSR);
1551 module_param_named(allow_dio, sg_allow_dio, int, S_IRUGO | S_IWUSR);
1552
1553 MODULE_AUTHOR("Douglas Gilbert");
1554 MODULE_DESCRIPTION("SCSI generic (sg) driver");
1555 MODULE_LICENSE("GPL");
1556 MODULE_VERSION(SG_VERSION_STR);
1557 MODULE_ALIAS_CHARDEV_MAJOR(SCSI_GENERIC_MAJOR);
1558
1559 MODULE_PARM_DESC(scatter_elem_sz, "scatter gather element "
1560                 "size (default: max(SG_SCATTER_SZ, PAGE_SIZE))");
1561 MODULE_PARM_DESC(def_reserved_size, "size of buffer reserved for each fd");
1562 MODULE_PARM_DESC(allow_dio, "allow direct I/O (default: 0 (disallow))");
1563
1564 static int __init
1565 init_sg(void)
1566 {
1567         int rc;
1568
1569         if (scatter_elem_sz < PAGE_SIZE) {
1570                 scatter_elem_sz = PAGE_SIZE;
1571                 scatter_elem_sz_prev = scatter_elem_sz;
1572         }
1573         if (def_reserved_size >= 0)
1574                 sg_big_buff = def_reserved_size;
1575         else
1576                 def_reserved_size = sg_big_buff;
1577
1578         rc = register_chrdev_region(MKDEV(SCSI_GENERIC_MAJOR, 0), 
1579                                     SG_MAX_DEVS, "sg");
1580         if (rc)
1581                 return rc;
1582         sg_sysfs_class = class_create(THIS_MODULE, "scsi_generic");
1583         if ( IS_ERR(sg_sysfs_class) ) {
1584                 rc = PTR_ERR(sg_sysfs_class);
1585                 goto err_out;
1586         }
1587         sg_sysfs_valid = 1;
1588         rc = scsi_register_interface(&sg_interface);
1589         if (0 == rc) {
1590 #ifdef CONFIG_SCSI_PROC_FS
1591                 sg_proc_init();
1592 #endif                          /* CONFIG_SCSI_PROC_FS */
1593                 return 0;
1594         }
1595         class_destroy(sg_sysfs_class);
1596 err_out:
1597         unregister_chrdev_region(MKDEV(SCSI_GENERIC_MAJOR, 0), SG_MAX_DEVS);
1598         return rc;
1599 }
1600
1601 static void __exit
1602 exit_sg(void)
1603 {
1604 #ifdef CONFIG_SCSI_PROC_FS
1605         sg_proc_cleanup();
1606 #endif                          /* CONFIG_SCSI_PROC_FS */
1607         scsi_unregister_interface(&sg_interface);
1608         class_destroy(sg_sysfs_class);
1609         sg_sysfs_valid = 0;
1610         unregister_chrdev_region(MKDEV(SCSI_GENERIC_MAJOR, 0),
1611                                  SG_MAX_DEVS);
1612         idr_destroy(&sg_index_idr);
1613 }
1614
1615 static int sg_start_req(Sg_request *srp, unsigned char *cmd)
1616 {
1617         int res;
1618         struct request *rq;
1619         Sg_fd *sfp = srp->parentfp;
1620         sg_io_hdr_t *hp = &srp->header;
1621         int dxfer_len = (int) hp->dxfer_len;
1622         int dxfer_dir = hp->dxfer_direction;
1623         unsigned int iov_count = hp->iovec_count;
1624         Sg_scatter_hold *req_schp = &srp->data;
1625         Sg_scatter_hold *rsv_schp = &sfp->reserve;
1626         struct request_queue *q = sfp->parentdp->device->request_queue;
1627         struct rq_map_data *md, map_data;
1628         int rw = hp->dxfer_direction == SG_DXFER_TO_DEV ? WRITE : READ;
1629
1630         SCSI_LOG_TIMEOUT(4, printk(KERN_INFO "sg_start_req: dxfer_len=%d\n",
1631                                    dxfer_len));
1632
1633         rq = blk_get_request(q, rw, GFP_ATOMIC);
1634         if (!rq)
1635                 return -ENOMEM;
1636
1637         memcpy(rq->cmd, cmd, hp->cmd_len);
1638
1639         rq->cmd_len = hp->cmd_len;
1640         rq->cmd_type = REQ_TYPE_BLOCK_PC;
1641
1642         srp->rq = rq;
1643         rq->end_io_data = srp;
1644         rq->sense = srp->sense_b;
1645         rq->retries = SG_DEFAULT_RETRIES;
1646
1647         if ((dxfer_len <= 0) || (dxfer_dir == SG_DXFER_NONE))
1648                 return 0;
1649
1650         if (sg_allow_dio && hp->flags & SG_FLAG_DIRECT_IO &&
1651             dxfer_dir != SG_DXFER_UNKNOWN && !iov_count &&
1652             !sfp->parentdp->device->host->unchecked_isa_dma &&
1653             blk_rq_aligned(q, (unsigned long)hp->dxferp, dxfer_len))
1654                 md = NULL;
1655         else
1656                 md = &map_data;
1657
1658         if (md) {
1659                 if (!sg_res_in_use(sfp) && dxfer_len <= rsv_schp->bufflen)
1660                         sg_link_reserve(sfp, srp, dxfer_len);
1661                 else {
1662                         res = sg_build_indirect(req_schp, sfp, dxfer_len);
1663                         if (res)
1664                                 return res;
1665                 }
1666
1667                 md->pages = req_schp->pages;
1668                 md->page_order = req_schp->page_order;
1669                 md->nr_entries = req_schp->k_use_sg;
1670                 md->offset = 0;
1671                 md->null_mapped = hp->dxferp ? 0 : 1;
1672                 if (dxfer_dir == SG_DXFER_TO_FROM_DEV)
1673                         md->from_user = 1;
1674                 else
1675                         md->from_user = 0;
1676         }
1677
1678         if (iov_count) {
1679                 int len, size = sizeof(struct sg_iovec) * iov_count;
1680                 struct iovec *iov;
1681
1682                 iov = memdup_user(hp->dxferp, size);
1683                 if (IS_ERR(iov))
1684                         return PTR_ERR(iov);
1685
1686                 len = iov_length(iov, iov_count);
1687                 if (hp->dxfer_len < len) {
1688                         iov_count = iov_shorten(iov, iov_count, hp->dxfer_len);
1689                         len = hp->dxfer_len;
1690                 }
1691
1692                 res = blk_rq_map_user_iov(q, rq, md, (struct sg_iovec *)iov,
1693                                           iov_count,
1694                                           len, GFP_ATOMIC);
1695                 kfree(iov);
1696         } else
1697                 res = blk_rq_map_user(q, rq, md, hp->dxferp,
1698                                       hp->dxfer_len, GFP_ATOMIC);
1699
1700         if (!res) {
1701                 srp->bio = rq->bio;
1702
1703                 if (!md) {
1704                         req_schp->dio_in_use = 1;
1705                         hp->info |= SG_INFO_DIRECT_IO;
1706                 }
1707         }
1708         return res;
1709 }
1710
1711 static int sg_finish_rem_req(Sg_request * srp)
1712 {
1713         int ret = 0;
1714
1715         Sg_fd *sfp = srp->parentfp;
1716         Sg_scatter_hold *req_schp = &srp->data;
1717
1718         SCSI_LOG_TIMEOUT(4, printk("sg_finish_rem_req: res_used=%d\n", (int) srp->res_used));
1719         if (srp->rq) {
1720                 if (srp->bio)
1721                         ret = blk_rq_unmap_user(srp->bio);
1722
1723                 blk_put_request(srp->rq);
1724         }
1725
1726         if (srp->res_used)
1727                 sg_unlink_reserve(sfp, srp);
1728         else
1729                 sg_remove_scat(req_schp);
1730
1731         sg_remove_request(sfp, srp);
1732
1733         return ret;
1734 }
1735
1736 static int
1737 sg_build_sgat(Sg_scatter_hold * schp, const Sg_fd * sfp, int tablesize)
1738 {
1739         int sg_bufflen = tablesize * sizeof(struct page *);
1740         gfp_t gfp_flags = GFP_ATOMIC | __GFP_NOWARN;
1741
1742         schp->pages = kzalloc(sg_bufflen, gfp_flags);
1743         if (!schp->pages)
1744                 return -ENOMEM;
1745         schp->sglist_len = sg_bufflen;
1746         return tablesize;       /* number of scat_gath elements allocated */
1747 }
1748
1749 static int
1750 sg_build_indirect(Sg_scatter_hold * schp, Sg_fd * sfp, int buff_size)
1751 {
1752         int ret_sz = 0, i, k, rem_sz, num, mx_sc_elems;
1753         int sg_tablesize = sfp->parentdp->sg_tablesize;
1754         int blk_size = buff_size, order;
1755         gfp_t gfp_mask = GFP_ATOMIC | __GFP_COMP | __GFP_NOWARN;
1756
1757         if (blk_size < 0)
1758                 return -EFAULT;
1759         if (0 == blk_size)
1760                 ++blk_size;     /* don't know why */
1761         /* round request up to next highest SG_SECTOR_SZ byte boundary */
1762         blk_size = ALIGN(blk_size, SG_SECTOR_SZ);
1763         SCSI_LOG_TIMEOUT(4, printk("sg_build_indirect: buff_size=%d, blk_size=%d\n",
1764                                    buff_size, blk_size));
1765
1766         /* N.B. ret_sz carried into this block ... */
1767         mx_sc_elems = sg_build_sgat(schp, sfp, sg_tablesize);
1768         if (mx_sc_elems < 0)
1769                 return mx_sc_elems;     /* most likely -ENOMEM */
1770
1771         num = scatter_elem_sz;
1772         if (unlikely(num != scatter_elem_sz_prev)) {
1773                 if (num < PAGE_SIZE) {
1774                         scatter_elem_sz = PAGE_SIZE;
1775                         scatter_elem_sz_prev = PAGE_SIZE;
1776                 } else
1777                         scatter_elem_sz_prev = num;
1778         }
1779
1780         if (sfp->low_dma)
1781                 gfp_mask |= GFP_DMA;
1782
1783         if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RAWIO))
1784                 gfp_mask |= __GFP_ZERO;
1785
1786         order = get_order(num);
1787 retry:
1788         ret_sz = 1 << (PAGE_SHIFT + order);
1789
1790         for (k = 0, rem_sz = blk_size; rem_sz > 0 && k < mx_sc_elems;
1791              k++, rem_sz -= ret_sz) {
1792
1793                 num = (rem_sz > scatter_elem_sz_prev) ?
1794                         scatter_elem_sz_prev : rem_sz;
1795
1796                 schp->pages[k] = alloc_pages(gfp_mask, order);
1797                 if (!schp->pages[k])
1798                         goto out;
1799
1800                 if (num == scatter_elem_sz_prev) {
1801                         if (unlikely(ret_sz > scatter_elem_sz_prev)) {
1802                                 scatter_elem_sz = ret_sz;
1803                                 scatter_elem_sz_prev = ret_sz;
1804                         }
1805                 }
1806
1807                 SCSI_LOG_TIMEOUT(5, printk("sg_build_indirect: k=%d, num=%d, "
1808                                  "ret_sz=%d\n", k, num, ret_sz));
1809         }               /* end of for loop */
1810
1811         schp->page_order = order;
1812         schp->k_use_sg = k;
1813         SCSI_LOG_TIMEOUT(5, printk("sg_build_indirect: k_use_sg=%d, "
1814                          "rem_sz=%d\n", k, rem_sz));
1815
1816         schp->bufflen = blk_size;
1817         if (rem_sz > 0) /* must have failed */
1818                 return -ENOMEM;
1819         return 0;
1820 out:
1821         for (i = 0; i < k; i++)
1822                 __free_pages(schp->pages[i], order);
1823
1824         if (--order >= 0)
1825                 goto retry;
1826
1827         return -ENOMEM;
1828 }
1829
1830 static void
1831 sg_remove_scat(Sg_scatter_hold * schp)
1832 {
1833         SCSI_LOG_TIMEOUT(4, printk("sg_remove_scat: k_use_sg=%d\n", schp->k_use_sg));
1834         if (schp->pages && schp->sglist_len > 0) {
1835                 if (!schp->dio_in_use) {
1836                         int k;
1837
1838                         for (k = 0; k < schp->k_use_sg && schp->pages[k]; k++) {
1839                                 SCSI_LOG_TIMEOUT(5, printk(
1840                                     "sg_remove_scat: k=%d, pg=0x%p\n",
1841                                     k, schp->pages[k]));
1842                                 __free_pages(schp->pages[k], schp->page_order);
1843                         }
1844
1845                         kfree(schp->pages);
1846                 }
1847         }
1848         memset(schp, 0, sizeof (*schp));
1849 }
1850
1851 static int
1852 sg_read_oxfer(Sg_request * srp, char __user *outp, int num_read_xfer)
1853 {
1854         Sg_scatter_hold *schp = &srp->data;
1855         int k, num;
1856
1857         SCSI_LOG_TIMEOUT(4, printk("sg_read_oxfer: num_read_xfer=%d\n",
1858                                    num_read_xfer));
1859         if ((!outp) || (num_read_xfer <= 0))
1860                 return 0;
1861
1862         num = 1 << (PAGE_SHIFT + schp->page_order);
1863         for (k = 0; k < schp->k_use_sg && schp->pages[k]; k++) {
1864                 if (num > num_read_xfer) {
1865                         if (__copy_to_user(outp, page_address(schp->pages[k]),
1866                                            num_read_xfer))
1867                                 return -EFAULT;
1868                         break;
1869                 } else {
1870                         if (__copy_to_user(outp, page_address(schp->pages[k]),
1871                                            num))
1872                                 return -EFAULT;
1873                         num_read_xfer -= num;
1874                         if (num_read_xfer <= 0)
1875                                 break;
1876                         outp += num;
1877                 }
1878         }
1879
1880         return 0;
1881 }
1882
1883 static void
1884 sg_build_reserve(Sg_fd * sfp, int req_size)
1885 {
1886         Sg_scatter_hold *schp = &sfp->reserve;
1887
1888         SCSI_LOG_TIMEOUT(4, printk("sg_build_reserve: req_size=%d\n", req_size));
1889         do {
1890                 if (req_size < PAGE_SIZE)
1891                         req_size = PAGE_SIZE;
1892                 if (0 == sg_build_indirect(schp, sfp, req_size))
1893                         return;
1894                 else
1895                         sg_remove_scat(schp);
1896                 req_size >>= 1; /* divide by 2 */
1897         } while (req_size > (PAGE_SIZE / 2));
1898 }
1899
1900 static void
1901 sg_link_reserve(Sg_fd * sfp, Sg_request * srp, int size)
1902 {
1903         Sg_scatter_hold *req_schp = &srp->data;
1904         Sg_scatter_hold *rsv_schp = &sfp->reserve;
1905         int k, num, rem;
1906
1907         srp->res_used = 1;
1908         SCSI_LOG_TIMEOUT(4, printk("sg_link_reserve: size=%d\n", size));
1909         rem = size;
1910
1911         num = 1 << (PAGE_SHIFT + rsv_schp->page_order);
1912         for (k = 0; k < rsv_schp->k_use_sg; k++) {
1913                 if (rem <= num) {
1914                         req_schp->k_use_sg = k + 1;
1915                         req_schp->sglist_len = rsv_schp->sglist_len;
1916                         req_schp->pages = rsv_schp->pages;
1917
1918                         req_schp->bufflen = size;
1919                         req_schp->page_order = rsv_schp->page_order;
1920                         break;
1921                 } else
1922                         rem -= num;
1923         }
1924
1925         if (k >= rsv_schp->k_use_sg)
1926                 SCSI_LOG_TIMEOUT(1, printk("sg_link_reserve: BAD size\n"));
1927 }
1928
1929 static void
1930 sg_unlink_reserve(Sg_fd * sfp, Sg_request * srp)
1931 {
1932         Sg_scatter_hold *req_schp = &srp->data;
1933
1934         SCSI_LOG_TIMEOUT(4, printk("sg_unlink_reserve: req->k_use_sg=%d\n",
1935                                    (int) req_schp->k_use_sg));
1936         req_schp->k_use_sg = 0;
1937         req_schp->bufflen = 0;
1938         req_schp->pages = NULL;
1939         req_schp->page_order = 0;
1940         req_schp->sglist_len = 0;
1941         sfp->save_scat_len = 0;
1942         srp->res_used = 0;
1943 }
1944
1945 static Sg_request *
1946 sg_get_rq_mark(Sg_fd * sfp, int pack_id)
1947 {
1948         Sg_request *resp;
1949         unsigned long iflags;
1950
1951         write_lock_irqsave(&sfp->rq_list_lock, iflags);
1952         for (resp = sfp->headrp; resp; resp = resp->nextrp) {
1953                 /* look for requests that are ready + not SG_IO owned */
1954                 if ((1 == resp->done) && (!resp->sg_io_owned) &&
1955                     ((-1 == pack_id) || (resp->header.pack_id == pack_id))) {
1956                         resp->done = 2; /* guard against other readers */
1957                         break;
1958                 }
1959         }
1960         write_unlock_irqrestore(&sfp->rq_list_lock, iflags);
1961         return resp;
1962 }
1963
1964 /* always adds to end of list */
1965 static Sg_request *
1966 sg_add_request(Sg_fd * sfp)
1967 {
1968         int k;
1969         unsigned long iflags;
1970         Sg_request *resp;
1971         Sg_request *rp = sfp->req_arr;
1972
1973         write_lock_irqsave(&sfp->rq_list_lock, iflags);
1974         resp = sfp->headrp;
1975         if (!resp) {
1976                 memset(rp, 0, sizeof (Sg_request));
1977                 rp->parentfp = sfp;
1978                 resp = rp;
1979                 sfp->headrp = resp;
1980         } else {
1981                 if (0 == sfp->cmd_q)
1982                         resp = NULL;    /* command queuing disallowed */
1983                 else {
1984                         for (k = 0; k < SG_MAX_QUEUE; ++k, ++rp) {
1985                                 if (!rp->parentfp)
1986                                         break;
1987                         }
1988                         if (k < SG_MAX_QUEUE) {
1989                                 memset(rp, 0, sizeof (Sg_request));
1990                                 rp->parentfp = sfp;
1991                                 while (resp->nextrp)
1992                                         resp = resp->nextrp;
1993                                 resp->nextrp = rp;
1994                                 resp = rp;
1995                         } else
1996                                 resp = NULL;
1997                 }
1998         }
1999         if (resp) {
2000                 resp->nextrp = NULL;
2001                 resp->header.duration = jiffies_to_msecs(jiffies);
2002         }
2003         write_unlock_irqrestore(&sfp->rq_list_lock, iflags);
2004         return resp;
2005 }
2006
2007 /* Return of 1 for found; 0 for not found */
2008 static int
2009 sg_remove_request(Sg_fd * sfp, Sg_request * srp)
2010 {
2011         Sg_request *prev_rp;
2012         Sg_request *rp;
2013         unsigned long iflags;
2014         int res = 0;
2015
2016         if ((!sfp) || (!srp) || (!sfp->headrp))
2017                 return res;
2018         write_lock_irqsave(&sfp->rq_list_lock, iflags);
2019         prev_rp = sfp->headrp;
2020         if (srp == prev_rp) {
2021                 sfp->headrp = prev_rp->nextrp;
2022                 prev_rp->parentfp = NULL;
2023                 res = 1;
2024         } else {
2025                 while ((rp = prev_rp->nextrp)) {
2026                         if (srp == rp) {
2027                                 prev_rp->nextrp = rp->nextrp;
2028                                 rp->parentfp = NULL;
2029                                 res = 1;
2030                                 break;
2031                         }
2032                         prev_rp = rp;
2033                 }
2034         }
2035         write_unlock_irqrestore(&sfp->rq_list_lock, iflags);
2036         return res;
2037 }
2038
2039 static Sg_fd *
2040 sg_add_sfp(Sg_device * sdp, int dev)
2041 {
2042         Sg_fd *sfp;
2043         unsigned long iflags;
2044         int bufflen;
2045
2046         sfp = kzalloc(sizeof(*sfp), GFP_ATOMIC | __GFP_NOWARN);
2047         if (!sfp)
2048                 return NULL;
2049
2050         init_waitqueue_head(&sfp->read_wait);
2051         rwlock_init(&sfp->rq_list_lock);
2052
2053         kref_init(&sfp->f_ref);
2054         sfp->timeout = SG_DEFAULT_TIMEOUT;
2055         sfp->timeout_user = SG_DEFAULT_TIMEOUT_USER;
2056         sfp->force_packid = SG_DEF_FORCE_PACK_ID;
2057         sfp->low_dma = (SG_DEF_FORCE_LOW_DMA == 0) ?
2058             sdp->device->host->unchecked_isa_dma : 1;
2059         sfp->cmd_q = SG_DEF_COMMAND_Q;
2060         sfp->keep_orphan = SG_DEF_KEEP_ORPHAN;
2061         sfp->parentdp = sdp;
2062         write_lock_irqsave(&sg_index_lock, iflags);
2063         list_add_tail(&sfp->sfd_siblings, &sdp->sfds);
2064         write_unlock_irqrestore(&sg_index_lock, iflags);
2065         SCSI_LOG_TIMEOUT(3, printk("sg_add_sfp: sfp=0x%p\n", sfp));
2066         if (unlikely(sg_big_buff != def_reserved_size))
2067                 sg_big_buff = def_reserved_size;
2068
2069         bufflen = min_t(int, sg_big_buff,
2070                         queue_max_sectors(sdp->device->request_queue) * 512);
2071         sg_build_reserve(sfp, bufflen);
2072         SCSI_LOG_TIMEOUT(3, printk("sg_add_sfp:   bufflen=%d, k_use_sg=%d\n",
2073                            sfp->reserve.bufflen, sfp->reserve.k_use_sg));
2074
2075         kref_get(&sdp->d_ref);
2076         __module_get(THIS_MODULE);
2077         return sfp;
2078 }
2079
2080 static void sg_remove_sfp_usercontext(struct work_struct *work)
2081 {
2082         struct sg_fd *sfp = container_of(work, struct sg_fd, ew.work);
2083         struct sg_device *sdp = sfp->parentdp;
2084
2085         /* Cleanup any responses which were never read(). */
2086         while (sfp->headrp)
2087                 sg_finish_rem_req(sfp->headrp);
2088
2089         if (sfp->reserve.bufflen > 0) {
2090                 SCSI_LOG_TIMEOUT(6,
2091                         printk("sg_remove_sfp:    bufflen=%d, k_use_sg=%d\n",
2092                                 (int) sfp->reserve.bufflen,
2093                                 (int) sfp->reserve.k_use_sg));
2094                 sg_remove_scat(&sfp->reserve);
2095         }
2096
2097         SCSI_LOG_TIMEOUT(6,
2098                 printk("sg_remove_sfp: %s, sfp=0x%p\n",
2099                         sdp->disk->disk_name,
2100                         sfp));
2101         kfree(sfp);
2102
2103         scsi_device_put(sdp->device);
2104         sg_put_dev(sdp);
2105         module_put(THIS_MODULE);
2106 }
2107
2108 static void sg_remove_sfp(struct kref *kref)
2109 {
2110         struct sg_fd *sfp = container_of(kref, struct sg_fd, f_ref);
2111         unsigned long iflags;
2112
2113         write_lock_irqsave(&sg_index_lock, iflags);
2114         list_del(&sfp->sfd_siblings);
2115         write_unlock_irqrestore(&sg_index_lock, iflags);
2116
2117         INIT_WORK(&sfp->ew.work, sg_remove_sfp_usercontext);
2118         schedule_work(&sfp->ew.work);
2119 }
2120
2121 static int
2122 sg_res_in_use(Sg_fd * sfp)
2123 {
2124         const Sg_request *srp;
2125         unsigned long iflags;
2126
2127         read_lock_irqsave(&sfp->rq_list_lock, iflags);
2128         for (srp = sfp->headrp; srp; srp = srp->nextrp)
2129                 if (srp->res_used)
2130                         break;
2131         read_unlock_irqrestore(&sfp->rq_list_lock, iflags);
2132         return srp ? 1 : 0;
2133 }
2134
2135 #ifdef CONFIG_SCSI_PROC_FS
2136 static int
2137 sg_idr_max_id(int id, void *p, void *data)
2138 {
2139         int *k = data;
2140
2141         if (*k < id)
2142                 *k = id;
2143
2144         return 0;
2145 }
2146
2147 static int
2148 sg_last_dev(void)
2149 {
2150         int k = -1;
2151         unsigned long iflags;
2152
2153         read_lock_irqsave(&sg_index_lock, iflags);
2154         idr_for_each(&sg_index_idr, sg_idr_max_id, &k);
2155         read_unlock_irqrestore(&sg_index_lock, iflags);
2156         return k + 1;           /* origin 1 */
2157 }
2158 #endif
2159
2160 /* must be called with sg_index_lock held */
2161 static Sg_device *sg_lookup_dev(int dev)
2162 {
2163         return idr_find(&sg_index_idr, dev);
2164 }
2165
2166 static Sg_device *sg_get_dev(int dev)
2167 {
2168         struct sg_device *sdp;
2169         unsigned long flags;
2170
2171         read_lock_irqsave(&sg_index_lock, flags);
2172         sdp = sg_lookup_dev(dev);
2173         if (!sdp)
2174                 sdp = ERR_PTR(-ENXIO);
2175         else if (sdp->detached) {
2176                 /* If sdp->detached, then the refcount may already be 0, in
2177                  * which case it would be a bug to do kref_get().
2178                  */
2179                 sdp = ERR_PTR(-ENODEV);
2180         } else
2181                 kref_get(&sdp->d_ref);
2182         read_unlock_irqrestore(&sg_index_lock, flags);
2183
2184         return sdp;
2185 }
2186
2187 static void sg_put_dev(struct sg_device *sdp)
2188 {
2189         kref_put(&sdp->d_ref, sg_device_destroy);
2190 }
2191
2192 #ifdef CONFIG_SCSI_PROC_FS
2193
2194 static struct proc_dir_entry *sg_proc_sgp = NULL;
2195
2196 static char sg_proc_sg_dirname[] = "scsi/sg";
2197
2198 static int sg_proc_seq_show_int(struct seq_file *s, void *v);
2199
2200 static int sg_proc_single_open_adio(struct inode *inode, struct file *file);
2201 static ssize_t sg_proc_write_adio(struct file *filp, const char __user *buffer,
2202                                   size_t count, loff_t *off);
2203 static const struct file_operations adio_fops = {
2204         .owner = THIS_MODULE,
2205         .open = sg_proc_single_open_adio,
2206         .read = seq_read,
2207         .llseek = seq_lseek,
2208         .write = sg_proc_write_adio,
2209         .release = single_release,
2210 };
2211
2212 static int sg_proc_single_open_dressz(struct inode *inode, struct file *file);
2213 static ssize_t sg_proc_write_dressz(struct file *filp, 
2214                 const char __user *buffer, size_t count, loff_t *off);
2215 static const struct file_operations dressz_fops = {
2216         .owner = THIS_MODULE,
2217         .open = sg_proc_single_open_dressz,
2218         .read = seq_read,
2219         .llseek = seq_lseek,
2220         .write = sg_proc_write_dressz,
2221         .release = single_release,
2222 };
2223
2224 static int sg_proc_seq_show_version(struct seq_file *s, void *v);
2225 static int sg_proc_single_open_version(struct inode *inode, struct file *file);
2226 static const struct file_operations version_fops = {
2227         .owner = THIS_MODULE,
2228         .open = sg_proc_single_open_version,
2229         .read = seq_read,
2230         .llseek = seq_lseek,
2231         .release = single_release,
2232 };
2233
2234 static int sg_proc_seq_show_devhdr(struct seq_file *s, void *v);
2235 static int sg_proc_single_open_devhdr(struct inode *inode, struct file *file);
2236 static const struct file_operations devhdr_fops = {
2237         .owner = THIS_MODULE,
2238         .open = sg_proc_single_open_devhdr,
2239         .read = seq_read,
2240         .llseek = seq_lseek,
2241         .release = single_release,
2242 };
2243
2244 static int sg_proc_seq_show_dev(struct seq_file *s, void *v);
2245 static int sg_proc_open_dev(struct inode *inode, struct file *file);
2246 static void * dev_seq_start(struct seq_file *s, loff_t *pos);
2247 static void * dev_seq_next(struct seq_file *s, void *v, loff_t *pos);
2248 static void dev_seq_stop(struct seq_file *s, void *v);
2249 static const struct file_operations dev_fops = {
2250         .owner = THIS_MODULE,
2251         .open = sg_proc_open_dev,
2252         .read = seq_read,
2253         .llseek = seq_lseek,
2254         .release = seq_release,
2255 };
2256 static const struct seq_operations dev_seq_ops = {
2257         .start = dev_seq_start,
2258         .next  = dev_seq_next,
2259         .stop  = dev_seq_stop,
2260         .show  = sg_proc_seq_show_dev,
2261 };
2262
2263 static int sg_proc_seq_show_devstrs(struct seq_file *s, void *v);
2264 static int sg_proc_open_devstrs(struct inode *inode, struct file *file);
2265 static const struct file_operations devstrs_fops = {
2266         .owner = THIS_MODULE,
2267         .open = sg_proc_open_devstrs,
2268         .read = seq_read,
2269         .llseek = seq_lseek,
2270         .release = seq_release,
2271 };
2272 static const struct seq_operations devstrs_seq_ops = {
2273         .start = dev_seq_start,
2274         .next  = dev_seq_next,
2275         .stop  = dev_seq_stop,
2276         .show  = sg_proc_seq_show_devstrs,
2277 };
2278
2279 static int sg_proc_seq_show_debug(struct seq_file *s, void *v);
2280 static int sg_proc_open_debug(struct inode *inode, struct file *file);
2281 static const struct file_operations debug_fops = {
2282         .owner = THIS_MODULE,
2283         .open = sg_proc_open_debug,
2284         .read = seq_read,
2285         .llseek = seq_lseek,
2286         .release = seq_release,
2287 };
2288 static const struct seq_operations debug_seq_ops = {
2289         .start = dev_seq_start,
2290         .next  = dev_seq_next,
2291         .stop  = dev_seq_stop,
2292         .show  = sg_proc_seq_show_debug,
2293 };
2294
2295
2296 struct sg_proc_leaf {
2297         const char * name;
2298         const struct file_operations * fops;
2299 };
2300
2301 static const struct sg_proc_leaf sg_proc_leaf_arr[] = {
2302         {"allow_dio", &adio_fops},
2303         {"debug", &debug_fops},
2304         {"def_reserved_size", &dressz_fops},
2305         {"device_hdr", &devhdr_fops},
2306         {"devices", &dev_fops},
2307         {"device_strs", &devstrs_fops},
2308         {"version", &version_fops}
2309 };
2310
2311 static int
2312 sg_proc_init(void)
2313 {
2314         int num_leaves = ARRAY_SIZE(sg_proc_leaf_arr);
2315         int k;
2316
2317         sg_proc_sgp = proc_mkdir(sg_proc_sg_dirname, NULL);
2318         if (!sg_proc_sgp)
2319                 return 1;
2320         for (k = 0; k < num_leaves; ++k) {
2321                 const struct sg_proc_leaf *leaf = &sg_proc_leaf_arr[k];
2322                 umode_t mask = leaf->fops->write ? S_IRUGO | S_IWUSR : S_IRUGO;
2323                 proc_create(leaf->name, mask, sg_proc_sgp, leaf->fops);
2324         }
2325         return 0;
2326 }
2327
2328 static void
2329 sg_proc_cleanup(void)
2330 {
2331         int k;
2332         int num_leaves = ARRAY_SIZE(sg_proc_leaf_arr);
2333
2334         if (!sg_proc_sgp)
2335                 return;
2336         for (k = 0; k < num_leaves; ++k)
2337                 remove_proc_entry(sg_proc_leaf_arr[k].name, sg_proc_sgp);
2338         remove_proc_entry(sg_proc_sg_dirname, NULL);
2339 }
2340
2341
2342 static int sg_proc_seq_show_int(struct seq_file *s, void *v)
2343 {
2344         seq_printf(s, "%d\n", *((int *)s->private));
2345         return 0;
2346 }
2347
2348 static int sg_proc_single_open_adio(struct inode *inode, struct file *file)
2349 {
2350         return single_open(file, sg_proc_seq_show_int, &sg_allow_dio);
2351 }
2352
2353 static ssize_t 
2354 sg_proc_write_adio(struct file *filp, const char __user *buffer,
2355                    size_t count, loff_t *off)
2356 {
2357         int err;
2358         unsigned long num;
2359
2360         if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RAWIO))
2361                 return -EACCES;
2362         err = kstrtoul_from_user(buffer, count, 0, &num);
2363         if (err)
2364                 return err;
2365         sg_allow_dio = num ? 1 : 0;
2366         return count;
2367 }
2368
2369 static int sg_proc_single_open_dressz(struct inode *inode, struct file *file)
2370 {
2371         return single_open(file, sg_proc_seq_show_int, &sg_big_buff);
2372 }
2373
2374 static ssize_t 
2375 sg_proc_write_dressz(struct file *filp, const char __user *buffer,
2376                      size_t count, loff_t *off)
2377 {
2378         int err;
2379         unsigned long k = ULONG_MAX;
2380
2381         if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RAWIO))
2382                 return -EACCES;
2383
2384         err = kstrtoul_from_user(buffer, count, 0, &k);
2385         if (err)
2386                 return err;
2387         if (k <= 1048576) {     /* limit "big buff" to 1 MB */
2388                 sg_big_buff = k;
2389                 return count;
2390         }
2391         return -ERANGE;
2392 }
2393
2394 static int sg_proc_seq_show_version(struct seq_file *s, void *v)
2395 {
2396         seq_printf(s, "%d\t%s [%s]\n", sg_version_num, SG_VERSION_STR,
2397                    sg_version_date);
2398         return 0;
2399 }
2400
2401 static int sg_proc_single_open_version(struct inode *inode, struct file *file)
2402 {
2403         return single_open(file, sg_proc_seq_show_version, NULL);
2404 }
2405
2406 static int sg_proc_seq_show_devhdr(struct seq_file *s, void *v)
2407 {
2408         seq_printf(s, "host\tchan\tid\tlun\ttype\topens\tqdepth\tbusy\t"
2409                    "online\n");
2410         return 0;
2411 }
2412
2413 static int sg_proc_single_open_devhdr(struct inode *inode, struct file *file)
2414 {
2415         return single_open(file, sg_proc_seq_show_devhdr, NULL);
2416 }
2417
2418 struct sg_proc_deviter {
2419         loff_t  index;
2420         size_t  max;
2421 };
2422
2423 static void * dev_seq_start(struct seq_file *s, loff_t *pos)
2424 {
2425         struct sg_proc_deviter * it = kmalloc(sizeof(*it), GFP_KERNEL);
2426
2427         s->private = it;
2428         if (! it)
2429                 return NULL;
2430
2431         it->index = *pos;
2432         it->max = sg_last_dev();
2433         if (it->index >= it->max)
2434                 return NULL;
2435         return it;
2436 }
2437
2438 static void * dev_seq_next(struct seq_file *s, void *v, loff_t *pos)
2439 {
2440         struct sg_proc_deviter * it = s->private;
2441
2442         *pos = ++it->index;
2443         return (it->index < it->max) ? it : NULL;
2444 }
2445
2446 static void dev_seq_stop(struct seq_file *s, void *v)
2447 {
2448         kfree(s->private);
2449 }
2450
2451 static int sg_proc_open_dev(struct inode *inode, struct file *file)
2452 {
2453         return seq_open(file, &dev_seq_ops);
2454 }
2455
2456 static int sg_proc_seq_show_dev(struct seq_file *s, void *v)
2457 {
2458         struct sg_proc_deviter * it = (struct sg_proc_deviter *) v;
2459         Sg_device *sdp;
2460         struct scsi_device *scsidp;
2461         unsigned long iflags;
2462
2463         read_lock_irqsave(&sg_index_lock, iflags);
2464         sdp = it ? sg_lookup_dev(it->index) : NULL;
2465         if (sdp && (scsidp = sdp->device) && (!sdp->detached))
2466                 seq_printf(s, "%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\n",
2467                               scsidp->host->host_no, scsidp->channel,
2468                               scsidp->id, scsidp->lun, (int) scsidp->type,
2469                               1,
2470                               (int) scsidp->queue_depth,
2471                               (int) scsidp->device_busy,
2472                               (int) scsi_device_online(scsidp));
2473         else
2474                 seq_printf(s, "-1\t-1\t-1\t-1\t-1\t-1\t-1\t-1\t-1\n");
2475         read_unlock_irqrestore(&sg_index_lock, iflags);
2476         return 0;
2477 }
2478
2479 static int sg_proc_open_devstrs(struct inode *inode, struct file *file)
2480 {
2481         return seq_open(file, &devstrs_seq_ops);
2482 }
2483
2484 static int sg_proc_seq_show_devstrs(struct seq_file *s, void *v)
2485 {
2486         struct sg_proc_deviter * it = (struct sg_proc_deviter *) v;
2487         Sg_device *sdp;
2488         struct scsi_device *scsidp;
2489         unsigned long iflags;
2490
2491         read_lock_irqsave(&sg_index_lock, iflags);
2492         sdp = it ? sg_lookup_dev(it->index) : NULL;
2493         if (sdp && (scsidp = sdp->device) && (!sdp->detached))
2494                 seq_printf(s, "%8.8s\t%16.16s\t%4.4s\n",
2495                            scsidp->vendor, scsidp->model, scsidp->rev);
2496         else
2497                 seq_printf(s, "<no active device>\n");
2498         read_unlock_irqrestore(&sg_index_lock, iflags);
2499         return 0;
2500 }
2501
2502 /* must be called while holding sg_index_lock */
2503 static void sg_proc_debug_helper(struct seq_file *s, Sg_device * sdp)
2504 {
2505         int k, m, new_interface, blen, usg;
2506         Sg_request *srp;
2507         Sg_fd *fp;
2508         const sg_io_hdr_t *hp;
2509         const char * cp;
2510         unsigned int ms;
2511
2512         k = 0;
2513         list_for_each_entry(fp, &sdp->sfds, sfd_siblings) {
2514                 k++;
2515                 read_lock(&fp->rq_list_lock); /* irqs already disabled */
2516                 seq_printf(s, "   FD(%d): timeout=%dms bufflen=%d "
2517                            "(res)sgat=%d low_dma=%d\n", k,
2518                            jiffies_to_msecs(fp->timeout),
2519                            fp->reserve.bufflen,
2520                            (int) fp->reserve.k_use_sg,
2521                            (int) fp->low_dma);
2522                 seq_printf(s, "   cmd_q=%d f_packid=%d k_orphan=%d closed=0\n",
2523                            (int) fp->cmd_q, (int) fp->force_packid,
2524                            (int) fp->keep_orphan);
2525                 for (m = 0, srp = fp->headrp;
2526                                 srp != NULL;
2527                                 ++m, srp = srp->nextrp) {
2528                         hp = &srp->header;
2529                         new_interface = (hp->interface_id == '\0') ? 0 : 1;
2530                         if (srp->res_used) {
2531                                 if (new_interface && 
2532                                     (SG_FLAG_MMAP_IO & hp->flags))
2533                                         cp = "     mmap>> ";
2534                                 else
2535                                         cp = "     rb>> ";
2536                         } else {
2537                                 if (SG_INFO_DIRECT_IO_MASK & hp->info)
2538                                         cp = "     dio>> ";
2539                                 else
2540                                         cp = "     ";
2541                         }
2542                         seq_printf(s, cp);
2543                         blen = srp->data.bufflen;
2544                         usg = srp->data.k_use_sg;
2545                         seq_printf(s, srp->done ? 
2546                                    ((1 == srp->done) ?  "rcv:" : "fin:")
2547                                    : "act:");
2548                         seq_printf(s, " id=%d blen=%d",
2549                                    srp->header.pack_id, blen);
2550                         if (srp->done)
2551                                 seq_printf(s, " dur=%d", hp->duration);
2552                         else {
2553                                 ms = jiffies_to_msecs(jiffies);
2554                                 seq_printf(s, " t_o/elap=%d/%d",
2555                                         (new_interface ? hp->timeout :
2556                                                   jiffies_to_msecs(fp->timeout)),
2557                                         (ms > hp->duration ? ms - hp->duration : 0));
2558                         }
2559                         seq_printf(s, "ms sgat=%d op=0x%02x\n", usg,
2560                                    (int) srp->data.cmd_opcode);
2561                 }
2562                 if (0 == m)
2563                         seq_printf(s, "     No requests active\n");
2564                 read_unlock(&fp->rq_list_lock);
2565         }
2566 }
2567
2568 static int sg_proc_open_debug(struct inode *inode, struct file *file)
2569 {
2570         return seq_open(file, &debug_seq_ops);
2571 }
2572
2573 static int sg_proc_seq_show_debug(struct seq_file *s, void *v)
2574 {
2575         struct sg_proc_deviter * it = (struct sg_proc_deviter *) v;
2576         Sg_device *sdp;
2577         unsigned long iflags;
2578
2579         if (it && (0 == it->index)) {
2580                 seq_printf(s, "max_active_device=%d(origin 1)\n",
2581                            (int)it->max);
2582                 seq_printf(s, " def_reserved_size=%d\n", sg_big_buff);
2583         }
2584
2585         read_lock_irqsave(&sg_index_lock, iflags);
2586         sdp = it ? sg_lookup_dev(it->index) : NULL;
2587         if (sdp && !list_empty(&sdp->sfds)) {
2588                 struct scsi_device *scsidp = sdp->device;
2589
2590                 seq_printf(s, " >>> device=%s ", sdp->disk->disk_name);
2591                 if (sdp->detached)
2592                         seq_printf(s, "detached pending close ");
2593                 else
2594                         seq_printf
2595                             (s, "scsi%d chan=%d id=%d lun=%d   em=%d",
2596                              scsidp->host->host_no,
2597                              scsidp->channel, scsidp->id,
2598                              scsidp->lun,
2599                              scsidp->host->hostt->emulated);
2600                 seq_printf(s, " sg_tablesize=%d excl=%d\n",
2601                            sdp->sg_tablesize, sdp->exclude);
2602                 sg_proc_debug_helper(s, sdp);
2603         }
2604         read_unlock_irqrestore(&sg_index_lock, iflags);
2605         return 0;
2606 }
2607
2608 #endif                          /* CONFIG_SCSI_PROC_FS */
2609
2610 module_init(init_sg);
2611 module_exit(exit_sg);