LCOV - code coverage report
Current view: top level - drivers/scsi - scsi.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 71 331 21.5 %
Date: 2014-02-18 Functions: 12 34 35.3 %
Branches: 26 223 11.7 %

           Branch data     Line data    Source code
       1                 :            : /*
       2                 :            :  *  scsi.c Copyright (C) 1992 Drew Eckhardt
       3                 :            :  *         Copyright (C) 1993, 1994, 1995, 1999 Eric Youngdale
       4                 :            :  *         Copyright (C) 2002, 2003 Christoph Hellwig
       5                 :            :  *
       6                 :            :  *  generic mid-level SCSI driver
       7                 :            :  *      Initial versions: Drew Eckhardt
       8                 :            :  *      Subsequent revisions: Eric Youngdale
       9                 :            :  *
      10                 :            :  *  <drew@colorado.edu>
      11                 :            :  *
      12                 :            :  *  Bug correction thanks go to :
      13                 :            :  *      Rik Faith <faith@cs.unc.edu>
      14                 :            :  *      Tommy Thorn <tthorn>
      15                 :            :  *      Thomas Wuensche <tw@fgb1.fgb.mw.tu-muenchen.de>
      16                 :            :  *
      17                 :            :  *  Modified by Eric Youngdale eric@andante.org or ericy@gnu.ai.mit.edu to
      18                 :            :  *  add scatter-gather, multiple outstanding request, and other
      19                 :            :  *  enhancements.
      20                 :            :  *
      21                 :            :  *  Native multichannel, wide scsi, /proc/scsi and hot plugging
      22                 :            :  *  support added by Michael Neuffer <mike@i-connect.net>
      23                 :            :  *
      24                 :            :  *  Added request_module("scsi_hostadapter") for kerneld:
      25                 :            :  *  (Put an "alias scsi_hostadapter your_hostadapter" in /etc/modprobe.conf)
      26                 :            :  *  Bjorn Ekwall  <bj0rn@blox.se>
      27                 :            :  *  (changed to kmod)
      28                 :            :  *
      29                 :            :  *  Major improvements to the timeout, abort, and reset processing,
      30                 :            :  *  as well as performance modifications for large queue depths by
      31                 :            :  *  Leonard N. Zubkoff <lnz@dandelion.com>
      32                 :            :  *
      33                 :            :  *  Converted cli() code to spinlocks, Ingo Molnar
      34                 :            :  *
      35                 :            :  *  Jiffies wrap fixes (host->resetting), 3 Dec 1998 Andrea Arcangeli
      36                 :            :  *
      37                 :            :  *  out_of_space hacks, D. Gilbert (dpg) 990608
      38                 :            :  */
      39                 :            : 
      40                 :            : #include <linux/module.h>
      41                 :            : #include <linux/moduleparam.h>
      42                 :            : #include <linux/kernel.h>
      43                 :            : #include <linux/timer.h>
      44                 :            : #include <linux/string.h>
      45                 :            : #include <linux/slab.h>
      46                 :            : #include <linux/blkdev.h>
      47                 :            : #include <linux/delay.h>
      48                 :            : #include <linux/init.h>
      49                 :            : #include <linux/completion.h>
      50                 :            : #include <linux/unistd.h>
      51                 :            : #include <linux/spinlock.h>
      52                 :            : #include <linux/kmod.h>
      53                 :            : #include <linux/interrupt.h>
      54                 :            : #include <linux/notifier.h>
      55                 :            : #include <linux/cpu.h>
      56                 :            : #include <linux/mutex.h>
      57                 :            : #include <linux/async.h>
      58                 :            : #include <asm/unaligned.h>
      59                 :            : 
      60                 :            : #include <scsi/scsi.h>
      61                 :            : #include <scsi/scsi_cmnd.h>
      62                 :            : #include <scsi/scsi_dbg.h>
      63                 :            : #include <scsi/scsi_device.h>
      64                 :            : #include <scsi/scsi_driver.h>
      65                 :            : #include <scsi/scsi_eh.h>
      66                 :            : #include <scsi/scsi_host.h>
      67                 :            : #include <scsi/scsi_tcq.h>
      68                 :            : 
      69                 :            : #include "scsi_priv.h"
      70                 :            : #include "scsi_logging.h"
      71                 :            : 
      72                 :            : #define CREATE_TRACE_POINTS
      73                 :            : #include <trace/events/scsi.h>
      74                 :            : 
      75                 :            : static void scsi_done(struct scsi_cmnd *cmd);
      76                 :            : 
      77                 :            : /*
      78                 :            :  * Definitions and constants.
      79                 :            :  */
      80                 :            : 
      81                 :            : /*
      82                 :            :  * Note - the initial logging level can be set here to log events at boot time.
      83                 :            :  * After the system is up, you may enable logging via the /proc interface.
      84                 :            :  */
      85                 :            : unsigned int scsi_logging_level;
      86                 :            : #if defined(CONFIG_SCSI_LOGGING)
      87                 :            : EXPORT_SYMBOL(scsi_logging_level);
      88                 :            : #endif
      89                 :            : 
      90                 :            : /* sd, scsi core and power management need to coordinate flushing async actions */
      91                 :            : ASYNC_DOMAIN(scsi_sd_probe_domain);
      92                 :            : EXPORT_SYMBOL(scsi_sd_probe_domain);
      93                 :            : 
      94                 :            : /* NB: These are exposed through /proc/scsi/scsi and form part of the ABI.
      95                 :            :  * You may not alter any existing entry (although adding new ones is
      96                 :            :  * encouraged once assigned by ANSI/INCITS T10
      97                 :            :  */
      98                 :            : static const char *const scsi_device_types[] = {
      99                 :            :         "Direct-Access    ",
     100                 :            :         "Sequential-Access",
     101                 :            :         "Printer          ",
     102                 :            :         "Processor        ",
     103                 :            :         "WORM             ",
     104                 :            :         "CD-ROM           ",
     105                 :            :         "Scanner          ",
     106                 :            :         "Optical Device   ",
     107                 :            :         "Medium Changer   ",
     108                 :            :         "Communications   ",
     109                 :            :         "ASC IT8          ",
     110                 :            :         "ASC IT8          ",
     111                 :            :         "RAID             ",
     112                 :            :         "Enclosure        ",
     113                 :            :         "Direct-Access-RBC",
     114                 :            :         "Optical card     ",
     115                 :            :         "Bridge controller",
     116                 :            :         "Object storage   ",
     117                 :            :         "Automation/Drive ",
     118                 :            : };
     119                 :            : 
     120                 :            : /**
     121                 :            :  * scsi_device_type - Return 17 char string indicating device type.
     122                 :            :  * @type: type number to look up
     123                 :            :  */
     124                 :            : 
     125                 :          0 : const char * scsi_device_type(unsigned type)
     126                 :            : {
     127         [ +  - ]:          1 :         if (type == 0x1e)
     128                 :            :                 return "Well-known LUN   ";
     129         [ +  - ]:          1 :         if (type == 0x1f)
     130                 :            :                 return "No Device        ";
     131         [ +  - ]:          1 :         if (type >= ARRAY_SIZE(scsi_device_types))
     132                 :            :                 return "Unknown          ";
     133                 :          1 :         return scsi_device_types[type];
     134                 :            : }
     135                 :            : 
     136                 :            : EXPORT_SYMBOL(scsi_device_type);
     137                 :            : 
     138                 :            : struct scsi_host_cmd_pool {
     139                 :            :         struct kmem_cache       *cmd_slab;
     140                 :            :         struct kmem_cache       *sense_slab;
     141                 :            :         unsigned int            users;
     142                 :            :         char                    *cmd_name;
     143                 :            :         char                    *sense_name;
     144                 :            :         unsigned int            slab_flags;
     145                 :            :         gfp_t                   gfp_mask;
     146                 :            : };
     147                 :            : 
     148                 :            : static struct scsi_host_cmd_pool scsi_cmd_pool = {
     149                 :            :         .cmd_name       = "scsi_cmd_cache",
     150                 :            :         .sense_name     = "scsi_sense_cache",
     151                 :            :         .slab_flags     = SLAB_HWCACHE_ALIGN,
     152                 :            : };
     153                 :            : 
     154                 :            : static struct scsi_host_cmd_pool scsi_cmd_dma_pool = {
     155                 :            :         .cmd_name       = "scsi_cmd_cache(DMA)",
     156                 :            :         .sense_name     = "scsi_sense_cache(DMA)",
     157                 :            :         .slab_flags     = SLAB_HWCACHE_ALIGN|SLAB_CACHE_DMA,
     158                 :            :         .gfp_mask       = __GFP_DMA,
     159                 :            : };
     160                 :            : 
     161                 :            : static DEFINE_MUTEX(host_cmd_pool_mutex);
     162                 :            : 
     163                 :            : /**
     164                 :            :  * scsi_pool_alloc_command - internal function to get a fully allocated command
     165                 :            :  * @pool:       slab pool to allocate the command from
     166                 :            :  * @gfp_mask:   mask for the allocation
     167                 :            :  *
     168                 :            :  * Returns a fully allocated command (with the allied sense buffer) or
     169                 :            :  * NULL on failure
     170                 :            :  */
     171                 :            : static struct scsi_cmnd *
     172                 :          0 : scsi_pool_alloc_command(struct scsi_host_cmd_pool *pool, gfp_t gfp_mask)
     173                 :            : {
     174                 :            :         struct scsi_cmnd *cmd;
     175                 :            : 
     176                 :     433719 :         cmd = kmem_cache_zalloc(pool->cmd_slab, gfp_mask | pool->gfp_mask);
     177         [ +  - ]:     433719 :         if (!cmd)
     178                 :            :                 return NULL;
     179                 :            : 
     180                 :     433719 :         cmd->sense_buffer = kmem_cache_alloc(pool->sense_slab,
     181                 :     433719 :                                              gfp_mask | pool->gfp_mask);
     182         [ -  + ]:     433719 :         if (!cmd->sense_buffer) {
     183                 :          0 :                 kmem_cache_free(pool->cmd_slab, cmd);
     184                 :          0 :                 return NULL;
     185                 :            :         }
     186                 :            : 
     187                 :            :         return cmd;
     188                 :            : }
     189                 :            : 
     190                 :            : /**
     191                 :            :  * scsi_pool_free_command - internal function to release a command
     192                 :            :  * @pool:       slab pool to allocate the command from
     193                 :            :  * @cmd:        command to release
     194                 :            :  *
     195                 :            :  * the command must previously have been allocated by
     196                 :            :  * scsi_pool_alloc_command.
     197                 :            :  */
     198                 :            : static void
     199                 :     433719 : scsi_pool_free_command(struct scsi_host_cmd_pool *pool,
     200                 :            :                          struct scsi_cmnd *cmd)
     201                 :            : {
     202         [ -  + ]:     433719 :         if (cmd->prot_sdb)
     203                 :          0 :                 kmem_cache_free(scsi_sdb_cache, cmd->prot_sdb);
     204                 :            : 
     205                 :     433719 :         kmem_cache_free(pool->sense_slab, cmd->sense_buffer);
     206                 :     433719 :         kmem_cache_free(pool->cmd_slab, cmd);
     207                 :     433719 : }
     208                 :            : 
     209                 :            : /**
     210                 :            :  * scsi_host_alloc_command - internal function to allocate command
     211                 :            :  * @shost:      SCSI host whose pool to allocate from
     212                 :            :  * @gfp_mask:   mask for the allocation
     213                 :            :  *
     214                 :            :  * Returns a fully allocated command with sense buffer and protection
     215                 :            :  * data buffer (where applicable) or NULL on failure
     216                 :            :  */
     217                 :            : static struct scsi_cmnd *
     218                 :          0 : scsi_host_alloc_command(struct Scsi_Host *shost, gfp_t gfp_mask)
     219                 :            : {
     220                 :            :         struct scsi_cmnd *cmd;
     221                 :            : 
     222                 :     433719 :         cmd = scsi_pool_alloc_command(shost->cmd_pool, gfp_mask);
     223            [ + ]:     433719 :         if (!cmd)
     224                 :            :                 return NULL;
     225                 :            : 
     226         [ -  + ]:     867438 :         if (scsi_host_get_prot(shost) >= SHOST_DIX_TYPE0_PROTECTION) {
     227                 :          0 :                 cmd->prot_sdb = kmem_cache_zalloc(scsi_sdb_cache, gfp_mask);
     228                 :            : 
     229         [ #  # ]:          0 :                 if (!cmd->prot_sdb) {
     230                 :          0 :                         scsi_pool_free_command(shost->cmd_pool, cmd);
     231                 :          0 :                         return NULL;
     232                 :            :                 }
     233                 :            :         }
     234                 :            : 
     235                 :     433719 :         return cmd;
     236                 :            : }
     237                 :            : 
     238                 :            : /**
     239                 :            :  * __scsi_get_command - Allocate a struct scsi_cmnd
     240                 :            :  * @shost: host to transmit command
     241                 :            :  * @gfp_mask: allocation mask
     242                 :            :  *
     243                 :            :  * Description: allocate a struct scsi_cmd from host's slab, recycling from the
     244                 :            :  *              host's free_list if necessary.
     245                 :            :  */
     246                 :          0 : struct scsi_cmnd *__scsi_get_command(struct Scsi_Host *shost, gfp_t gfp_mask)
     247                 :            : {
     248                 :     433719 :         struct scsi_cmnd *cmd = scsi_host_alloc_command(shost, gfp_mask);
     249                 :            : 
     250         [ -  + ]:     433719 :         if (unlikely(!cmd)) {
     251                 :            :                 unsigned long flags;
     252                 :            : 
     253                 :          0 :                 spin_lock_irqsave(&shost->free_list_lock, flags);
     254         [ #  # ]:          0 :                 if (likely(!list_empty(&shost->free_list))) {
     255                 :          0 :                         cmd = list_entry(shost->free_list.next,
     256                 :            :                                          struct scsi_cmnd, list);
     257                 :          0 :                         list_del_init(&cmd->list);
     258                 :            :                 }
     259                 :            :                 spin_unlock_irqrestore(&shost->free_list_lock, flags);
     260                 :            : 
     261         [ #  # ]:          0 :                 if (cmd) {
     262                 :            :                         void *buf, *prot;
     263                 :            : 
     264                 :          0 :                         buf = cmd->sense_buffer;
     265                 :          0 :                         prot = cmd->prot_sdb;
     266                 :            : 
     267                 :          0 :                         memset(cmd, 0, sizeof(*cmd));
     268                 :            : 
     269                 :          0 :                         cmd->sense_buffer = buf;
     270                 :          0 :                         cmd->prot_sdb = prot;
     271                 :            :                 }
     272                 :            :         }
     273                 :            : 
     274                 :     433719 :         return cmd;
     275                 :            : }
     276                 :            : EXPORT_SYMBOL_GPL(__scsi_get_command);
     277                 :            : 
     278                 :            : /**
     279                 :            :  * scsi_get_command - Allocate and setup a scsi command block
     280                 :            :  * @dev: parent scsi device
     281                 :            :  * @gfp_mask: allocator flags
     282                 :            :  *
     283                 :            :  * Returns:     The allocated scsi command structure.
     284                 :            :  */
     285                 :          0 : struct scsi_cmnd *scsi_get_command(struct scsi_device *dev, gfp_t gfp_mask)
     286                 :            : {
     287                 :            :         struct scsi_cmnd *cmd;
     288                 :            : 
     289                 :            :         /* Bail if we can't get a reference to the device */
     290         [ +  - ]:     433719 :         if (!get_device(&dev->sdev_gendev))
     291                 :            :                 return NULL;
     292                 :            : 
     293                 :     433719 :         cmd = __scsi_get_command(dev->host, gfp_mask);
     294                 :            : 
     295         [ +  - ]:     433719 :         if (likely(cmd != NULL)) {
     296                 :            :                 unsigned long flags;
     297                 :            : 
     298                 :     433719 :                 cmd->device = dev;
     299                 :     433719 :                 INIT_LIST_HEAD(&cmd->list);
     300                 :     433719 :                 spin_lock_irqsave(&dev->list_lock, flags);
     301                 :     433719 :                 list_add_tail(&cmd->list, &dev->cmd_list);
     302                 :            :                 spin_unlock_irqrestore(&dev->list_lock, flags);
     303                 :     433719 :                 cmd->jiffies_at_alloc = jiffies;
     304                 :            :         } else
     305                 :          0 :                 put_device(&dev->sdev_gendev);
     306                 :            : 
     307                 :     433719 :         return cmd;
     308                 :            : }
     309                 :            : EXPORT_SYMBOL(scsi_get_command);
     310                 :            : 
     311                 :            : /**
     312                 :            :  * __scsi_put_command - Free a struct scsi_cmnd
     313                 :            :  * @shost: dev->host
     314                 :            :  * @cmd: Command to free
     315                 :            :  * @dev: parent scsi device
     316                 :            :  */
     317                 :          0 : void __scsi_put_command(struct Scsi_Host *shost, struct scsi_cmnd *cmd,
     318                 :            :                         struct device *dev)
     319                 :            : {
     320                 :            :         unsigned long flags;
     321                 :            : 
     322                 :            :         /* changing locks here, don't need to restore the irq state */
     323                 :     433719 :         spin_lock_irqsave(&shost->free_list_lock, flags);
     324         [ -  + ]:     433719 :         if (unlikely(list_empty(&shost->free_list))) {
     325                 :          0 :                 list_add(&cmd->list, &shost->free_list);
     326                 :            :                 cmd = NULL;
     327                 :            :         }
     328                 :            :         spin_unlock_irqrestore(&shost->free_list_lock, flags);
     329                 :            : 
     330         [ +  - ]:     433719 :         if (likely(cmd != NULL))
     331                 :     433719 :                 scsi_pool_free_command(shost->cmd_pool, cmd);
     332                 :            : 
     333                 :     433719 :         put_device(dev);
     334                 :     433719 : }
     335                 :            : EXPORT_SYMBOL(__scsi_put_command);
     336                 :            : 
     337                 :            : /**
     338                 :            :  * scsi_put_command - Free a scsi command block
     339                 :            :  * @cmd: command block to free
     340                 :            :  *
     341                 :            :  * Returns:     Nothing.
     342                 :            :  *
     343                 :            :  * Notes:       The command must not belong to any lists.
     344                 :            :  */
     345                 :          0 : void scsi_put_command(struct scsi_cmnd *cmd)
     346                 :            : {
     347                 :     433719 :         struct scsi_device *sdev = cmd->device;
     348                 :            :         unsigned long flags;
     349                 :            : 
     350                 :            :         /* serious error if the command hasn't come from a device list */
     351                 :     433719 :         spin_lock_irqsave(&cmd->device->list_lock, flags);
     352         [ -  + ]:     433719 :         BUG_ON(list_empty(&cmd->list));
     353                 :            :         list_del_init(&cmd->list);
     354                 :     433719 :         spin_unlock_irqrestore(&cmd->device->list_lock, flags);
     355                 :            : 
     356                 :     433719 :         __scsi_put_command(cmd->device->host, cmd, &sdev->sdev_gendev);
     357                 :     433719 : }
     358                 :            : EXPORT_SYMBOL(scsi_put_command);
     359                 :            : 
     360                 :          0 : static struct scsi_host_cmd_pool *scsi_get_host_cmd_pool(gfp_t gfp_mask)
     361                 :            : {
     362                 :            :         struct scsi_host_cmd_pool *retval = NULL, *pool;
     363                 :            :         /*
     364                 :            :          * Select a command slab for this host and create it if not
     365                 :            :          * yet existent.
     366                 :            :          */
     367                 :          0 :         mutex_lock(&host_cmd_pool_mutex);
     368         [ #  # ]:          0 :         pool = (gfp_mask & __GFP_DMA) ? &scsi_cmd_dma_pool :
     369                 :            :                 &scsi_cmd_pool;
     370         [ #  # ]:          0 :         if (!pool->users) {
     371                 :          0 :                 pool->cmd_slab = kmem_cache_create(pool->cmd_name,
     372                 :            :                                                    sizeof(struct scsi_cmnd), 0,
     373                 :          0 :                                                    pool->slab_flags, NULL);
     374         [ #  # ]:          0 :                 if (!pool->cmd_slab)
     375                 :            :                         goto fail;
     376                 :            : 
     377                 :          0 :                 pool->sense_slab = kmem_cache_create(pool->sense_name,
     378                 :            :                                                      SCSI_SENSE_BUFFERSIZE, 0,
     379                 :          0 :                                                      pool->slab_flags, NULL);
     380         [ #  # ]:          0 :                 if (!pool->sense_slab) {
     381                 :          0 :                         kmem_cache_destroy(pool->cmd_slab);
     382                 :          0 :                         goto fail;
     383                 :            :                 }
     384                 :            :         }
     385                 :            : 
     386                 :          0 :         pool->users++;
     387                 :            :         retval = pool;
     388                 :            :  fail:
     389                 :          0 :         mutex_unlock(&host_cmd_pool_mutex);
     390                 :          0 :         return retval;
     391                 :            : }
     392                 :            : 
     393                 :          0 : static void scsi_put_host_cmd_pool(gfp_t gfp_mask)
     394                 :            : {
     395                 :            :         struct scsi_host_cmd_pool *pool;
     396                 :            : 
     397                 :          0 :         mutex_lock(&host_cmd_pool_mutex);
     398         [ #  # ]:          0 :         pool = (gfp_mask & __GFP_DMA) ? &scsi_cmd_dma_pool :
     399                 :            :                 &scsi_cmd_pool;
     400                 :            :         /*
     401                 :            :          * This may happen if a driver has a mismatched get and put
     402                 :            :          * of the command pool; the driver should be implicated in
     403                 :            :          * the stack trace
     404                 :            :          */
     405         [ #  # ]:          0 :         BUG_ON(pool->users == 0);
     406                 :            : 
     407         [ #  # ]:          0 :         if (!--pool->users) {
     408                 :          0 :                 kmem_cache_destroy(pool->cmd_slab);
     409                 :          0 :                 kmem_cache_destroy(pool->sense_slab);
     410                 :            :         }
     411                 :          0 :         mutex_unlock(&host_cmd_pool_mutex);
     412                 :          0 : }
     413                 :            : 
     414                 :            : /**
     415                 :            :  * scsi_allocate_command - get a fully allocated SCSI command
     416                 :            :  * @gfp_mask:   allocation mask
     417                 :            :  *
     418                 :            :  * This function is for use outside of the normal host based pools.
     419                 :            :  * It allocates the relevant command and takes an additional reference
     420                 :            :  * on the pool it used.  This function *must* be paired with
     421                 :            :  * scsi_free_command which also has the identical mask, otherwise the
     422                 :            :  * free pool counts will eventually go wrong and you'll trigger a bug.
     423                 :            :  *
     424                 :            :  * This function should *only* be used by drivers that need a static
     425                 :            :  * command allocation at start of day for internal functions.
     426                 :            :  */
     427                 :          0 : struct scsi_cmnd *scsi_allocate_command(gfp_t gfp_mask)
     428                 :            : {
     429                 :          0 :         struct scsi_host_cmd_pool *pool = scsi_get_host_cmd_pool(gfp_mask);
     430                 :            : 
     431         [ #  # ]:          0 :         if (!pool)
     432                 :            :                 return NULL;
     433                 :            : 
     434                 :          0 :         return scsi_pool_alloc_command(pool, gfp_mask);
     435                 :            : }
     436                 :            : EXPORT_SYMBOL(scsi_allocate_command);
     437                 :            : 
     438                 :            : /**
     439                 :            :  * scsi_free_command - free a command allocated by scsi_allocate_command
     440                 :            :  * @gfp_mask:   mask used in the original allocation
     441                 :            :  * @cmd:        command to free
     442                 :            :  *
     443                 :            :  * Note: using the original allocation mask is vital because that's
     444                 :            :  * what determines which command pool we use to free the command.  Any
     445                 :            :  * mismatch will cause the system to BUG eventually.
     446                 :            :  */
     447                 :          0 : void scsi_free_command(gfp_t gfp_mask, struct scsi_cmnd *cmd)
     448                 :            : {
     449                 :          0 :         struct scsi_host_cmd_pool *pool = scsi_get_host_cmd_pool(gfp_mask);
     450                 :            : 
     451                 :            :         /*
     452                 :            :          * this could trigger if the mask to scsi_allocate_command
     453                 :            :          * doesn't match this mask.  Otherwise we're guaranteed that this
     454                 :            :          * succeeds because scsi_allocate_command must have taken a reference
     455                 :            :          * on the pool
     456                 :            :          */
     457         [ #  # ]:          0 :         BUG_ON(!pool);
     458                 :            : 
     459                 :          0 :         scsi_pool_free_command(pool, cmd);
     460                 :            :         /*
     461                 :            :          * scsi_put_host_cmd_pool is called twice; once to release the
     462                 :            :          * reference we took above, and once to release the reference
     463                 :            :          * originally taken by scsi_allocate_command
     464                 :            :          */
     465                 :          0 :         scsi_put_host_cmd_pool(gfp_mask);
     466                 :          0 :         scsi_put_host_cmd_pool(gfp_mask);
     467                 :          0 : }
     468                 :            : EXPORT_SYMBOL(scsi_free_command);
     469                 :            : 
     470                 :            : /**
     471                 :            :  * scsi_setup_command_freelist - Setup the command freelist for a scsi host.
     472                 :            :  * @shost: host to allocate the freelist for.
     473                 :            :  *
     474                 :            :  * Description: The command freelist protects against system-wide out of memory
     475                 :            :  * deadlock by preallocating one SCSI command structure for each host, so the
     476                 :            :  * system can always write to a swap file on a device associated with that host.
     477                 :            :  *
     478                 :            :  * Returns:     Nothing.
     479                 :            :  */
     480                 :          0 : int scsi_setup_command_freelist(struct Scsi_Host *shost)
     481                 :            : {
     482                 :            :         struct scsi_cmnd *cmd;
     483         [ #  # ]:          0 :         const gfp_t gfp_mask = shost->unchecked_isa_dma ? GFP_DMA : GFP_KERNEL;
     484                 :            : 
     485                 :          0 :         spin_lock_init(&shost->free_list_lock);
     486                 :          0 :         INIT_LIST_HEAD(&shost->free_list);
     487                 :            : 
     488                 :          0 :         shost->cmd_pool = scsi_get_host_cmd_pool(gfp_mask);
     489                 :            : 
     490         [ #  # ]:          0 :         if (!shost->cmd_pool)
     491                 :            :                 return -ENOMEM;
     492                 :            : 
     493                 :            :         /*
     494                 :            :          * Get one backup command for this host.
     495                 :            :          */
     496                 :          0 :         cmd = scsi_host_alloc_command(shost, gfp_mask);
     497         [ #  # ]:          0 :         if (!cmd) {
     498                 :          0 :                 scsi_put_host_cmd_pool(gfp_mask);
     499                 :          0 :                 shost->cmd_pool = NULL;
     500                 :          0 :                 return -ENOMEM;
     501                 :            :         }
     502                 :          0 :         list_add(&cmd->list, &shost->free_list);
     503                 :          0 :         return 0;
     504                 :            : }
     505                 :            : 
     506                 :            : /**
     507                 :            :  * scsi_destroy_command_freelist - Release the command freelist for a scsi host.
     508                 :            :  * @shost: host whose freelist is going to be destroyed
     509                 :            :  */
     510                 :          0 : void scsi_destroy_command_freelist(struct Scsi_Host *shost)
     511                 :            : {
     512                 :            :         /*
     513                 :            :          * If cmd_pool is NULL the free list was not initialized, so
     514                 :            :          * do not attempt to release resources.
     515                 :            :          */
     516         [ #  # ]:          0 :         if (!shost->cmd_pool)
     517                 :          0 :                 return;
     518                 :            : 
     519         [ #  # ]:          0 :         while (!list_empty(&shost->free_list)) {
     520                 :            :                 struct scsi_cmnd *cmd;
     521                 :            : 
     522                 :          0 :                 cmd = list_entry(shost->free_list.next, struct scsi_cmnd, list);
     523                 :          0 :                 list_del_init(&cmd->list);
     524                 :          0 :                 scsi_pool_free_command(shost->cmd_pool, cmd);
     525                 :            :         }
     526                 :          0 :         shost->cmd_pool = NULL;
     527         [ #  # ]:          0 :         scsi_put_host_cmd_pool(shost->unchecked_isa_dma ? GFP_DMA : GFP_KERNEL);
     528                 :            : }
     529                 :            : 
     530                 :            : #ifdef CONFIG_SCSI_LOGGING
     531                 :            : void scsi_log_send(struct scsi_cmnd *cmd)
     532                 :            : {
     533                 :            :         unsigned int level;
     534                 :            : 
     535                 :            :         /*
     536                 :            :          * If ML QUEUE log level is greater than or equal to:
     537                 :            :          *
     538                 :            :          * 1: nothing (match completion)
     539                 :            :          *
     540                 :            :          * 2: log opcode + command of all commands
     541                 :            :          *
     542                 :            :          * 3: same as 2 plus dump cmd address
     543                 :            :          *
     544                 :            :          * 4: same as 3 plus dump extra junk
     545                 :            :          */
     546                 :            :         if (unlikely(scsi_logging_level)) {
     547                 :            :                 level = SCSI_LOG_LEVEL(SCSI_LOG_MLQUEUE_SHIFT,
     548                 :            :                                        SCSI_LOG_MLQUEUE_BITS);
     549                 :            :                 if (level > 1) {
     550                 :            :                         scmd_printk(KERN_INFO, cmd, "Send: ");
     551                 :            :                         if (level > 2)
     552                 :            :                                 printk("0x%p ", cmd);
     553                 :            :                         printk("\n");
     554                 :            :                         scsi_print_command(cmd);
     555                 :            :                         if (level > 3) {
     556                 :            :                                 printk(KERN_INFO "buffer = 0x%p, bufflen = %d,"
     557                 :            :                                        " queuecommand 0x%p\n",
     558                 :            :                                         scsi_sglist(cmd), scsi_bufflen(cmd),
     559                 :            :                                         cmd->device->host->hostt->queuecommand);
     560                 :            : 
     561                 :            :                         }
     562                 :            :                 }
     563                 :            :         }
     564                 :            : }
     565                 :            : 
     566                 :            : void scsi_log_completion(struct scsi_cmnd *cmd, int disposition)
     567                 :            : {
     568                 :            :         unsigned int level;
     569                 :            : 
     570                 :            :         /*
     571                 :            :          * If ML COMPLETE log level is greater than or equal to:
     572                 :            :          *
     573                 :            :          * 1: log disposition, result, opcode + command, and conditionally
     574                 :            :          * sense data for failures or non SUCCESS dispositions.
     575                 :            :          *
     576                 :            :          * 2: same as 1 but for all command completions.
     577                 :            :          *
     578                 :            :          * 3: same as 2 plus dump cmd address
     579                 :            :          *
     580                 :            :          * 4: same as 3 plus dump extra junk
     581                 :            :          */
     582                 :            :         if (unlikely(scsi_logging_level)) {
     583                 :            :                 level = SCSI_LOG_LEVEL(SCSI_LOG_MLCOMPLETE_SHIFT,
     584                 :            :                                        SCSI_LOG_MLCOMPLETE_BITS);
     585                 :            :                 if (((level > 0) && (cmd->result || disposition != SUCCESS)) ||
     586                 :            :                     (level > 1)) {
     587                 :            :                         scmd_printk(KERN_INFO, cmd, "Done: ");
     588                 :            :                         if (level > 2)
     589                 :            :                                 printk("0x%p ", cmd);
     590                 :            :                         /*
     591                 :            :                          * Dump truncated values, so we usually fit within
     592                 :            :                          * 80 chars.
     593                 :            :                          */
     594                 :            :                         switch (disposition) {
     595                 :            :                         case SUCCESS:
     596                 :            :                                 printk("SUCCESS\n");
     597                 :            :                                 break;
     598                 :            :                         case NEEDS_RETRY:
     599                 :            :                                 printk("RETRY\n");
     600                 :            :                                 break;
     601                 :            :                         case ADD_TO_MLQUEUE:
     602                 :            :                                 printk("MLQUEUE\n");
     603                 :            :                                 break;
     604                 :            :                         case FAILED:
     605                 :            :                                 printk("FAILED\n");
     606                 :            :                                 break;
     607                 :            :                         case TIMEOUT_ERROR:
     608                 :            :                                 /* 
     609                 :            :                                  * If called via scsi_times_out.
     610                 :            :                                  */
     611                 :            :                                 printk("TIMEOUT\n");
     612                 :            :                                 break;
     613                 :            :                         default:
     614                 :            :                                 printk("UNKNOWN\n");
     615                 :            :                         }
     616                 :            :                         scsi_print_result(cmd);
     617                 :            :                         scsi_print_command(cmd);
     618                 :            :                         if (status_byte(cmd->result) & CHECK_CONDITION)
     619                 :            :                                 scsi_print_sense("", cmd);
     620                 :            :                         if (level > 3)
     621                 :            :                                 scmd_printk(KERN_INFO, cmd,
     622                 :            :                                             "scsi host busy %d failed %d\n",
     623                 :            :                                             cmd->device->host->host_busy,
     624                 :            :                                             cmd->device->host->host_failed);
     625                 :            :                 }
     626                 :            :         }
     627                 :            : }
     628                 :            : #endif
     629                 :            : 
     630                 :            : /**
     631                 :            :  * scsi_cmd_get_serial - Assign a serial number to a command
     632                 :            :  * @host: the scsi host
     633                 :            :  * @cmd: command to assign serial number to
     634                 :            :  *
     635                 :            :  * Description: a serial number identifies a request for error recovery
     636                 :            :  * and debugging purposes.  Protected by the Host_Lock of host.
     637                 :            :  */
     638                 :          0 : void scsi_cmd_get_serial(struct Scsi_Host *host, struct scsi_cmnd *cmd)
     639                 :            : {
     640                 :     433719 :         cmd->serial_number = host->cmd_serial_number++;
     641         [ -  + ]:     433719 :         if (cmd->serial_number == 0) 
     642                 :          0 :                 cmd->serial_number = host->cmd_serial_number++;
     643                 :          0 : }
     644                 :            : EXPORT_SYMBOL(scsi_cmd_get_serial);
     645                 :            : 
     646                 :            : /**
     647                 :            :  * scsi_dispatch_command - Dispatch a command to the low-level driver.
     648                 :            :  * @cmd: command block we are dispatching.
     649                 :            :  *
     650                 :            :  * Return: nonzero return request was rejected and device's queue needs to be
     651                 :            :  * plugged.
     652                 :            :  */
     653                 :          0 : int scsi_dispatch_cmd(struct scsi_cmnd *cmd)
     654                 :            : {
     655                 :     433719 :         struct Scsi_Host *host = cmd->device->host;
     656                 :            :         int rtn = 0;
     657                 :            : 
     658                 :     433719 :         atomic_inc(&cmd->device->iorequest_cnt);
     659                 :            : 
     660                 :            :         /* check if the device is still usable */
     661         [ -  + ]:     867438 :         if (unlikely(cmd->device->sdev_state == SDEV_DEL)) {
     662                 :            :                 /* in SDEV_DEL we error all commands. DID_NO_CONNECT
     663                 :            :                  * returns an immediate error upwards, and signals
     664                 :            :                  * that the device is no longer present */
     665                 :          0 :                 cmd->result = DID_NO_CONNECT << 16;
     666                 :          0 :                 scsi_done(cmd);
     667                 :            :                 /* return 0 (because the command has been processed) */
     668                 :          0 :                 goto out;
     669                 :            :         }
     670                 :            : 
     671                 :            :         /* Check to see if the scsi lld made this device blocked. */
     672         [ -  + ]:     433719 :         if (unlikely(scsi_device_blocked(cmd->device))) {
     673                 :            :                 /* 
     674                 :            :                  * in blocked state, the command is just put back on
     675                 :            :                  * the device queue.  The suspend state has already
     676                 :            :                  * blocked the queue so future requests should not
     677                 :            :                  * occur until the device transitions out of the
     678                 :            :                  * suspend state.
     679                 :            :                  */
     680                 :            : 
     681                 :          0 :                 scsi_queue_insert(cmd, SCSI_MLQUEUE_DEVICE_BUSY);
     682                 :            : 
     683                 :            :                 SCSI_LOG_MLQUEUE(3, printk("queuecommand : device blocked \n"));
     684                 :            : 
     685                 :            :                 /*
     686                 :            :                  * NOTE: rtn is still zero here because we don't need the
     687                 :            :                  * queue to be plugged on return (it's already stopped)
     688                 :            :                  */
     689                 :          0 :                 goto out;
     690                 :            :         }
     691                 :            : 
     692                 :            :         /* 
     693                 :            :          * If SCSI-2 or lower, store the LUN value in cmnd.
     694                 :            :          */
     695         [ -  + ]:     433719 :         if (cmd->device->scsi_level <= SCSI_2 &&
     696                 :            :             cmd->device->scsi_level != SCSI_UNKNOWN) {
     697                 :          0 :                 cmd->cmnd[1] = (cmd->cmnd[1] & 0x1f) |
     698                 :          0 :                                (cmd->device->lun << 5 & 0xe0);
     699                 :            :         }
     700                 :            : 
     701                 :            :         scsi_log_send(cmd);
     702                 :            : 
     703                 :            :         /*
     704                 :            :          * Before we queue this command, check if the command
     705                 :            :          * length exceeds what the host adapter can handle.
     706                 :            :          */
     707         [ -  + ]:     433719 :         if (cmd->cmd_len > cmd->device->host->max_cmd_len) {
     708                 :            :                 SCSI_LOG_MLQUEUE(3,
     709                 :            :                         printk("queuecommand : command too long. "
     710                 :            :                                "cdb_size=%d host->max_cmd_len=%d\n",
     711                 :            :                                cmd->cmd_len, cmd->device->host->max_cmd_len));
     712                 :          0 :                 cmd->result = (DID_ABORT << 16);
     713                 :            : 
     714                 :          0 :                 scsi_done(cmd);
     715                 :          0 :                 goto out;
     716                 :            :         }
     717                 :            : 
     718         [ -  + ]:     433719 :         if (unlikely(host->shost_state == SHOST_DEL)) {
     719                 :          0 :                 cmd->result = (DID_NO_CONNECT << 16);
     720                 :          0 :                 scsi_done(cmd);
     721                 :            :         } else {
     722                 :            :                 trace_scsi_dispatch_cmd_start(cmd);
     723                 :     433719 :                 cmd->scsi_done = scsi_done;
     724                 :     433719 :                 rtn = host->hostt->queuecommand(host, cmd);
     725                 :            :         }
     726                 :            : 
     727         [ -  + ]:     433719 :         if (rtn) {
     728                 :            :                 trace_scsi_dispatch_cmd_error(cmd, rtn);
     729         [ #  # ]:          0 :                 if (rtn != SCSI_MLQUEUE_DEVICE_BUSY &&
     730                 :          0 :                     rtn != SCSI_MLQUEUE_TARGET_BUSY)
     731                 :            :                         rtn = SCSI_MLQUEUE_HOST_BUSY;
     732                 :            : 
     733                 :          0 :                 scsi_queue_insert(cmd, rtn);
     734                 :            : 
     735                 :            :                 SCSI_LOG_MLQUEUE(3,
     736                 :            :                     printk("queuecommand : request rejected\n"));
     737                 :            :         }
     738                 :            : 
     739                 :            :  out:
     740                 :            :         SCSI_LOG_MLQUEUE(3, printk("leaving scsi_dispatch_cmnd()\n"));
     741                 :     433719 :         return rtn;
     742                 :            : }
     743                 :            : 
     744                 :            : /**
     745                 :            :  * scsi_done - Enqueue the finished SCSI command into the done queue.
     746                 :            :  * @cmd: The SCSI Command for which a low-level device driver (LLDD) gives
     747                 :            :  * ownership back to SCSI Core -- i.e. the LLDD has finished with it.
     748                 :            :  *
     749                 :            :  * Description: This function is the mid-level's (SCSI Core) interrupt routine,
     750                 :            :  * which regains ownership of the SCSI command (de facto) from a LLDD, and
     751                 :            :  * enqueues the command to the done queue for further processing.
     752                 :            :  *
     753                 :            :  * This is the producer of the done queue who enqueues at the tail.
     754                 :            :  *
     755                 :            :  * This function is interrupt context safe.
     756                 :            :  */
     757                 :          0 : static void scsi_done(struct scsi_cmnd *cmd)
     758                 :            : {
     759                 :            :         trace_scsi_dispatch_cmd_done(cmd);
     760                 :     433719 :         blk_complete_request(cmd->request);
     761                 :     433719 : }
     762                 :            : 
     763                 :            : /**
     764                 :            :  * scsi_finish_command - cleanup and pass command back to upper layer
     765                 :            :  * @cmd: the command
     766                 :            :  *
     767                 :            :  * Description: Pass command off to upper layer for finishing of I/O
     768                 :            :  *              request, waking processes that are waiting on results,
     769                 :            :  *              etc.
     770                 :            :  */
     771                 :          0 : void scsi_finish_command(struct scsi_cmnd *cmd)
     772                 :            : {
     773                 :     433719 :         struct scsi_device *sdev = cmd->device;
     774                 :            :         struct scsi_target *starget = scsi_target(sdev);
     775                 :     433719 :         struct Scsi_Host *shost = sdev->host;
     776                 :            :         struct scsi_driver *drv;
     777                 :            :         unsigned int good_bytes;
     778                 :            : 
     779                 :     433719 :         scsi_device_unbusy(sdev);
     780                 :            : 
     781                 :            :         /*
     782                 :            :          * Clear the flags which say that the device/host is no longer
     783                 :            :          * capable of accepting new commands.  These are set in scsi_queue.c
     784                 :            :          * for both the queue full condition on a device, and for a
     785                 :            :          * host full condition on the host.
     786                 :            :          *
     787                 :            :          * XXX(hch): What about locking?
     788                 :            :          */
     789                 :     433719 :         shost->host_blocked = 0;
     790                 :     433719 :         starget->target_blocked = 0;
     791                 :     433719 :         sdev->device_blocked = 0;
     792                 :            : 
     793                 :            :         /*
     794                 :            :          * If we have valid sense information, then some kind of recovery
     795                 :            :          * must have taken place.  Make a note of this.
     796                 :            :          */
     797         [ -  + ]:     433719 :         if (SCSI_SENSE_VALID(cmd))
     798                 :          0 :                 cmd->result |= (DRIVER_SENSE << 24);
     799                 :            : 
     800                 :            :         SCSI_LOG_MLCOMPLETE(4, sdev_printk(KERN_INFO, sdev,
     801                 :            :                                 "Notifying upper driver of completion "
     802                 :            :                                 "(result %x)\n", cmd->result));
     803                 :            : 
     804                 :            :         good_bytes = scsi_bufflen(cmd);
     805         [ +  + ]:     433719 :         if (cmd->request->cmd_type != REQ_TYPE_BLOCK_PC) {
     806                 :            :                 int old_good_bytes = good_bytes;
     807                 :            :                 drv = scsi_cmd_to_driver(cmd);
     808         [ +  - ]:     394901 :                 if (drv->done)
     809                 :     394901 :                         good_bytes = drv->done(cmd);
     810                 :            :                 /*
     811                 :            :                  * USB may not give sense identifying bad sector and
     812                 :            :                  * simply return a residue instead, so subtract off the
     813                 :            :                  * residue if drv->done() error processing indicates no
     814                 :            :                  * change to the completion length.
     815                 :            :                  */
     816         [ +  - ]:     394901 :                 if (good_bytes == old_good_bytes)
     817                 :     394901 :                         good_bytes -= scsi_get_resid(cmd);
     818                 :            :         }
     819                 :     433719 :         scsi_io_completion(cmd, good_bytes);
     820                 :     433719 : }
     821                 :            : EXPORT_SYMBOL(scsi_finish_command);
     822                 :            : 
     823                 :            : /**
     824                 :            :  * scsi_adjust_queue_depth - Let low level drivers change a device's queue depth
     825                 :            :  * @sdev: SCSI Device in question
     826                 :            :  * @tagged: Do we use tagged queueing (non-0) or do we treat
     827                 :            :  *          this device as an untagged device (0)
     828                 :            :  * @tags: Number of tags allowed if tagged queueing enabled,
     829                 :            :  *        or number of commands the low level driver can
     830                 :            :  *        queue up in non-tagged mode (as per cmd_per_lun).
     831                 :            :  *
     832                 :            :  * Returns:     Nothing
     833                 :            :  *
     834                 :            :  * Lock Status: None held on entry
     835                 :            :  *
     836                 :            :  * Notes:       Low level drivers may call this at any time and we will do
     837                 :            :  *              the right thing depending on whether or not the device is
     838                 :            :  *              currently active and whether or not it even has the
     839                 :            :  *              command blocks built yet.
     840                 :            :  */
     841                 :          0 : void scsi_adjust_queue_depth(struct scsi_device *sdev, int tagged, int tags)
     842                 :            : {
     843                 :            :         unsigned long flags;
     844                 :            : 
     845                 :            :         /*
     846                 :            :          * refuse to set tagged depth to an unworkable size
     847                 :            :          */
     848         [ #  # ]:          0 :         if (tags <= 0)
     849                 :          0 :                 return;
     850                 :            : 
     851                 :          0 :         spin_lock_irqsave(sdev->request_queue->queue_lock, flags);
     852                 :            : 
     853                 :            :         /*
     854                 :            :          * Check to see if the queue is managed by the block layer.
     855                 :            :          * If it is, and we fail to adjust the depth, exit.
     856                 :            :          *
     857                 :            :          * Do not resize the tag map if it is a host wide share bqt,
     858                 :            :          * because the size should be the hosts's can_queue. If there
     859                 :            :          * is more IO than the LLD's can_queue (so there are not enuogh
     860                 :            :          * tags) request_fn's host queue ready check will handle it.
     861                 :            :          */
     862         [ #  # ]:          0 :         if (!sdev->host->bqt) {
     863   [ #  #  #  # ]:          0 :                 if (blk_queue_tagged(sdev->request_queue) &&
     864                 :          0 :                     blk_queue_resize_tags(sdev->request_queue, tags) != 0)
     865                 :            :                         goto out;
     866                 :            :         }
     867                 :            : 
     868                 :          0 :         sdev->queue_depth = tags;
     869   [ #  #  #  # ]:          0 :         switch (tagged) {
     870                 :            :                 case MSG_ORDERED_TAG:
     871                 :          0 :                         sdev->ordered_tags = 1;
     872                 :          0 :                         sdev->simple_tags = 1;
     873                 :          0 :                         break;
     874                 :            :                 case MSG_SIMPLE_TAG:
     875                 :          0 :                         sdev->ordered_tags = 0;
     876                 :          0 :                         sdev->simple_tags = 1;
     877                 :          0 :                         break;
     878                 :            :                 default:
     879                 :          0 :                         sdev_printk(KERN_WARNING, sdev,
     880                 :            :                                     "scsi_adjust_queue_depth, bad queue type, "
     881                 :            :                                     "disabled\n");
     882                 :            :                 case 0:
     883                 :          0 :                         sdev->ordered_tags = sdev->simple_tags = 0;
     884                 :          0 :                         sdev->queue_depth = tags;
     885                 :          0 :                         break;
     886                 :            :         }
     887                 :            :  out:
     888                 :          0 :         spin_unlock_irqrestore(sdev->request_queue->queue_lock, flags);
     889                 :            : }
     890                 :            : EXPORT_SYMBOL(scsi_adjust_queue_depth);
     891                 :            : 
     892                 :            : /**
     893                 :            :  * scsi_track_queue_full - track QUEUE_FULL events to adjust queue depth
     894                 :            :  * @sdev: SCSI Device in question
     895                 :            :  * @depth: Current number of outstanding SCSI commands on this device,
     896                 :            :  *         not counting the one returned as QUEUE_FULL.
     897                 :            :  *
     898                 :            :  * Description: This function will track successive QUEUE_FULL events on a
     899                 :            :  *              specific SCSI device to determine if and when there is a
     900                 :            :  *              need to adjust the queue depth on the device.
     901                 :            :  *
     902                 :            :  * Returns:     0 - No change needed, >0 - Adjust queue depth to this new depth,
     903                 :            :  *              -1 - Drop back to untagged operation using host->cmd_per_lun
     904                 :            :  *                      as the untagged command depth
     905                 :            :  *
     906                 :            :  * Lock Status: None held on entry
     907                 :            :  *
     908                 :            :  * Notes:       Low level drivers may call this at any time and we will do
     909                 :            :  *              "The Right Thing."  We are interrupt context safe.
     910                 :            :  */
     911                 :          0 : int scsi_track_queue_full(struct scsi_device *sdev, int depth)
     912                 :            : {
     913                 :            : 
     914                 :            :         /*
     915                 :            :          * Don't let QUEUE_FULLs on the same
     916                 :            :          * jiffies count, they could all be from
     917                 :            :          * same event.
     918                 :            :          */
     919         [ #  # ]:          0 :         if ((jiffies >> 4) == (sdev->last_queue_full_time >> 4))
     920                 :            :                 return 0;
     921                 :            : 
     922                 :          0 :         sdev->last_queue_full_time = jiffies;
     923         [ #  # ]:          0 :         if (sdev->last_queue_full_depth != depth) {
     924                 :          0 :                 sdev->last_queue_full_count = 1;
     925                 :          0 :                 sdev->last_queue_full_depth = depth;
     926                 :            :         } else {
     927                 :          0 :                 sdev->last_queue_full_count++;
     928                 :            :         }
     929                 :            : 
     930         [ #  # ]:          0 :         if (sdev->last_queue_full_count <= 10)
     931                 :            :                 return 0;
     932         [ #  # ]:          0 :         if (sdev->last_queue_full_depth < 8) {
     933                 :            :                 /* Drop back to untagged */
     934                 :          0 :                 scsi_adjust_queue_depth(sdev, 0, sdev->host->cmd_per_lun);
     935                 :          0 :                 return -1;
     936                 :            :         }
     937                 :            :         
     938         [ #  # ]:          0 :         if (sdev->ordered_tags)
     939                 :          0 :                 scsi_adjust_queue_depth(sdev, MSG_ORDERED_TAG, depth);
     940                 :            :         else
     941                 :          0 :                 scsi_adjust_queue_depth(sdev, MSG_SIMPLE_TAG, depth);
     942                 :          0 :         return depth;
     943                 :            : }
     944                 :            : EXPORT_SYMBOL(scsi_track_queue_full);
     945                 :            : 
     946                 :            : /**
     947                 :            :  * scsi_vpd_inquiry - Request a device provide us with a VPD page
     948                 :            :  * @sdev: The device to ask
     949                 :            :  * @buffer: Where to put the result
     950                 :            :  * @page: Which Vital Product Data to return
     951                 :            :  * @len: The length of the buffer
     952                 :            :  *
     953                 :            :  * This is an internal helper function.  You probably want to use
     954                 :            :  * scsi_get_vpd_page instead.
     955                 :            :  *
     956                 :            :  * Returns 0 on success or a negative error number.
     957                 :            :  */
     958                 :          0 : static int scsi_vpd_inquiry(struct scsi_device *sdev, unsigned char *buffer,
     959                 :            :                                                         u8 page, unsigned len)
     960                 :            : {
     961                 :            :         int result;
     962                 :            :         unsigned char cmd[16];
     963                 :            : 
     964                 :          0 :         cmd[0] = INQUIRY;
     965                 :          0 :         cmd[1] = 1;             /* EVPD */
     966                 :          0 :         cmd[2] = page;
     967                 :          0 :         cmd[3] = len >> 8;
     968                 :          0 :         cmd[4] = len & 0xff;
     969                 :          0 :         cmd[5] = 0;             /* Control byte */
     970                 :            : 
     971                 :            :         /*
     972                 :            :          * I'm not convinced we need to try quite this hard to get VPD, but
     973                 :            :          * all the existing users tried this hard.
     974                 :            :          */
     975                 :            :         result = scsi_execute_req(sdev, cmd, DMA_FROM_DEVICE, buffer,
     976                 :            :                                   len, NULL, 30 * HZ, 3, NULL);
     977         [ #  # ]:          0 :         if (result)
     978                 :            :                 return result;
     979                 :            : 
     980                 :            :         /* Sanity check that we got the page back that we asked for */
     981         [ #  # ]:          0 :         if (buffer[1] != page)
     982                 :            :                 return -EIO;
     983                 :            : 
     984                 :          0 :         return 0;
     985                 :            : }
     986                 :            : 
     987                 :            : /**
     988                 :            :  * scsi_get_vpd_page - Get Vital Product Data from a SCSI device
     989                 :            :  * @sdev: The device to ask
     990                 :            :  * @page: Which Vital Product Data to return
     991                 :            :  * @buf: where to store the VPD
     992                 :            :  * @buf_len: number of bytes in the VPD buffer area
     993                 :            :  *
     994                 :            :  * SCSI devices may optionally supply Vital Product Data.  Each 'page'
     995                 :            :  * of VPD is defined in the appropriate SCSI document (eg SPC, SBC).
     996                 :            :  * If the device supports this VPD page, this routine returns a pointer
     997                 :            :  * to a buffer containing the data from that page.  The caller is
     998                 :            :  * responsible for calling kfree() on this pointer when it is no longer
     999                 :            :  * needed.  If we cannot retrieve the VPD page this routine returns %NULL.
    1000                 :            :  */
    1001                 :          0 : int scsi_get_vpd_page(struct scsi_device *sdev, u8 page, unsigned char *buf,
    1002                 :            :                       int buf_len)
    1003                 :            : {
    1004                 :            :         int i, result;
    1005                 :            : 
    1006         [ #  # ]:          0 :         if (sdev->skip_vpd_pages)
    1007                 :            :                 goto fail;
    1008                 :            : 
    1009                 :            :         /* Ask for all the pages supported by this device */
    1010                 :          0 :         result = scsi_vpd_inquiry(sdev, buf, 0, buf_len);
    1011         [ #  # ]:          0 :         if (result)
    1012                 :            :                 goto fail;
    1013                 :            : 
    1014                 :            :         /* If the user actually wanted this page, we can skip the rest */
    1015         [ #  # ]:          0 :         if (page == 0)
    1016                 :            :                 return 0;
    1017                 :            : 
    1018         [ #  # ]:          0 :         for (i = 0; i < min((int)buf[3], buf_len - 4); i++)
    1019         [ #  # ]:          0 :                 if (buf[i + 4] == page)
    1020                 :            :                         goto found;
    1021                 :            : 
    1022 [ #  # ][ #  # ]:          0 :         if (i < buf[3] && i >= buf_len - 4)
    1023                 :            :                 /* ran off the end of the buffer, give us benefit of doubt */
    1024                 :            :                 goto found;
    1025                 :            :         /* The device claims it doesn't support the requested page */
    1026                 :            :         goto fail;
    1027                 :            : 
    1028                 :            :  found:
    1029                 :          0 :         result = scsi_vpd_inquiry(sdev, buf, page, buf_len);
    1030         [ #  # ]:          0 :         if (result)
    1031                 :            :                 goto fail;
    1032                 :            : 
    1033                 :            :         return 0;
    1034                 :            : 
    1035                 :            :  fail:
    1036                 :            :         return -EINVAL;
    1037                 :            : }
    1038                 :            : EXPORT_SYMBOL_GPL(scsi_get_vpd_page);
    1039                 :            : 
    1040                 :            : /**
    1041                 :            :  * scsi_report_opcode - Find out if a given command opcode is supported
    1042                 :            :  * @sdev:       scsi device to query
    1043                 :            :  * @buffer:     scratch buffer (must be at least 20 bytes long)
    1044                 :            :  * @len:        length of buffer
    1045                 :            :  * @opcode:     opcode for command to look up
    1046                 :            :  *
    1047                 :            :  * Uses the REPORT SUPPORTED OPERATION CODES to look up the given
    1048                 :            :  * opcode. Returns -EINVAL if RSOC fails, 0 if the command opcode is
    1049                 :            :  * unsupported and 1 if the device claims to support the command.
    1050                 :            :  */
    1051                 :          0 : int scsi_report_opcode(struct scsi_device *sdev, unsigned char *buffer,
    1052                 :            :                        unsigned int len, unsigned char opcode)
    1053                 :            : {
    1054                 :            :         unsigned char cmd[16];
    1055                 :            :         struct scsi_sense_hdr sshdr;
    1056                 :            :         int result;
    1057                 :            : 
    1058 [ #  # ][ #  # ]:          0 :         if (sdev->no_report_opcodes || sdev->scsi_level < SCSI_SPC_3)
    1059                 :            :                 return -EINVAL;
    1060                 :            : 
    1061                 :          0 :         memset(cmd, 0, 16);
    1062                 :          0 :         cmd[0] = MAINTENANCE_IN;
    1063                 :          0 :         cmd[1] = MI_REPORT_SUPPORTED_OPERATION_CODES;
    1064                 :          0 :         cmd[2] = 1;             /* One command format */
    1065                 :          0 :         cmd[3] = opcode;
    1066                 :            :         put_unaligned_be32(len, &cmd[6]);
    1067         [ #  # ]:          0 :         memset(buffer, 0, len);
    1068                 :            : 
    1069                 :            :         result = scsi_execute_req(sdev, cmd, DMA_FROM_DEVICE, buffer, len,
    1070                 :            :                                   &sshdr, 30 * HZ, 3, NULL);
    1071                 :            : 
    1072 [ #  # ][ #  # ]:          0 :         if (result && scsi_sense_valid(&sshdr) &&
                 [ #  # ]
    1073         [ #  # ]:          0 :             sshdr.sense_key == ILLEGAL_REQUEST &&
    1074         [ #  # ]:          0 :             (sshdr.asc == 0x20 || sshdr.asc == 0x24) && sshdr.ascq == 0x00)
    1075                 :            :                 return -EINVAL;
    1076                 :            : 
    1077         [ #  # ]:          0 :         if ((buffer[1] & 3) == 3) /* Command supported */
    1078                 :            :                 return 1;
    1079                 :            : 
    1080                 :          0 :         return 0;
    1081                 :            : }
    1082                 :            : EXPORT_SYMBOL(scsi_report_opcode);
    1083                 :            : 
    1084                 :            : /**
    1085                 :            :  * scsi_device_get  -  get an additional reference to a scsi_device
    1086                 :            :  * @sdev:       device to get a reference to
    1087                 :            :  *
    1088                 :            :  * Description: Gets a reference to the scsi_device and increments the use count
    1089                 :            :  * of the underlying LLDD module.  You must hold host_lock of the
    1090                 :            :  * parent Scsi_Host or already have a reference when calling this.
    1091                 :            :  */
    1092                 :          0 : int scsi_device_get(struct scsi_device *sdev)
    1093                 :            : {
    1094         [ #  # ]:          0 :         if (sdev->sdev_state == SDEV_DEL)
    1095                 :            :                 return -ENXIO;
    1096         [ #  # ]:          0 :         if (!get_device(&sdev->sdev_gendev))
    1097                 :            :                 return -ENXIO;
    1098                 :            :         /* We can fail this if we're doing SCSI operations
    1099                 :            :          * from module exit (like cache flush) */
    1100                 :          0 :         try_module_get(sdev->host->hostt->module);
    1101                 :            : 
    1102                 :          0 :         return 0;
    1103                 :            : }
    1104                 :            : EXPORT_SYMBOL(scsi_device_get);
    1105                 :            : 
    1106                 :            : /**
    1107                 :            :  * scsi_device_put  -  release a reference to a scsi_device
    1108                 :            :  * @sdev:       device to release a reference on.
    1109                 :            :  *
    1110                 :            :  * Description: Release a reference to the scsi_device and decrements the use
    1111                 :            :  * count of the underlying LLDD module.  The device is freed once the last
    1112                 :            :  * user vanishes.
    1113                 :            :  */
    1114                 :          0 : void scsi_device_put(struct scsi_device *sdev)
    1115                 :            : {
    1116                 :            : #ifdef CONFIG_MODULE_UNLOAD
    1117                 :          0 :         struct module *module = sdev->host->hostt->module;
    1118                 :            : 
    1119                 :            :         /* The module refcount will be zero if scsi_device_get()
    1120                 :            :          * was called from a module removal routine */
    1121 [ #  # ][ #  # ]:          0 :         if (module && module_refcount(module) != 0)
    1122                 :          0 :                 module_put(module);
    1123                 :            : #endif
    1124                 :          0 :         put_device(&sdev->sdev_gendev);
    1125                 :          0 : }
    1126                 :            : EXPORT_SYMBOL(scsi_device_put);
    1127                 :            : 
    1128                 :            : /* helper for shost_for_each_device, see that for documentation */
    1129                 :          0 : struct scsi_device *__scsi_iterate_devices(struct Scsi_Host *shost,
    1130                 :            :                                            struct scsi_device *prev)
    1131                 :            : {
    1132         [ #  # ]:          0 :         struct list_head *list = (prev ? &prev->siblings : &shost->__devices);
    1133                 :            :         struct scsi_device *next = NULL;
    1134                 :            :         unsigned long flags;
    1135                 :            : 
    1136                 :          0 :         spin_lock_irqsave(shost->host_lock, flags);
    1137         [ #  # ]:          0 :         while (list->next != &shost->__devices) {
    1138                 :          0 :                 next = list_entry(list->next, struct scsi_device, siblings);
    1139                 :            :                 /* skip devices that we can't get a reference to */
    1140         [ #  # ]:          0 :                 if (!scsi_device_get(next))
    1141                 :            :                         break;
    1142                 :            :                 next = NULL;
    1143                 :          0 :                 list = list->next;
    1144                 :            :         }
    1145                 :          0 :         spin_unlock_irqrestore(shost->host_lock, flags);
    1146                 :            : 
    1147         [ #  # ]:          0 :         if (prev)
    1148                 :          0 :                 scsi_device_put(prev);
    1149                 :          0 :         return next;
    1150                 :            : }
    1151                 :            : EXPORT_SYMBOL(__scsi_iterate_devices);
    1152                 :            : 
    1153                 :            : /**
    1154                 :            :  * starget_for_each_device  -  helper to walk all devices of a target
    1155                 :            :  * @starget:    target whose devices we want to iterate over.
    1156                 :            :  * @data:       Opaque passed to each function call.
    1157                 :            :  * @fn:         Function to call on each device
    1158                 :            :  *
    1159                 :            :  * This traverses over each device of @starget.  The devices have
    1160                 :            :  * a reference that must be released by scsi_host_put when breaking
    1161                 :            :  * out of the loop.
    1162                 :            :  */
    1163                 :          0 : void starget_for_each_device(struct scsi_target *starget, void *data,
    1164                 :            :                      void (*fn)(struct scsi_device *, void *))
    1165                 :            : {
    1166                 :          0 :         struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
    1167                 :            :         struct scsi_device *sdev;
    1168                 :            : 
    1169         [ #  # ]:          0 :         shost_for_each_device(sdev, shost) {
    1170 [ #  # ][ #  # ]:          0 :                 if ((sdev->channel == starget->channel) &&
    1171                 :          0 :                     (sdev->id == starget->id))
    1172                 :          0 :                         fn(sdev, data);
    1173                 :            :         }
    1174                 :          0 : }
    1175                 :            : EXPORT_SYMBOL(starget_for_each_device);
    1176                 :            : 
    1177                 :            : /**
    1178                 :            :  * __starget_for_each_device - helper to walk all devices of a target (UNLOCKED)
    1179                 :            :  * @starget:    target whose devices we want to iterate over.
    1180                 :            :  * @data:       parameter for callback @fn()
    1181                 :            :  * @fn:         callback function that is invoked for each device
    1182                 :            :  *
    1183                 :            :  * This traverses over each device of @starget.  It does _not_
    1184                 :            :  * take a reference on the scsi_device, so the whole loop must be
    1185                 :            :  * protected by shost->host_lock.
    1186                 :            :  *
    1187                 :            :  * Note:  The only reason why drivers would want to use this is because
    1188                 :            :  * they need to access the device list in irq context.  Otherwise you
    1189                 :            :  * really want to use starget_for_each_device instead.
    1190                 :            :  **/
    1191                 :          0 : void __starget_for_each_device(struct scsi_target *starget, void *data,
    1192                 :            :                                void (*fn)(struct scsi_device *, void *))
    1193                 :            : {
    1194                 :          0 :         struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
    1195                 :            :         struct scsi_device *sdev;
    1196                 :            : 
    1197         [ #  # ]:          0 :         __shost_for_each_device(sdev, shost) {
    1198 [ #  # ][ #  # ]:          0 :                 if ((sdev->channel == starget->channel) &&
    1199                 :          0 :                     (sdev->id == starget->id))
    1200                 :          0 :                         fn(sdev, data);
    1201                 :            :         }
    1202                 :          0 : }
    1203                 :            : EXPORT_SYMBOL(__starget_for_each_device);
    1204                 :            : 
    1205                 :            : /**
    1206                 :            :  * __scsi_device_lookup_by_target - find a device given the target (UNLOCKED)
    1207                 :            :  * @starget:    SCSI target pointer
    1208                 :            :  * @lun:        SCSI Logical Unit Number
    1209                 :            :  *
    1210                 :            :  * Description: Looks up the scsi_device with the specified @lun for a given
    1211                 :            :  * @starget.  The returned scsi_device does not have an additional
    1212                 :            :  * reference.  You must hold the host's host_lock over this call and
    1213                 :            :  * any access to the returned scsi_device. A scsi_device in state
    1214                 :            :  * SDEV_DEL is skipped.
    1215                 :            :  *
    1216                 :            :  * Note:  The only reason why drivers should use this is because
    1217                 :            :  * they need to access the device list in irq context.  Otherwise you
    1218                 :            :  * really want to use scsi_device_lookup_by_target instead.
    1219                 :            :  **/
    1220                 :          0 : struct scsi_device *__scsi_device_lookup_by_target(struct scsi_target *starget,
    1221                 :            :                                                    uint lun)
    1222                 :            : {
    1223                 :            :         struct scsi_device *sdev;
    1224                 :            : 
    1225 [ #  # ][ #  # ]:          0 :         list_for_each_entry(sdev, &starget->devices, same_target_siblings) {
    1226 [ #  # ][ #  # ]:          0 :                 if (sdev->sdev_state == SDEV_DEL)
    1227                 :          0 :                         continue;
    1228 [ #  # ][ #  # ]:          0 :                 if (sdev->lun ==lun)
    1229                 :            :                         return sdev;
    1230                 :            :         }
    1231                 :            : 
    1232                 :            :         return NULL;
    1233                 :            : }
    1234                 :            : EXPORT_SYMBOL(__scsi_device_lookup_by_target);
    1235                 :            : 
    1236                 :            : /**
    1237                 :            :  * scsi_device_lookup_by_target - find a device given the target
    1238                 :            :  * @starget:    SCSI target pointer
    1239                 :            :  * @lun:        SCSI Logical Unit Number
    1240                 :            :  *
    1241                 :            :  * Description: Looks up the scsi_device with the specified @lun for a given
    1242                 :            :  * @starget.  The returned scsi_device has an additional reference that
    1243                 :            :  * needs to be released with scsi_device_put once you're done with it.
    1244                 :            :  **/
    1245                 :          0 : struct scsi_device *scsi_device_lookup_by_target(struct scsi_target *starget,
    1246                 :            :                                                  uint lun)
    1247                 :            : {
    1248                 :            :         struct scsi_device *sdev;
    1249                 :          0 :         struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
    1250                 :            :         unsigned long flags;
    1251                 :            : 
    1252                 :          0 :         spin_lock_irqsave(shost->host_lock, flags);
    1253                 :            :         sdev = __scsi_device_lookup_by_target(starget, lun);
    1254 [ #  # ][ #  # ]:          0 :         if (sdev && scsi_device_get(sdev))
    1255                 :            :                 sdev = NULL;
    1256                 :          0 :         spin_unlock_irqrestore(shost->host_lock, flags);
    1257                 :            : 
    1258                 :          0 :         return sdev;
    1259                 :            : }
    1260                 :            : EXPORT_SYMBOL(scsi_device_lookup_by_target);
    1261                 :            : 
    1262                 :            : /**
    1263                 :            :  * __scsi_device_lookup - find a device given the host (UNLOCKED)
    1264                 :            :  * @shost:      SCSI host pointer
    1265                 :            :  * @channel:    SCSI channel (zero if only one channel)
    1266                 :            :  * @id:         SCSI target number (physical unit number)
    1267                 :            :  * @lun:        SCSI Logical Unit Number
    1268                 :            :  *
    1269                 :            :  * Description: Looks up the scsi_device with the specified @channel, @id, @lun
    1270                 :            :  * for a given host. The returned scsi_device does not have an additional
    1271                 :            :  * reference.  You must hold the host's host_lock over this call and any access
    1272                 :            :  * to the returned scsi_device.
    1273                 :            :  *
    1274                 :            :  * Note:  The only reason why drivers would want to use this is because
    1275                 :            :  * they need to access the device list in irq context.  Otherwise you
    1276                 :            :  * really want to use scsi_device_lookup instead.
    1277                 :            :  **/
    1278                 :          0 : struct scsi_device *__scsi_device_lookup(struct Scsi_Host *shost,
    1279                 :            :                 uint channel, uint id, uint lun)
    1280                 :            : {
    1281                 :            :         struct scsi_device *sdev;
    1282                 :            : 
    1283 [ #  # ][ #  # ]:          0 :         list_for_each_entry(sdev, &shost->__devices, siblings) {
    1284 [ #  # ][ #  # ]:          0 :                 if (sdev->channel == channel && sdev->id == id &&
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    1285                 :          0 :                                 sdev->lun ==lun)
    1286                 :            :                         return sdev;
    1287                 :            :         }
    1288                 :            : 
    1289                 :            :         return NULL;
    1290                 :            : }
    1291                 :            : EXPORT_SYMBOL(__scsi_device_lookup);
    1292                 :            : 
    1293                 :            : /**
    1294                 :            :  * scsi_device_lookup - find a device given the host
    1295                 :            :  * @shost:      SCSI host pointer
    1296                 :            :  * @channel:    SCSI channel (zero if only one channel)
    1297                 :            :  * @id:         SCSI target number (physical unit number)
    1298                 :            :  * @lun:        SCSI Logical Unit Number
    1299                 :            :  *
    1300                 :            :  * Description: Looks up the scsi_device with the specified @channel, @id, @lun
    1301                 :            :  * for a given host.  The returned scsi_device has an additional reference that
    1302                 :            :  * needs to be released with scsi_device_put once you're done with it.
    1303                 :            :  **/
    1304                 :          0 : struct scsi_device *scsi_device_lookup(struct Scsi_Host *shost,
    1305                 :            :                 uint channel, uint id, uint lun)
    1306                 :            : {
    1307                 :            :         struct scsi_device *sdev;
    1308                 :            :         unsigned long flags;
    1309                 :            : 
    1310                 :          0 :         spin_lock_irqsave(shost->host_lock, flags);
    1311                 :            :         sdev = __scsi_device_lookup(shost, channel, id, lun);
    1312 [ #  # ][ #  # ]:          0 :         if (sdev && scsi_device_get(sdev))
    1313                 :            :                 sdev = NULL;
    1314                 :          0 :         spin_unlock_irqrestore(shost->host_lock, flags);
    1315                 :            : 
    1316                 :          0 :         return sdev;
    1317                 :            : }
    1318                 :            : EXPORT_SYMBOL(scsi_device_lookup);
    1319                 :            : 
    1320                 :            : MODULE_DESCRIPTION("SCSI core");
    1321                 :            : MODULE_LICENSE("GPL");
    1322                 :            : 
    1323                 :            : module_param(scsi_logging_level, int, S_IRUGO|S_IWUSR);
    1324                 :            : MODULE_PARM_DESC(scsi_logging_level, "a bit mask of logging levels");
    1325                 :            : 
    1326                 :          0 : static int __init init_scsi(void)
    1327                 :            : {
    1328                 :            :         int error;
    1329                 :            : 
    1330                 :          0 :         error = scsi_init_queue();
    1331         [ #  # ]:          0 :         if (error)
    1332                 :            :                 return error;
    1333                 :          0 :         error = scsi_init_procfs();
    1334         [ #  # ]:          0 :         if (error)
    1335                 :            :                 goto cleanup_queue;
    1336                 :          0 :         error = scsi_init_devinfo();
    1337         [ #  # ]:          0 :         if (error)
    1338                 :            :                 goto cleanup_procfs;
    1339                 :          0 :         error = scsi_init_hosts();
    1340         [ #  # ]:          0 :         if (error)
    1341                 :            :                 goto cleanup_devlist;
    1342                 :          0 :         error = scsi_init_sysctl();
    1343         [ #  # ]:          0 :         if (error)
    1344                 :            :                 goto cleanup_hosts;
    1345                 :          0 :         error = scsi_sysfs_register();
    1346         [ #  # ]:          0 :         if (error)
    1347                 :            :                 goto cleanup_sysctl;
    1348                 :            : 
    1349                 :            :         scsi_netlink_init();
    1350                 :            : 
    1351                 :          0 :         printk(KERN_NOTICE "SCSI subsystem initialized\n");
    1352                 :          0 :         return 0;
    1353                 :            : 
    1354                 :            : cleanup_sysctl:
    1355                 :          0 :         scsi_exit_sysctl();
    1356                 :            : cleanup_hosts:
    1357                 :          0 :         scsi_exit_hosts();
    1358                 :            : cleanup_devlist:
    1359                 :          0 :         scsi_exit_devinfo();
    1360                 :            : cleanup_procfs:
    1361                 :          0 :         scsi_exit_procfs();
    1362                 :            : cleanup_queue:
    1363                 :          0 :         scsi_exit_queue();
    1364                 :          0 :         printk(KERN_ERR "SCSI subsystem failed to initialize, error = %d\n",
    1365                 :            :                -error);
    1366                 :          0 :         return error;
    1367                 :            : }
    1368                 :            : 
    1369                 :          0 : static void __exit exit_scsi(void)
    1370                 :            : {
    1371                 :            :         scsi_netlink_exit();
    1372                 :          0 :         scsi_sysfs_unregister();
    1373                 :          0 :         scsi_exit_sysctl();
    1374                 :          0 :         scsi_exit_hosts();
    1375                 :          0 :         scsi_exit_devinfo();
    1376                 :          0 :         scsi_exit_procfs();
    1377                 :          0 :         scsi_exit_queue();
    1378                 :          0 :         async_unregister_domain(&scsi_sd_probe_domain);
    1379                 :          0 : }
    1380                 :            : 
    1381                 :            : subsys_initcall(init_scsi);
    1382                 :            : module_exit(exit_scsi);

Generated by: LCOV version 1.9