From: Greg Kroah-Hartman Date: Tue, 20 Mar 2007 04:16:01 +0000 (-0700) Subject: add 2 patches to the review X-Git-Tag: v2.6.20.4~2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=7cef889f2759fa23d5d2f6847f522450880ffe6e;p=thirdparty%2Fkernel%2Fstable-queue.git add 2 patches to the review --- 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 index 00000000000..4143d233258 --- /dev/null +++ b/review-2.6.20/input-i8042-another-attempt-to-fix-aux-delivery-checks.patch @@ -0,0 +1,42 @@ +From 3ca5de6dd4ec5a139b2b8f00dce3e4726ca91af1 Mon Sep 17 00:00:00 2001 +From: Dmitry Torokhov +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 +Signed-off-by: Dmitry Torokhov +Signed-off-by: Greg Kroah-Hartman + +--- + 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(¶m, I8042_CMD_AUX_LOOP) || param != 0x5a) { ++ retval = i8042_command(¶m, 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; + } + + /* diff --git a/review-2.6.20/series b/review-2.6.20/series index a4bae5910ef..fb97f5d7f04 100644 --- a/review-2.6.20/series +++ b/review-2.6.20/series @@ -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 index 00000000000..31e10aac579 --- /dev/null +++ b/review-2.6.20/st-fix-tape-dies-if-wrong-block-size-used-bug-7919.patch @@ -0,0 +1,164 @@ +From stable-bounces@linux.kernel.org Mon Mar 19 21:12:09 2007 +From: Kai Makisara +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 , Andreas Steinmetz , Kai Makisara +Message-ID: <20070319165857.c9187906.akpm@linux-foundation.org> + +From: Kai Makisara + +[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 +Cc: Andrew Morton +Signed-off-by: James Bottomley +Signed-off-by: Greg Kroah-Hartman + +--- + 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 Devfs support + */ + +-static const char *verstr = "20061107"; ++static const char *verstr = "20070203"; + + #include + +@@ -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;