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