1. 29 11月, 2013 1 次提交
    • M
      [SCSI] Disable WRITE SAME for RAID and virtual host adapter drivers · 54b2b50c
      Martin K. Petersen 提交于
      Some host adapters do not pass commands through to the target disk
      directly. Instead they provide an emulated target which may or may not
      accurately report its capabilities. In some cases the physical device
      characteristics are reported even when the host adapter is processing
      commands on the device's behalf. This can lead to adapter firmware hangs
      or excessive I/O errors.
      
      This patch disables WRITE SAME for devices connected to host adapters
      that provide an emulated target. Driver writers can disable WRITE SAME
      by setting the no_write_same flag in the host adapter template.
      
      [jejb: fix up rejections due to eh_deadline patch]
      Signed-off-by: NMartin K. Petersen <martin.petersen@oracle.com>
      Cc: stable@kernel.org
      Signed-off-by: NJames Bottomley <JBottomley@Parallels.com>
      54b2b50c
  2. 20 11月, 2013 1 次提交
  3. 31 10月, 2013 1 次提交
  4. 04 7月, 2013 1 次提交
  5. 27 6月, 2013 1 次提交
  6. 11 4月, 2013 1 次提交
  7. 24 2月, 2013 1 次提交
    • P
      [SCSI] aacraid: suppress two GCC warnings · 98f99a8a
      Paul Bolle 提交于
      Building src.o for a 32 bit system triggers two GCC warnings:
          drivers/scsi/aacraid/src.c: In function ‘aac_src_deliver_message’:
          drivers/scsi/aacraid/src.c:410:3: warning: right shift count >= width of type [enabled by default]
          drivers/scsi/aacraid/src.c:434:2: warning: right shift count >= width of type [enabled by default]
      
      These warnings are caused by a right shift of 32. Use upper_32_bits() to
      suppress them.
      Signed-off-by: NPaul Bolle <pebolle@tiscali.nl>
      Cc: Mahesh Rajashekhara <Mahesh_Rajashekhara@pmc-sierra.com>
      Signed-off-by: NJames Bottomley <JBottomley@Parallels.com>
      98f99a8a
  8. 30 1月, 2013 1 次提交
  9. 04 1月, 2013 1 次提交
    • G
      Drivers: scsi: remove __dev* attributes. · 6f039790
      Greg Kroah-Hartman 提交于
      CONFIG_HOTPLUG is going away as an option.  As a result, the __dev*
      markings need to be removed.
      
      This change removes the use of __devinit, __devexit_p, __devinitdata,
      __devinitconst, and __devexit from these drivers.
      
      Based on patches originally written by Bill Pemberton, but redone by me
      in order to handle some of the coding style issues better, by hand.
      
      Cc: Bill Pemberton <wfp5p@virginia.edu>
      Cc: Adam Radford <linuxraid@lsi.com>
      Cc: "James E.J. Bottomley" <JBottomley@parallels.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      6f039790
  10. 27 11月, 2012 1 次提交
  11. 06 10月, 2012 1 次提交
  12. 20 7月, 2012 5 次提交
  13. 24 4月, 2012 1 次提交
  14. 19 2月, 2012 1 次提交
  15. 09 1月, 2012 1 次提交
    • J
      drivers/scsi/aacraid/commctrl.c: fix mem leak in aac_send_raw_srb() · 7dd72f51
      Jesper Juhl 提交于
      We leak in drivers/scsi/aacraid/commctrl.c::aac_send_raw_srb() :
      
      We allocate memory:
      
      	...
      	struct user_sgmap* usg;
      	usg = kmalloc(actual_fibsize - sizeof(struct aac_srb)
      	  + sizeof(struct sgmap), GFP_KERNEL);
      
      and then neglect to free it:
      
      	...
      	for (i = 0; i < usg->count; i++) {
      		u64 addr;
      		void* p;
      		if (usg->sg[i].count >
      		    ((dev->adapter_info.options &
      		     AAC_OPT_NEW_COMM) ?
      		      (dev->scsi_host_ptr->max_sectors << 9) :
      		      65536)) {
      			rcode = -EINVAL;
      			goto cleanup;
      	... this 'goto' makes 'usg' go out of scope and leak the memory we
      	    allocated.
      
      Other exits properly kfree(usg), it's just here it is neglected.
      Signed-off-by: NJesper Juhl <jj@chaosbits.net>
      Cc: James Bottomley <James.Bottomley@HansenPartnership.com>
      Cc: Andrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      7dd72f51
  16. 11 11月, 2011 1 次提交
  17. 01 11月, 2011 1 次提交
  18. 20 10月, 2011 1 次提交
    • D
      [SCSI] aacraid: use lower snprintf() limit · dc55b827
      Dan Carpenter 提交于
      This is just a cleanup, to silence static checker warnings.  It
      doesn't change how the code works.
      
      buf[] can either be BUF_SIZE if this is called from sysfs, or it can
      be 16 if it's called from aac_get_adapter_info() via
      aac_get_serial_number().  We use the smaller limit here.
      
      sizeof(dev->supplement_adapter_info.MfgPcbaSerialNo) is 12 so there
      is actually no chance of hitting either limit.
      Signed-off-by: NDan Carpenter <dan.carpenter@oracle.com>
      Acked-by: Achim Leubner <Achim_Leubner@pmc-sierra.com> 
      Signed-off-by: NJames Bottomley <JBottomley@Parallels.com>
      dc55b827
  19. 22 9月, 2011 1 次提交
  20. 15 9月, 2011 1 次提交
  21. 19 4月, 2011 1 次提交
    • M
      aacraid: Drop __TIME__ usage · 571b16da
      Michal Marek 提交于
      The kernel already prints its build timestamp during boot, no need to
      repeat it in random drivers and produce different object files each
      time.
      
      Cc: Adaptec OEM Raid Solutions <aacraid@adaptec.com>
      Cc: linux-scsi@vger.kernel.org
      Signed-off-by: NMichal Marek <mmarek@suse.cz>
      571b16da
  22. 31 3月, 2011 1 次提交
  23. 24 3月, 2011 1 次提交
    • M
      [SCSI] aacraid: Add new code for PMC-Sierra's SRC based controller family · e8b12f0f
      Mahesh Rajashekhara 提交于
      Added new hardware device 0x28b interface for PMC-Sierra's SRC based
      controller family.
      
      - new src.c file for 0x28b specific functions
      - new XPORT header required
      - sync. command interface: doorbell bits shifted (SRC_ODR_SHIFT, SRC_IDR_SHIFT)
      - async. Interface: different inbound queue handling, no outbound I2O
        queue available, using doorbell ("PmDoorBellResponseSent") and
        response buffer on the host ("host_rrq") for status
      - changed AIF (adapter initiated FIBs) interface: "DoorBellAifPending"
        bit to inform about pending AIF, "AifRequest" command to read AIF,
        "NoMoreAifDataAvailable" to mark the end of the AIFs
      Signed-off-by: NMahesh Rajashekhara <aacraid@pmc-sierra.com>
      Signed-off-by: NJames Bottomley <James.Bottomley@suse.de>
      e8b12f0f
  24. 17 3月, 2011 1 次提交
  25. 17 11月, 2010 1 次提交
    • J
      SCSI host lock push-down · f281233d
      Jeff Garzik 提交于
      Move the mid-layer's ->queuecommand() invocation from being locked
      with the host lock to being unlocked to facilitate speeding up the
      critical path for drivers who don't need this lock taken anyway.
      
      The patch below presents a simple SCSI host lock push-down as an
      equivalent transformation.  No locking or other behavior should change
      with this patch.  All existing bugs and locking orders are preserved.
      
      Additionally, add one parameter to queuecommand,
      	struct Scsi_Host *
      and remove one parameter from queuecommand,
      	void (*done)(struct scsi_cmnd *)
      
      Scsi_Host* is a convenient pointer that most host drivers need anyway,
      and 'done' is redundant to struct scsi_cmnd->scsi_done.
      
      Minimal code disturbance was attempted with this change.  Most drivers
      needed only two one-line modifications for their host lock push-down.
      Signed-off-by: NJeff Garzik <jgarzik@redhat.com>
      Acked-by: NJames Bottomley <James.Bottomley@suse.de>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      f281233d
  26. 02 11月, 2010 1 次提交
  27. 15 10月, 2010 1 次提交
    • A
      llseek: automatically add .llseek fop · 6038f373
      Arnd Bergmann 提交于
      All file_operations should get a .llseek operation so we can make
      nonseekable_open the default for future file operations without a
      .llseek pointer.
      
      The three cases that we can automatically detect are no_llseek, seq_lseek
      and default_llseek. For cases where we can we can automatically prove that
      the file offset is always ignored, we use noop_llseek, which maintains
      the current behavior of not returning an error from a seek.
      
      New drivers should normally not use noop_llseek but instead use no_llseek
      and call nonseekable_open at open time.  Existing drivers can be converted
      to do the same when the maintainer knows for certain that no user code
      relies on calling seek on the device file.
      
      The generated code is often incorrectly indented and right now contains
      comments that clarify for each added line why a specific variant was
      chosen. In the version that gets submitted upstream, the comments will
      be gone and I will manually fix the indentation, because there does not
      seem to be a way to do that using coccinelle.
      
      Some amount of new code is currently sitting in linux-next that should get
      the same modifications, which I will do at the end of the merge window.
      
      Many thanks to Julia Lawall for helping me learn to write a semantic
      patch that does all this.
      
      ===== begin semantic patch =====
      // This adds an llseek= method to all file operations,
      // as a preparation for making no_llseek the default.
      //
      // The rules are
      // - use no_llseek explicitly if we do nonseekable_open
      // - use seq_lseek for sequential files
      // - use default_llseek if we know we access f_pos
      // - use noop_llseek if we know we don't access f_pos,
      //   but we still want to allow users to call lseek
      //
      @ open1 exists @
      identifier nested_open;
      @@
      nested_open(...)
      {
      <+...
      nonseekable_open(...)
      ...+>
      }
      
      @ open exists@
      identifier open_f;
      identifier i, f;
      identifier open1.nested_open;
      @@
      int open_f(struct inode *i, struct file *f)
      {
      <+...
      (
      nonseekable_open(...)
      |
      nested_open(...)
      )
      ...+>
      }
      
      @ read disable optional_qualifier exists @
      identifier read_f;
      identifier f, p, s, off;
      type ssize_t, size_t, loff_t;
      expression E;
      identifier func;
      @@
      ssize_t read_f(struct file *f, char *p, size_t s, loff_t *off)
      {
      <+...
      (
         *off = E
      |
         *off += E
      |
         func(..., off, ...)
      |
         E = *off
      )
      ...+>
      }
      
      @ read_no_fpos disable optional_qualifier exists @
      identifier read_f;
      identifier f, p, s, off;
      type ssize_t, size_t, loff_t;
      @@
      ssize_t read_f(struct file *f, char *p, size_t s, loff_t *off)
      {
      ... when != off
      }
      
      @ write @
      identifier write_f;
      identifier f, p, s, off;
      type ssize_t, size_t, loff_t;
      expression E;
      identifier func;
      @@
      ssize_t write_f(struct file *f, const char *p, size_t s, loff_t *off)
      {
      <+...
      (
        *off = E
      |
        *off += E
      |
        func(..., off, ...)
      |
        E = *off
      )
      ...+>
      }
      
      @ write_no_fpos @
      identifier write_f;
      identifier f, p, s, off;
      type ssize_t, size_t, loff_t;
      @@
      ssize_t write_f(struct file *f, const char *p, size_t s, loff_t *off)
      {
      ... when != off
      }
      
      @ fops0 @
      identifier fops;
      @@
      struct file_operations fops = {
       ...
      };
      
      @ has_llseek depends on fops0 @
      identifier fops0.fops;
      identifier llseek_f;
      @@
      struct file_operations fops = {
      ...
       .llseek = llseek_f,
      ...
      };
      
      @ has_read depends on fops0 @
      identifier fops0.fops;
      identifier read_f;
      @@
      struct file_operations fops = {
      ...
       .read = read_f,
      ...
      };
      
      @ has_write depends on fops0 @
      identifier fops0.fops;
      identifier write_f;
      @@
      struct file_operations fops = {
      ...
       .write = write_f,
      ...
      };
      
      @ has_open depends on fops0 @
      identifier fops0.fops;
      identifier open_f;
      @@
      struct file_operations fops = {
      ...
       .open = open_f,
      ...
      };
      
      // use no_llseek if we call nonseekable_open
      ////////////////////////////////////////////
      @ nonseekable1 depends on !has_llseek && has_open @
      identifier fops0.fops;
      identifier nso ~= "nonseekable_open";
      @@
      struct file_operations fops = {
      ...  .open = nso, ...
      +.llseek = no_llseek, /* nonseekable */
      };
      
      @ nonseekable2 depends on !has_llseek @
      identifier fops0.fops;
      identifier open.open_f;
      @@
      struct file_operations fops = {
      ...  .open = open_f, ...
      +.llseek = no_llseek, /* open uses nonseekable */
      };
      
      // use seq_lseek for sequential files
      /////////////////////////////////////
      @ seq depends on !has_llseek @
      identifier fops0.fops;
      identifier sr ~= "seq_read";
      @@
      struct file_operations fops = {
      ...  .read = sr, ...
      +.llseek = seq_lseek, /* we have seq_read */
      };
      
      // use default_llseek if there is a readdir
      ///////////////////////////////////////////
      @ fops1 depends on !has_llseek && !nonseekable1 && !nonseekable2 && !seq @
      identifier fops0.fops;
      identifier readdir_e;
      @@
      // any other fop is used that changes pos
      struct file_operations fops = {
      ... .readdir = readdir_e, ...
      +.llseek = default_llseek, /* readdir is present */
      };
      
      // use default_llseek if at least one of read/write touches f_pos
      /////////////////////////////////////////////////////////////////
      @ fops2 depends on !fops1 && !has_llseek && !nonseekable1 && !nonseekable2 && !seq @
      identifier fops0.fops;
      identifier read.read_f;
      @@
      // read fops use offset
      struct file_operations fops = {
      ... .read = read_f, ...
      +.llseek = default_llseek, /* read accesses f_pos */
      };
      
      @ fops3 depends on !fops1 && !fops2 && !has_llseek && !nonseekable1 && !nonseekable2 && !seq @
      identifier fops0.fops;
      identifier write.write_f;
      @@
      // write fops use offset
      struct file_operations fops = {
      ... .write = write_f, ...
      +	.llseek = default_llseek, /* write accesses f_pos */
      };
      
      // Use noop_llseek if neither read nor write accesses f_pos
      ///////////////////////////////////////////////////////////
      
      @ fops4 depends on !fops1 && !fops2 && !fops3 && !has_llseek && !nonseekable1 && !nonseekable2 && !seq @
      identifier fops0.fops;
      identifier read_no_fpos.read_f;
      identifier write_no_fpos.write_f;
      @@
      // write fops use offset
      struct file_operations fops = {
      ...
       .write = write_f,
       .read = read_f,
      ...
      +.llseek = noop_llseek, /* read and write both use no f_pos */
      };
      
      @ depends on has_write && !has_read && !fops1 && !fops2 && !has_llseek && !nonseekable1 && !nonseekable2 && !seq @
      identifier fops0.fops;
      identifier write_no_fpos.write_f;
      @@
      struct file_operations fops = {
      ... .write = write_f, ...
      +.llseek = noop_llseek, /* write uses no f_pos */
      };
      
      @ depends on has_read && !has_write && !fops1 && !fops2 && !has_llseek && !nonseekable1 && !nonseekable2 && !seq @
      identifier fops0.fops;
      identifier read_no_fpos.read_f;
      @@
      struct file_operations fops = {
      ... .read = read_f, ...
      +.llseek = noop_llseek, /* read uses no f_pos */
      };
      
      @ depends on !has_read && !has_write && !fops1 && !fops2 && !has_llseek && !nonseekable1 && !nonseekable2 && !seq @
      identifier fops0.fops;
      @@
      struct file_operations fops = {
      ...
      +.llseek = noop_llseek, /* no read or write fn */
      };
      ===== End semantic patch =====
      Signed-off-by: NArnd Bergmann <arnd@arndb.de>
      Cc: Julia Lawall <julia@diku.dk>
      Cc: Christoph Hellwig <hch@infradead.org>
      6038f373
  28. 23 9月, 2010 1 次提交
  29. 17 9月, 2010 1 次提交
  30. 16 9月, 2010 1 次提交
    • A
      scsi: autoconvert trivial BKL users to private mutex · c45d15d2
      Arnd Bergmann 提交于
      All these files use the big kernel lock in a trivial
      way to serialize their private file operations,
      typically resulting from an earlier semi-automatic
      pushdown from VFS.
      
      None of these drivers appears to want to lock against
      other code, and they all use the BKL as the top-level
      lock in their file operations, meaning that there
      is no lock-order inversion problem.
      
      Consequently, we can remove the BKL completely,
      replacing it with a per-file mutex in every case.
      Using a scripted approach means we can avoid
      typos.
      
      file=$1
      name=$2
      if grep -q lock_kernel ${file} ; then
          if grep -q 'include.*linux.mutex.h' ${file} ; then
                  sed -i '/include.*<linux\/smp_lock.h>/d' ${file}
          else
                  sed -i 's/include.*<linux\/smp_lock.h>.*$/include <linux\/mutex.h>/g' ${file}
          fi
          sed -i ${file} \
              -e "/^#include.*linux.mutex.h/,$ {
                      1,/^\(static\|int\|long\)/ {
                           /^\(static\|int\|long\)/istatic DEFINE_MUTEX(${name}_mutex);
      
      } }"  \
          -e "s/\(un\)*lock_kernel\>[ ]*()/mutex_\1lock(\&${name}_mutex)/g" \
          -e '/[      ]*cycle_kernel_lock();/d'
      else
          sed -i -e '/include.*\<smp_lock.h\>/d' ${file}  \
                      -e '/cycle_kernel_lock()/d'
      fi
      Signed-off-by: NArnd Bergmann <arnd@arndb.de>
      Cc: linux-scsi@vger.kernel.org
      Cc: "James E.J. Bottomley" <James.Bottomley@suse.de>
      c45d15d2
  31. 11 8月, 2010 1 次提交
  32. 28 7月, 2010 1 次提交
  33. 25 5月, 2010 1 次提交
  34. 17 5月, 2010 3 次提交
    • A
      scsi: Push down BKL into ioctl functions · f4927c45
      Arnd Bergmann 提交于
      Push down the bkl into ioctl functions on the scsi layer.
      
      [jkacur: Forward declaration missing ';'.
      Conflicting declaraction in megaraid.h changed
      Fixed missing inodes declarations]
      Signed-off-by: NArnd Bergmann <arnd@arndb.de>
      Signed-off-by: NJohn Kacur <jkacur@redhat.com>
      Signed-off-by: NFrederic Weisbecker <fweisbec@gmail.com>
      f4927c45
    • R
      [SCSI] aacraid: add an ifdef'd device delete case instead of taking the device offline · 9cccde93
      Rajashekhara, Mahesh 提交于
      Problem description:
      --------------------
      
      The problem reported by one of the customer was when a logical array
      is deleted(from the SDK, from the GUI, from arcconf) then the
      corresponding physical device (/dev/sdb, for example) is not removed
      from the Linux namespace. So you end up with a "dead" device
      entry. And some of the linux tools go slightly wonky.
      
      Solution:
      ---------
      
      Based on the notification from FW, the driver calls
      "scsi_remove_device" for the DELETED drive. This call not only informs
      the scsi device status to the SCSI mid layer and also it will remove
      corresponding scsi device entries from the Linux sysfs.
      Signed-off-by: NMahesh Rajashekhara <aacraid@adaptec.com>
      Signed-off-by: NJames Bottomley <James.Bottomley@suse.de>
      9cccde93
    • R
      [SCSI] aacraid: prohibit access to array container space · da3cc679
      Rajashekhara, Mahesh 提交于
      Problem description:
      --------------------
      
      The issue reported by one of the customer was able to read LBA beyond
      the array reported size with "sg_read" utility. If N is the last block
      address reported, then should not be able to read past N,
      i.e. N+1. But in their case, reported last LBA=143134719.  So should
      not have been able to read with LBA=143134720, but it is read without
      failure, which means reported size to the OS is not correct and is
      less than the actual last block address.
      
      Solution:
      ---------
      
      Firmware layer exposes lesser container capacity than the actual
      one. It exposes [Actual size - Spitfire space(10MB)] to the OS, IO's
      to the 10MB should be prohibited from the Linux driver. Driver checks
      LBA boundary, if its greater than the array reported size then sets
      sensekey to HARDWARE_ERROR and sends the notification to the MID
      layer.
      Signed-off-by: NMahesh Rajashekhara <aacraid@adaptec.com>
      Signed-off-by: NJames Bottomley <James.Bottomley@suse.de>
      da3cc679