Git-Url: 
http://git.frugalware.org/gitweb/gitweb.cgi?p=frugalware-current.git;a=commitdiff;h=3594bfd59cdda30fe1c173cb634ff484407139b1

commit 3594bfd59cdda30fe1c173cb634ff484407139b1
Author: Michel Hermier <herm...@frugalware.org>
Date:   Tue Feb 1 22:53:54 2011 +0100

kernel-2.6.37-1-i686

* Add patch for udev issue (from stable queue).

diff --git a/source/base/kernel/FrugalBuild b/source/base/kernel/FrugalBuild
index 9a6aaac..f36f71f 100644
--- a/source/base/kernel/FrugalBuild
+++ b/source/base/kernel/FrugalBuild
@@ -5,7 +5,8 @@ USE_DEVEL=${USE_DEVEL:-"n"}

if ! Fuse $USE_DEVEL; then
_F_kernel_patches=(sched-cgroup-use-exit-hook-to-avoid-use-after-free-c.patch \
-               sched-fix-autogroup-reference-leak-and-cpu_cgroup_ex.patch)
+               sched-fix-autogroup-reference-leak-and-cpu_cgroup_ex.patch \
+               
libata-set-queue-dma-alignment-to-sector-size-for-atapi-too.patch)
else
# example for a tagged rc release: 2.6.32.rc5
# example for a random snapshot (based on git describe output): 
2.6.32.rc5.81.g964fe08
diff --git 
a/source/base/kernel/libata-set-queue-dma-alignment-to-sector-size-for-atapi-too.patch
 
b/source/base/kernel/libata-set-queue-dma-alignment-to-sector-size-for-atapi-too.patch
new file mode 100644
index 0000000..8c9422a
--- /dev/null
+++ 
b/source/base/kernel/libata-set-queue-dma-alignment-to-sector-size-for-atapi-too.patch
@@ -0,0 +1,80 @@
+6a300e628a48cf12bac93a964a535e83cd1d Mon Sep 17 00:00:00 2001
+From: Tejun Heo <hte...@gmail.com>
+Date: Thu, 20 Jan 2011 13:59:06 +0100
+Subject: libata: set queue DMA alignment to sector size for ATAPI too
+
+From: Tejun Heo <hte...@gmail.com>
+
+commit 729a6a300e628a48cf12bac93a964a535e83cd1d upstream.
+
+ata_pio_sectors() expects buffer for each sector to be contained in a
+single page; otherwise, it ends up overrunning the first page.  This
+is achieved by setting queue DMA alignment.  If sector_size is smaller
+than PAGE_SIZE and all buffers are sector_size aligned, buffer for
+each sector is always contained in a single page.
+
+This wasn't applied to ATAPI devices but IDENTIFY_PACKET is executed
+as ATA_PROT_PIO and thus uses ata_pio_sectors().  Newer versions of
+udev issue IDENTIFY_PACKET with unaligned buffer triggering the
+problem and causing oops.
+
+This patch fixes the problem by setting sdev->sector_size to
+ATA_SECT_SIZE on ATATPI devices and always setting DMA alignment to
+sector_size.  While at it, add a warning for the unlikely but still
+possible scenario where sector_size is larger than PAGE_SIZE, in which
+case the alignment wouldn't be enough.
+
+Signed-off-by: Tejun Heo <t...@kernel.org>
+Reported-by: John Stanley <jpsinthe...@verizon.net>
+Tested-by: John Stanley <jpsinthe...@verizon.net>
+Signed-off-by: Jeff Garzik <jgar...@redhat.com>
+Signed-off-by: Greg Kroah-Hartman <gre...@suse.de>
+
+---
+ drivers/ata/libata-scsi.c |   24 ++++++++++++++++++------
+ 1 file changed, 18 insertions(+), 6 deletions(-)
+
+--- a/drivers/ata/libata-scsi.c
++++ b/drivers/ata/libata-scsi.c
+@@ -1102,9 +1102,9 @@ static int ata_scsi_dev_config(struct sc
+               struct request_queue *q = sdev->request_queue;
+               void *buf;
+
+-              /* set the min alignment and padding */
+-              blk_queue_update_dma_alignment(sdev->request_queue,
+-                                             ATA_DMA_PAD_SZ - 1);
++              sdev->sector_size = ATA_SECT_SIZE;
++
++              /* set DMA padding */
+               blk_queue_update_dma_pad(sdev->request_queue,
+                                        ATA_DMA_PAD_SZ - 1);
+
+@@ -1118,13 +1118,25 @@ static int ata_scsi_dev_config(struct sc
+
+               blk_queue_dma_drain(q, atapi_drain_needed, buf, 
ATAPI_MAX_DRAIN);
+       } else {
+-              /* ATA devices must be sector aligned */
+               sdev->sector_size = ata_id_logical_sector_size(dev->id);
+-              blk_queue_update_dma_alignment(sdev->request_queue,
+-                                             sdev->sector_size - 1);
+               sdev->manage_start_stop = 1;
+       }
+
++      /*
++       * ata_pio_sectors() expects buffer for each sector to not cross
++       * page boundary.  Enforce it by requiring buffers to be sector
++       * aligned, which works iff sector_size is not larger than
++       * PAGE_SIZE.  ATAPI devices also need the alignment as
++       * IDENTIFY_PACKET is executed as ATA_PROT_PIO.
++       */
++      if (sdev->sector_size > PAGE_SIZE)
++              ata_dev_printk(dev, KERN_WARNING,
++                      "sector_size=%u > PAGE_SIZE, PIO may malfunction\n",
++                      sdev->sector_size);
++
++      blk_queue_update_dma_alignment(sdev->request_queue,
++                                     sdev->sector_size - 1);
++
+       if (dev->flags & ATA_DFLAG_AN)
+               set_bit(SDEV_EVT_MEDIA_CHANGE, sdev->supported_events);
+
_______________________________________________
Frugalware-git mailing list
Frugalware-git@frugalware.org
http://frugalware.org/mailman/listinfo/frugalware-git

Reply via email to