An error occurred fetching the project authors.
  1. 19 Mar, 2008 1 commit
    • Kay Sievers's avatar
      [SCSI] fix media change events for polled devices · 4d1566ed
      Kay Sievers authored
      Commit:
        a341cd0f (SCSI: add asynchronous event notification API)
      breaks:
        285e9670 (sr,sd: send media state change modification events)
      by introducing an event filter, which is removed here, to make
      events, we are depending on, happen again.
      
      Fix this by removing the event filter.  It's pretty much broken at the
      moment, since a user can't set it (the attribute being read only).  A
      proper fix will be to make the event discriminator distinguish between
      AN and Polled media change events.
      
      Cc: David Zeuthen <david@fubar.dk>
      Cc: kristen accardi <kaccardi@gmail.com>
      Cc: Jeff Garzik <jeff@garzik.org>
      Signed-off-by: default avatarKay Sievers <kay.sievers@vrfy.org>
      Signed-off-by: default avatarJames Bottomley <James.Bottomley@HansenPartnership.com>
      4d1566ed
  2. 19 Feb, 2008 1 commit
    • Tejun Heo's avatar
      block: add request->raw_data_len · 6b00769f
      Tejun Heo authored
      With padding and draining moved into it, block layer now may extend
      requests as directed by queue parameters, so now a request has two
      sizes - the original request size and the extended size which matches
      the size of area pointed to by bios and later by sgs.  The latter size
      is what lower layers are primarily interested in when allocating,
      filling up DMA tables and setting up the controller.
      
      Both padding and draining extend the data area to accomodate
      controller characteristics.  As any controller which speaks SCSI can
      handle underflows, feeding larger data area is safe.
      
      So, this patch makes the primary data length field, request->data_len,
      indicate the size of full data area and add a separate length field,
      request->raw_data_len, for the unmodified request size.  The latter is
      used to report to higher layer (userland) and where the original
      request size should be fed to the controller or device.
      Signed-off-by: default avatarTejun Heo <htejun@gmail.com>
      Cc: James Bottomley <James.Bottomley@HansenPartnership.com>
      Signed-off-by: default avatarJens Axboe <jens.axboe@oracle.com>
      6b00769f
  3. 08 Feb, 2008 1 commit
    • Tony Battersby's avatar
      [SCSI] fix BUG when sum(scatterlist) > bufflen · 4d2de3a5
      Tony Battersby authored
      When sending a SCSI command to a tape drive via the SCSI Generic (sg)
      driver, if the command has a data transfer length more than
      scatter_elem_sz (32 KB default) and not a multiple of 512, then I either
      hit BUG_ON(!valid_dma_direction(direction)) in dma_unmap_sg() or else
      the command never completes (depending on the LLDD).
      
      When constructing scatterlists, the sg driver rounds up the scatterlist
      element sizes to be a multiple of 512.  This can result in
      sum(scatterlist lengths) > bufflen.  In this case, scsi_req_map_sg()
      incorrectly sets bio->bi_size to sum(scatterlist lengths) rather than to
      bufflen.  When the command completes, req_bio_endio() detects that
      bio->bi_size != 0, and so it doesn't call bio_endio().  This causes the
      command to be resubmitted, resulting in BUG_ON or the command never
      completing.
      
      This patch makes scsi_req_map_sg() set bio->bi_size to bufflen rather
      than to sum(scatterlist lengths), which fixes the problem.
      Signed-off-by: default avatarTony Battersby <tonyb@cybernetics.com>
      Acked-by: default avatarMike Christie <michaelc@cs.wisc.edu>
      Signed-off-by: default avatarJames Bottomley <James.Bottomley@HansenPartnership.com>
      4d2de3a5
  4. 05 Feb, 2008 2 commits
  5. 30 Jan, 2008 7 commits
  6. 28 Jan, 2008 3 commits
  7. 23 Jan, 2008 1 commit
  8. 12 Jan, 2008 5 commits
  9. 06 Jan, 2008 1 commit
    • Linus Torvalds's avatar
      Revert "scsi: revert "[SCSI] Get rid of scsi_cmnd->done"" · 7b3d9545
      Linus Torvalds authored
      This reverts commit ac40532e, which gets
      us back the original cleanup of 6f5391c2.
      
      It turns out that the bug that was triggered by that commit was
      apparently not actually triggered by that commit at all, and just the
      testing conditions had changed enough to make it appear to be due to it.
      
      The real problem seems to have been found by Peter Osterlund:
      
        "pktcdvd sets it [block device size] when opening the /dev/pktcdvd
         device, but when the drive is later opened as /dev/scd0, there is
         nothing that sets it back.  (Btw, 40944 is possible if the disk is a
         CDRW that was formatted with "cdrwtool -m 10236".)
      
         The problem is that pktcdvd opens the cd device in non-blocking mode
         when pktsetup is run, and doesn't close it again until pktsetup -d is
         run.  The effect is that if you meanwhile open the cd device,
         blkdev.c:do_open() doesn't call bd_set_size() because
         bdev->bd_openers is non-zero."
      
      In particular, to repeat the bug (regardless of whether commit
      6f5391c2 is applied or not):
      
        " 1. Start with an empty drive.
          2. pktsetup 0 /dev/scd0
          3. Insert a CD containing an isofs filesystem.
          4. mount /dev/pktcdvd/0 /mnt/tmp
          5. umount /mnt/tmp
          6. Press the eject button.
          7. Insert a DVD containing a non-writable filesystem.
          8. mount /dev/scd0 /mnt/tmp
          9. find /mnt/tmp -type f -print0 | xargs -0 sha1sum >/dev/null
          10. If the DVD contains data beyond the physical size of a CD, you
              get I/O errors in the terminal, and dmesg reports lots of
              "attempt to access beyond end of device" errors."
      
      which in turn is because the nested open after the media change won't
      cause the size to be set properly (because the original open still holds
      the block device, and we only do the bd_set_size() when we don't have
      other people holding the device open).
      
      The proper fix for that is probably to just do something like
      
      	bdev->bd_inode->i_size = (loff_t)get_capacity(disk)<<9;
      
      in fs/block_dev.c:do_open() even for the cases where we're not the
      original opener (but *not* call bd_set_size(), since that will also
      change the block size of the device).
      
      Cc: Peter Osterlund <petero2@telia.com>
      Cc: James Bottomley <James.Bottomley@HansenPartnership.com>
      Cc: Matthew Wilcox <matthew@wil.cx>
      Cc: Ingo Molnar <mingo@elte.hu>
      Cc: Andrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      7b3d9545
  10. 02 Jan, 2008 2 commits
  11. 04 Nov, 2007 1 commit
  12. 02 Nov, 2007 1 commit
    • Jens Axboe's avatar
      [SG] Get rid of __sg_mark_end() · c46f2334
      Jens Axboe authored
      sg_mark_end() overwrites the page_link information, but all users want
      __sg_mark_end() behaviour where we just set the end bit. That is the most
      natural way to use the sg list, since you'll fill it in and then mark the
      end point.
      
      So change sg_mark_end() to only set the termination bit. Add a sg_magic
      debug check as well, and clear a chain pointer if it is set.
      Signed-off-by: default avatarJens Axboe <jens.axboe@oracle.com>
      c46f2334
  13. 22 Oct, 2007 1 commit
  14. 17 Oct, 2007 2 commits
  15. 16 Oct, 2007 6 commits
  16. 12 Oct, 2007 5 commits
    • Matthew Wilcox's avatar
      [SCSI] Get rid of scsi_cmnd->done · 6f5391c2
      Matthew Wilcox authored
      The ULD ->done callback moves into the scsi_driver.  By moving the call
      to scsi_io_completion() from scsi_blk_pc_done() to scsi_finish_command(),
      we can eliminate the latter entirely.  By returning 'good_bytes' from
      the ->done callback (rather than invoking scsi_io_completion()), we can
      stop exporting scsi_io_completion().
      
      Also move the prototypes from sd.h to sd.c as they're all internal anyway.
      Rename sd_rw_intr to sd_done and rw_intr to sr_done.
      Inspired-by: default avatarChristoph Hellwig <hch@infradead.org>
      Signed-off-by: default avatarMatthew Wilcox <willy@linux.intel.com>
      Signed-off-by: default avatarJames Bottomley <James.Bottomley@SteelEye.com>
      6f5391c2
    • James Bottomley's avatar
      [SCSI] Fix device not ready printk · 311b581e
      James Bottomley authored
      Because scsi_print_sense_hdr prefixes with KERN_INFO, the output from
      scsi_io_completion looks like:
      
      sd 0:0:0:0: [sdb] Device not ready: <6>: Sense Key : 0x2 [current]
      : ASC=0x4 ASCQ=0x3
      
      By using scsi_show_sense_hdr, we can get the much more appealing output:
      
      sd 0:0:0:0: [sdb] Device not ready: Sense Key : 0x2 [current]
      sd 0:0:0:0: [sdb] Device not ready: ASC=0x4 ASCQ=0x3
      Acked-by: default avatarMatthew Wilcox <willy@linux.intel.com>
      Signed-off-by: default avatarJames Bottomley <James.Bottomley@SteelEye.com>
      311b581e
    • James Bottomley's avatar
      [SCSI] move ULD attachment into the prep function · 7f9a6bc4
      James Bottomley authored
      One of the intents of the block prep function was to allow ULDs to use
      it for preprocessing.  The original SCSI model was to have a single prep
      function and add a pointer indirect filter to build the necessary
      commands.  This patch reverses that, does away with the init_command
      field of the scsi_driver structure and makes ULDs attach directly to the
      prep function instead.  The value is really that it allows us to begin
      to separate the ULDs from the SCSI mid layer (as long as they don't use
      any core functions---which is hard at the moment---a ULD doesn't even
      need SCSI to bind).
      Acked-by: default avatarJens Axboe <jens.axboe@oracle.com>
      Signed-off-by: default avatarJames Bottomley <James.Bottomley@SteelEye.com>
      7f9a6bc4
    • Michael Reed's avatar
      [SCSI] stale residual returned on write following BUSY retry · 52aeeca9
      Michael Reed authored
      A BUSY status returned on a write request results in a stale residual
      being returned when the write ultimately successfully completes.
      
      This can be reproduced as follows:
      
      1) issue immediate mode rewind to scsi tape drive
      2) issue write request
      
      The tape drive returns busy.  The low level driver detects underrun and
      sets the residual into the scsi command.  The low level driver responds
      with (DID_OK << 16) | scsi_status.  scsi_status is 8, hence
      status_byte(result) == 4, i.e., BUSY.
      
      scsi_softirq_done() calls scsi_decide_disposition() which returns
      ADD_TO_MLQUEUE.  scsi_softirq_done() then calls scsi_queue_insert()
      which, on the way to resubmitting the request to the driver, calls
      scsi_init_cmd_errh().
      
      The attached patch modifies scsi_init_cmd_errh() to clear the resid
      field.  This prevents a "stale" residual from being returned when the
      scsi command finally completes without a BUSY status.
      Signed-off-by: default avatarMichael Reed <mdr@sgi.com>
      Signed-off-by: default avatarJames Bottomley <James.Bottomley@SteelEye.com>
      52aeeca9
    • Mike Christie's avatar
      [SCSI] fix write buffer length in scsi_req_map_sg() · bd441dea
      Mike Christie authored
      sg's may have setup a the buffer with a different length than
      the transfer length so we should be using the bufflen passed
      in as the request's data len.
      Signed-off-by: default avatarMike Christie <michaelc@cs.wisc.edu>
      Signed-off-by: default avatarJames Bottomley <James.Bottomley@SteelEye.com>
      bd441dea