1. 15 Oct, 2008 5 commits
    • Stefan Richter's avatar
      ieee1394: raw1394: replace BKL by local mutex, make ioctl() and mmap() thread-safe · 10963ea1
      Stefan Richter authored
      This removes the last usage of the Big Kernel Lock from the ieee1394
      stack, i.e. from raw1394's (unlocked_)ioctl and compat_ioctl.
      
      The ioctl()s don't need to take the BKL, but they need to be serialized
      per struct file *.  In particular, accesses to ->iso_state need to be
      serial.  We simply use a blocking mutex for this purpose because
      libraw1394 does not use O_NONBLOCK.  In practice, there is no lock
      contention anyway because most if not all libraw1394 clients use a
      libraw1394 handle only in a single thread.
      
      mmap() also accesses ->iso_state.  Until now this was unprotected
      against concurrent changes by ioctls.  Fix this bug while we are at it.
      Signed-off-by: default avatarStefan Richter <stefanr@s5r6.in-berlin.de>
      10963ea1
    • Stefan Richter's avatar
      ieee1394: sbp2: enforce s/g segment size limit · ed6ffd08
      Stefan Richter authored
      1. We don't need to round the SBP-2 segment size limit down to a
         multiple of 4 kB (0xffff -> 0xf000).  It is only necessary to
         ensure quadlet alignment (0xffff -> 0xfffc).
      
      2. Use dma_set_max_seg_size() to tell the DMA mapping infrastructure
         and the block IO layer about the restriction.  This way we can
         remove the size checks and segment splitting in the queuecommand
         path.
      
         This assumes that no other code in the ieee1394 stack uses
         dma_map_sg() with conflicting requirements.  It furthermore assumes
         that the controller device's platform actually allows us to set the
         segment size to our liking.  Assert the latter with a BUG_ON().
      
      3. Also use blk_queue_max_segment_size() to tell the block IO layer
         about it.  It cannot know it because our scsi_add_host() does not
         point to the FireWire controller's device.
      
      We can also uniformly use dma_map_sg() for the single segment case just
      like for the multi segment case, to further simplify the code.
      
      Also clean up how the page table is converted to big endian.
      
      Thanks to Grant Grundler and FUJITA Tomonori for advice.
      Signed-off-by: default avatarStefan Richter <stefanr@s5r6.in-berlin.de>
      ed6ffd08
    • Stefan Richter's avatar
    • Stefan Richter's avatar
      ieee1394: sbp2: stricter dma_sync · 0a77b17c
      Stefan Richter authored
      Two dma_sync_single_for_cpu() were called in the wrong place.
      Luckily they were merely for DMA_TO_DEVICE, hence nobody noticed.
      
      Also reorder the matching dma_sync_single_for_device() a little bit
      so that they reside in the same functions as their counterparts.
      This also avoids syncing the s/g table for requests which don't use it.
      Signed-off-by: default avatarStefan Richter <stefanr@s5r6.in-berlin.de>
      0a77b17c
    • Julia Lawall's avatar
      ieee1394: Use DIV_ROUND_UP · 68e2aa79
      Julia Lawall authored
      Signed-off-by: default avatarJulia Lawall <julia@diku.dk>
      Signed-off-by: default avatarStefan Richter <stefanr@s5r6.in-berlin.de>
      68e2aa79
  2. 09 Oct, 2008 12 commits
  3. 08 Oct, 2008 3 commits
  4. 07 Oct, 2008 7 commits
  5. 06 Oct, 2008 13 commits