]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
add 2 patches to the review
authorGreg Kroah-Hartman <gregkh@suse.de>
Tue, 20 Mar 2007 04:16:01 +0000 (21:16 -0700)
committerGreg Kroah-Hartman <gregkh@suse.de>
Tue, 20 Mar 2007 04:16:01 +0000 (21:16 -0700)
review-2.6.20/input-i8042-another-attempt-to-fix-aux-delivery-checks.patch [new file with mode: 0644]
review-2.6.20/series
review-2.6.20/st-fix-tape-dies-if-wrong-block-size-used-bug-7919.patch [new file with mode: 0644]

diff --git a/review-2.6.20/input-i8042-another-attempt-to-fix-aux-delivery-checks.patch b/review-2.6.20/input-i8042-another-attempt-to-fix-aux-delivery-checks.patch
new file mode 100644 (file)
index 0000000..4143d23
--- /dev/null
@@ -0,0 +1,42 @@
+From 3ca5de6dd4ec5a139b2b8f00dce3e4726ca91af1 Mon Sep 17 00:00:00 2001
+From: Dmitry Torokhov <dtor@insightbb.com>
+Date: Wed, 7 Mar 2007 23:20:55 -0500
+Subject: Input: i8042 - another attempt to fix AUX delivery checks
+
+Do not assume that AUX_LOOP command is broken unless it
+completes successfully but returns wrong (unexpected) data.
+
+Cc: Chuck Ebbert <cebbert@redhat.com>
+Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/input/serio/i8042.c |   10 ++++++++--
+ 1 file changed, 8 insertions(+), 2 deletions(-)
+
+--- a/drivers/input/serio/i8042.c
++++ b/drivers/input/serio/i8042.c
+@@ -560,7 +560,8 @@ static int __devinit i8042_check_aux(voi
+  */
+       param = 0x5a;
+-      if (i8042_command(&param, I8042_CMD_AUX_LOOP) || param != 0x5a) {
++      retval = i8042_command(&param, I8042_CMD_AUX_LOOP);
++      if (retval || param != 0x5a) {
+ /*
+  * External connection test - filters out AT-soldered PS/2 i8042's
+@@ -574,7 +575,12 @@ static int __devinit i8042_check_aux(voi
+                   (param && param != 0xfa && param != 0xff))
+                       return -1;
+-              aux_loop_broken = 1;
++/*
++ * If AUX_LOOP completed without error but returned unexpected data
++ * mark it as broken
++ */
++              if (!retval)
++                      aux_loop_broken = 1;
+       }
+ /*
index a4bae5910efc500782a7f3b966c0ed903dc7aac5..fb97f5d7f0443d669f37a231dde4b130935807ea 100644 (file)
@@ -28,3 +28,5 @@ dio-invalidate-clean-pages-before-dio-write.patch
 input-i8042-fix-aux-irq-delivery-check.patch
 fix-deadlock-in-audit_log_task_context.patch
 uml-arch_prctl-should-set-thread-fs.patch
+input-i8042-another-attempt-to-fix-aux-delivery-checks.patch
+st-fix-tape-dies-if-wrong-block-size-used-bug-7919.patch
diff --git a/review-2.6.20/st-fix-tape-dies-if-wrong-block-size-used-bug-7919.patch b/review-2.6.20/st-fix-tape-dies-if-wrong-block-size-used-bug-7919.patch
new file mode 100644 (file)
index 0000000..31e10aa
--- /dev/null
@@ -0,0 +1,164 @@
+From stable-bounces@linux.kernel.org  Mon Mar 19 21:12:09 2007
+From: Kai Makisara <Kai.Makisara@kolumbus.fi>
+Date: Mon, 19 Mar 2007 16:58:57 -0700
+Subject: st: fix Tape dies if wrong block size used, bug 7919
+To: stable@kernel.org
+Cc: James Bottomley <James.Bottomley@steeleye.com>, Andreas Steinmetz <ast@domdv.de>, Kai Makisara <Kai.Makisara@kolumbus.fi>
+Message-ID: <20070319165857.c9187906.akpm@linux-foundation.org>
+
+From: Kai Makisara <Kai.Makisara@kolumbus.fi>
+
+[SCSI] st: fix Tape dies if wrong block size used, bug 7919
+
+On Thu, 1 Feb 2007, Andrew Morton wrote:
+> On Thu, 1 Feb 2007 15:34:29 -0800
+> bugme-daemon@bugzilla.kernel.org wrote:
+>
+> > http://bugzilla.kernel.org/show_bug.cgi?id=7919
+> >
+> >            Summary: Tape dies if wrong block size used
+> >     Kernel Version: 2.6.20-rc5
+> >             Status: NEW
+> >           Severity: normal
+> >              Owner: scsi_drivers-other@kernel-bugs.osdl.org
+> >          Submitter: dmartin@sccd.ctc.edu
+> >
+> >
+> > Most recent kernel where this bug did *NOT* occur: 2.6.17.14
+> >
+> > Other Kernels Tested and Results:
+> >
+> >     OK 2.6.15.7
+> >     OK 2.6.16.37
+> >     OK 2.6.17.14
+> >     BAD 2.6.18.6
+> >     BAD 2.6.18-1.2869.fc6
+> >     BAD 2.6.19.2 +
+> >     BAD 2.6.20-rc5
+> >
+> > NOTE: 2.6.18-1.2869.fc6 is a Fedora modified kernel, all others are from kernel.org
+> >
+...
+> > Steps to reproduce:
+> > Get a Adaptec AHA-2940U/UW/D / AIC-7881U card and a tape drive,
+> > install a recent kernel
+> > set the tape block size - mt setblk 4096
+> > read from or write to tape using wrong block size - tar -b 7 -cvf /dev/tape foo
+> >
+Write does not trigger this bug because the driver refuses in fixed block
+mode writes that are not a multiple of the block size. Read does trigger
+it in my system.
+
+The bug is not associated with any specific HBA. st tries to do direct i/o
+in fixed block mode with reads that are not a multiple of tape block size.
+
+The patch in this message fixes the st problem by switching to using the
+driver buffer up to the next close of the device file in fixed block mode
+if the user asks for a read like this.
+
+I don't know why the bug has surfaced only after 2.6.17 although the st
+problem is old. There may be another bug in the block subsystem and this
+patch works around it. However, the patch fixes a problem in st and in
+this way it is a valid fix.
+
+This patch may also fix the bug 7900.
+
+The patch compiles and is lightly tested.
+
+Signed-off-by: Kai Makisara <kai.makisara@kolumbus.fi>
+Cc: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/scsi/st.c |   23 +++++++++++++----------
+ drivers/scsi/st.h |    3 ++-
+ 2 files changed, 15 insertions(+), 11 deletions(-)
+
+--- a/drivers/scsi/st.c
++++ b/drivers/scsi/st.c
+@@ -9,7 +9,7 @@
+    Steve Hirsch, Andreas Koppenh"ofer, Michael Leodolter, Eyal Lebedinsky,
+    Michael Schaefer, J"org Weule, and Eric Youngdale.
+-   Copyright 1992 - 2006 Kai Makisara
++   Copyright 1992 - 2007 Kai Makisara
+    email Kai.Makisara@kolumbus.fi
+    Some small formal changes - aeb, 950809
+@@ -17,7 +17,7 @@
+    Last modified: 18-JAN-1998 Richard Gooch <rgooch@atnf.csiro.au> Devfs support
+  */
+-static const char *verstr = "20061107";
++static const char *verstr = "20070203";
+ #include <linux/module.h>
+@@ -1168,6 +1168,7 @@ static int st_open(struct inode *inode, 
+               STps = &(STp->ps[i]);
+               STps->rw = ST_IDLE;
+       }
++      STp->try_dio_now = STp->try_dio;
+       STp->recover_count = 0;
+       DEB( STp->nbr_waits = STp->nbr_finished = 0;
+            STp->nbr_requests = STp->nbr_dio = STp->nbr_pages = STp->nbr_combinable = 0; )
+@@ -1400,9 +1401,9 @@ static int setup_buffering(struct scsi_t
+       struct st_buffer *STbp = STp->buffer;
+       if (is_read)
+-              i = STp->try_dio && try_rdio;
++              i = STp->try_dio_now && try_rdio;
+       else
+-              i = STp->try_dio && try_wdio;
++              i = STp->try_dio_now && try_wdio;
+       if (i && ((unsigned long)buf & queue_dma_alignment(
+                                       STp->device->request_queue)) == 0) {
+@@ -1599,7 +1600,7 @@ st_write(struct file *filp, const char _
+                       STm->do_async_writes && STps->eof < ST_EOM_OK;
+               if (STp->block_size != 0 && STm->do_buffer_writes &&
+-                  !(STp->try_dio && try_wdio) && STps->eof < ST_EOM_OK &&
++                  !(STp->try_dio_now && try_wdio) && STps->eof < ST_EOM_OK &&
+                   STbp->buffer_bytes < STbp->buffer_size) {
+                       STp->dirty = 1;
+                       /* Don't write a buffer that is not full enough. */
+@@ -1769,7 +1770,7 @@ static long read_tape(struct scsi_tape *
+       if (STp->block_size == 0)
+               blks = bytes = count;
+       else {
+-              if (!(STp->try_dio && try_rdio) && STm->do_read_ahead) {
++              if (!(STp->try_dio_now && try_rdio) && STm->do_read_ahead) {
+                       blks = (STp->buffer)->buffer_blocks;
+                       bytes = blks * STp->block_size;
+               } else {
+@@ -1948,10 +1949,12 @@ st_read(struct file *filp, char __user *
+               goto out;
+       STm = &(STp->modes[STp->current_mode]);
+-      if (!(STm->do_read_ahead) && STp->block_size != 0 &&
+-          (count % STp->block_size) != 0) {
+-              retval = (-EINVAL);     /* Read must be integral number of blocks */
+-              goto out;
++      if (STp->block_size != 0 && (count % STp->block_size) != 0) {
++              if (!STm->do_read_ahead) {
++                      retval = (-EINVAL);     /* Read must be integral number of blocks */
++                      goto out;
++              }
++              STp->try_dio_now = 0;  /* Direct i/o can't handle split blocks */
+       }
+       STps = &(STp->ps[STp->partition]);
+--- a/drivers/scsi/st.h
++++ b/drivers/scsi/st.h
+@@ -117,7 +117,8 @@ struct scsi_tape {
+       unsigned char cln_sense_value;
+       unsigned char cln_sense_mask;
+       unsigned char use_pf;                   /* Set Page Format bit in all mode selects? */
+-      unsigned char try_dio;                  /* try direct i/o? */
++      unsigned char try_dio;                  /* try direct i/o in general? */
++      unsigned char try_dio_now;              /* try direct i/o before next close? */
+       unsigned char c_algo;                   /* compression algorithm */
+       unsigned char pos_unknown;                      /* after reset position unknown */
+       int tape_type;