LCOV - code coverage report
Current view: top level - drivers/scsi - sg.c (source / functions) Hit Total Coverage
Test: combined.info Lines: 89 1260 7.1 %
Date: 2022-04-01 14:35:51 Functions: 4 52 7.7 %
Branches: 16 705 2.3 %

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

Generated by: LCOV version 1.14