]> git.pld-linux.org Git - packages/kernel.git/blobdiff - kernel-small_fixes.patch
Revert "ACPI_IPMI=y and IPMI_HANDLER=y, https://lkml.org/lkml/2014/2/18/383"
[packages/kernel.git] / kernel-small_fixes.patch
index 3ccf00006092ea8197583e787111cff06cba7064..2d92e0bbc834c192335fcd551cdd4bf50b40f0f9 100644 (file)
@@ -46,220 +46,140 @@ index 7a0c800..ec5ebbb 100644
        SET_ETHTOOL_OPS(dev, &rtl8169_ethtool_ops);
        dev->watchdog_timeo = RTL8169_TX_TIMEOUT;
  
-commit 03bbcb2e7e292838bb0244f5a7816d194c911d62
-Author: Neil Horman <nhorman@tuxdriver.com>
-Date:   Tue Apr 16 16:38:32 2013 -0400
+[PATCH] SCSI: Don't attempt to send extended INQUIRY command if skip_vpd_pages is set
 
-    iommu/vt-d: add quirk for broken interrupt remapping on 55XX chipsets
+If a device has the skip_vpd_pages flag set we should simply fail the
+scsi_get_vpd_page() call.
+
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Acked-by: Alan Stern <stern@rowland.harvard.edu>
+Tested-by: Stuart Foster <smf.linux@ntlworld.com>
+Cc: stable@vger.kernel.org
+
+diff --git a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c
+index 3b1ea34..eaa808e 100644
+--- a/drivers/scsi/scsi.c
++++ b/drivers/scsi/scsi.c
+@@ -1031,6 +1031,9 @@
+ {
+       int i, result;
++      if (sdev->skip_vpd_pages)
++          goto fail;
++
+       /* Ask for all the pages supported by this device */
+       result = scsi_vpd_inquiry(sdev, buf, 0, buf_len);
+       if (result)
+commit 4d0ed18277cc6f07513ee0b04475f19cd69e75ef
+Author: Peter Hurley <peter@hurleysoftware.com>
+Date:   Tue Dec 10 17:12:02 2013 -0500
+
+    n_tty: Fix buffer overruns with larger-than-4k pastes
+    
+    readline() inadvertently triggers an error recovery path when
+    pastes larger than 4k overrun the line discipline buffer. The
+    error recovery path discards input when the line discipline buffer
+    is full and operating in canonical mode and no newline has been
+    received. Because readline() changes the termios to non-canonical
+    mode to read the line char-by-char, the line discipline buffer
+    can become full, and then when readline() restores termios back
+    to canonical mode for the caller, the now-full line discipline
+    buffer triggers the error recovery.
     
-    A few years back intel published a spec update:
-    http://www.intel.com/content/dam/doc/specification-update/5520-and-5500-chipset-ioh-specification-update.pdf
+    When changing termios from non-canon to canon mode and the read
+    buffer contains data, simulate an EOF push _without_ the
+    DISABLED_CHAR in the read buffer.
     
-    For the 5520 and 5500 chipsets which contained an errata (specificially errata
-    53), which noted that these chipsets can't properly do interrupt remapping, and
-    as a result the recommend that interrupt remapping be disabled in bios.  While
-    many vendors have a bios update to do exactly that, not all do, and of course
-    not all users update their bios to a level that corrects the problem.  As a
-    result, occasionally interrupts can arrive at a cpu even after affinity for that
-    interrupt has be moved, leading to lost or spurrious interrupts (usually
-    characterized by the message:
-    kernel: do_IRQ: 7.71 No irq handler for vector (irq -1)
+    Importantly for the readline() problem, the termios can be
+    changed back to non-canonical mode without changes to the read
+    buffer occurring; ie., as if the previous termios change had not
+    happened (as long as no intervening read took place).
     
-    There have been several incidents recently of people seeing this error, and
-    investigation has shown that they have system for which their BIOS level is such
-    that this feature was not properly turned off.  As such, it would be good to
-    give them a reminder that their systems are vulnurable to this problem.  For
-    details of those that reported the problem, please see:
-    https://bugzilla.redhat.com/show_bug.cgi?id=887006
+    Preserve existing userspace behavior which allows '\0's already
+    received in non-canon mode to be read as '\0's in canon mode
+    (rather than trigger add'l EOF pushes or an actual EOF).
     
-    [ Joerg: Removed CONFIG_IRQ_REMAP ifdef from early-quirks.c ]
+    Patch based on original proposal and discussion here
+    https://bugzilla.kernel.org/show_bug.cgi?id=55991
+    by Stas Sergeev <stsp@users.sourceforge.net>
     
-    Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
-    CC: Prarit Bhargava <prarit@redhat.com>
-    CC: Don Zickus <dzickus@redhat.com>
-    CC: Don Dutile <ddutile@redhat.com>
-    CC: Bjorn Helgaas <bhelgaas@google.com>
-    CC: Asit Mallick <asit.k.mallick@intel.com>
-    CC: David Woodhouse <dwmw2@infradead.org>
-    CC: linux-pci@vger.kernel.org
-    CC: Joerg Roedel <joro@8bytes.org>
-    CC: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
-    CC: Arkadiusz Miƛkiewicz <arekm@maven.pl>
-    Signed-off-by: Joerg Roedel <joro@8bytes.org>
+    Reported-by: Margarita Manterola <margamanterola@gmail.com>
+    Cc: Maximiliano Curia <maxy@gnuservers.com.ar>
+    Cc: Pavel Machek <pavel@ucw.cz>
+    Cc: Arkadiusz Miskiewicz <a.miskiewicz@gmail.com>
+    Acked-by: Stas Sergeev <stsp@users.sourceforge.net>
+    Signed-off-by: Peter Hurley <peter@hurleysoftware.com>
+    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
 
-diff --git a/arch/x86/include/asm/irq_remapping.h b/arch/x86/include/asm/irq_remapping.h
-index 95fd352..aca6aa2 100644
---- a/arch/x86/include/asm/irq_remapping.h
-+++ b/arch/x86/include/asm/irq_remapping.h
-@@ -28,6 +28,7 @@
- extern void setup_irq_remapping_ops(void);
- extern int irq_remapping_supported(void);
-+extern void set_irq_remapping_broken(void);
- extern int irq_remapping_prepare(void);
- extern int irq_remapping_enable(void);
- extern void irq_remapping_disable(void);
-@@ -54,6 +55,7 @@ void irq_remap_modify_chip_defaults(struct irq_chip *chip);
- static inline void setup_irq_remapping_ops(void) { }
- static inline int irq_remapping_supported(void) { return 0; }
-+static inline void set_irq_remapping_broken(void) { }
- static inline int irq_remapping_prepare(void) { return -ENODEV; }
- static inline int irq_remapping_enable(void) { return -ENODEV; }
- static inline void irq_remapping_disable(void) { }
-diff --git a/arch/x86/kernel/early-quirks.c b/arch/x86/kernel/early-quirks.c
-index 3755ef4..94ab6b9 100644
---- a/arch/x86/kernel/early-quirks.c
-+++ b/arch/x86/kernel/early-quirks.c
-@@ -18,6 +18,7 @@
- #include <asm/apic.h>
- #include <asm/iommu.h>
- #include <asm/gart.h>
-+#include <asm/irq_remapping.h>
- static void __init fix_hypertransport_config(int num, int slot, int func)
- {
-@@ -192,6 +193,21 @@ static void __init ati_bugs_contd(int num, int slot, int func)
+diff --git a/drivers/tty/n_tty.c b/drivers/tty/n_tty.c
+index fdc2ecd..961e6a9 100644
+--- a/drivers/tty/n_tty.c
++++ b/drivers/tty/n_tty.c
+@@ -104,6 +104,7 @@ struct n_tty_data {
+       /* must hold exclusive termios_rwsem to reset these */
+       unsigned char lnext:1, erasing:1, raw:1, real_raw:1, icanon:1;
++      unsigned char push:1;
+       /* shared by producer and consumer */
+       char read_buf[N_TTY_BUF_SIZE];
+@@ -341,6 +342,7 @@ static void reset_buffer_flags(struct n_tty_data *ldata)
+       ldata->erasing = 0;
+       bitmap_zero(ldata->read_flags, N_TTY_BUF_SIZE);
++      ldata->push = 0;
  }
- #endif
-+static void __init intel_remapping_check(int num, int slot, int func)
-+{
-+      u8 revision;
-+
-+      revision = read_pci_config_byte(num, slot, func, PCI_REVISION_ID);
-+
-+      /*
-+       * Revision 0x13 of this chipset supports irq remapping
-+       * but has an erratum that breaks its behavior, flag it as such
-+       */
-+      if (revision == 0x13)
-+              set_irq_remapping_broken();
-+
-+}
-+
- #define QFLAG_APPLY_ONCE      0x1
- #define QFLAG_APPLIED         0x2
- #define QFLAG_DONE            (QFLAG_APPLY_ONCE|QFLAG_APPLIED)
-@@ -221,6 +237,10 @@ static struct chipset early_qrk[] __initdata = {
-         PCI_CLASS_SERIAL_SMBUS, PCI_ANY_ID, 0, ati_bugs },
-       { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_SBX00_SMBUS,
-         PCI_CLASS_SERIAL_SMBUS, PCI_ANY_ID, 0, ati_bugs_contd },
-+      { PCI_VENDOR_ID_INTEL, 0x3403, PCI_CLASS_BRIDGE_HOST,
-+        PCI_BASE_CLASS_BRIDGE, 0, intel_remapping_check },
-+      { PCI_VENDOR_ID_INTEL, 0x3406, PCI_CLASS_BRIDGE_HOST,
-+        PCI_BASE_CLASS_BRIDGE, 0, intel_remapping_check },
-       {}
- };
-diff --git a/drivers/iommu/intel_irq_remapping.c b/drivers/iommu/intel_irq_remapping.c
-index f3b8f23..5b19b2d 100644
---- a/drivers/iommu/intel_irq_remapping.c
-+++ b/drivers/iommu/intel_irq_remapping.c
-@@ -524,6 +524,16 @@ static int __init intel_irq_remapping_supported(void)
-       if (disable_irq_remap)
-               return 0;
-+      if (irq_remap_broken) {
-+              WARN_TAINT(1, TAINT_FIRMWARE_WORKAROUND,
-+                         "This system BIOS has enabled interrupt remapping\n"
-+                         "on a chipset that contains an erratum making that\n"
-+                         "feature unstable.  To maintain system stability\n"
-+                         "interrupt remapping is being disabled.  Please\n"
-+                         "contact your BIOS vendor for an update\n");
-+              disable_irq_remap = 1;
-+              return 0;
-+      }
  
-       if (!dmar_ir_support())
-               return 0;
-diff --git a/drivers/iommu/irq_remapping.c b/drivers/iommu/irq_remapping.c
-index d56f8c1..3c11043 100644
---- a/drivers/iommu/irq_remapping.c
-+++ b/drivers/iommu/irq_remapping.c
-@@ -19,6 +19,7 @@
- int irq_remapping_enabled;
- int disable_irq_remap;
-+int irq_remap_broken;
- int disable_sourceid_checking;
- int no_x2apic_optout;
-@@ -211,6 +212,11 @@ void __init setup_irq_remapping_ops(void)
- #endif
- }
-+void set_irq_remapping_broken(void)
-+{
-+      irq_remap_broken = 1;
-+}
-+
- int irq_remapping_supported(void)
- {
-       if (disable_irq_remap)
-diff --git a/drivers/iommu/irq_remapping.h b/drivers/iommu/irq_remapping.h
-index ecb6376..90c4dae 100644
---- a/drivers/iommu/irq_remapping.h
-+++ b/drivers/iommu/irq_remapping.h
-@@ -32,6 +32,7 @@ struct pci_dev;
- struct msi_msg;
- extern int disable_irq_remap;
-+extern int irq_remap_broken;
- extern int disable_sourceid_checking;
- extern int no_x2apic_optout;
- extern int irq_remapping_enabled;
-@@ -89,6 +90,7 @@ extern struct irq_remap_ops amd_iommu_irq_ops;
- #define irq_remapping_enabled 0
- #define disable_irq_remap     1
-+#define irq_remap_broken      0
- #endif /* CONFIG_IRQ_REMAP */
-From patchwork Mon Jun  3 08:16:21 2013
-Content-Type: text/plain; charset="utf-8"
-MIME-Version: 1.0
-Content-Transfer-Encoding: 7bit
-Subject: ipv6: assign rt6_info to inet6_ifaddr in init_loopback
-Date: Sun, 02 Jun 2013 22:16:21 -0000
-From: Gao feng <gaofeng@cn.fujitsu.com>
-X-Patchwork-Id: 248198
-Message-Id: <1370247381-3091-1-git-send-email-gaofeng@cn.fujitsu.com>
-To: davem@davemloft.net, yoshfuji@linux-ipv6.org
-Cc: netdev@vger.kernel.org, jasowang@redhat.com,
- kumaran.4353@gmail.com, Maruthi.Thotad@ap.sony.com,
- Gao feng <gaofeng@cn.fujitsu.com>
-
-Commit 25fb6ca4ed9cad72f14f61629b68dc03c0d9713f
-"net IPv6 : Fix broken IPv6 routing table after loopback down-up"
-forgot to assign rt6_info to the inet6_ifaddr.
-When disable the net device, the rt6_info which allocated
-in init_loopback will not be destroied in __ipv6_ifa_notify.
-
-This will trigger the waring message below
-[23527.916091] unregister_netdevice: waiting for tap0 to become free. Usage count = 1
-
-Reported-by: Arkadiusz Miskiewicz <a.miskiewicz@gmail.com>
-Signed-off-by: Gao feng <gaofeng@cn.fujitsu.com>
-
----
-net/ipv6/addrconf.c | 4 +++-
- 1 file changed, 3 insertions(+), 1 deletion(-)
-
-diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
-index d1b2d80..1bbf744 100644
---- a/net/ipv6/addrconf.c
-+++ b/net/ipv6/addrconf.c
-@@ -2658,8 +2658,10 @@ static void init_loopback(struct net_device *dev)
-                       sp_rt = addrconf_dst_alloc(idev, &sp_ifa->addr, 0);
-                       /* Failure cases are ignored */
--                      if (!IS_ERR(sp_rt))
-+                      if (!IS_ERR(sp_rt)) {
-+                              sp_ifa->rt = sp_rt;
-                               ip6_ins_rt(sp_rt);
-+                      }
-               }
-               read_unlock_bh(&idev->lock);
+ static void n_tty_packet_mode_flush(struct tty_struct *tty)
+@@ -1745,7 +1747,16 @@ static void n_tty_set_termios(struct tty_struct *tty, struct ktermios *old)
+       if (!old || (old->c_lflag ^ tty->termios.c_lflag) & ICANON) {
+               bitmap_zero(ldata->read_flags, N_TTY_BUF_SIZE);
+-              ldata->line_start = ldata->canon_head = ldata->read_tail;
++              ldata->line_start = ldata->read_tail;
++              if (!L_ICANON(tty) || !read_cnt(ldata)) {
++                      ldata->canon_head = ldata->read_tail;
++                      ldata->push = 0;
++              } else {
++                      set_bit((ldata->read_head - 1) & (N_TTY_BUF_SIZE - 1),
++                              ldata->read_flags);
++                      ldata->canon_head = ldata->read_head;
++                      ldata->push = 1;
++              }
+               ldata->erasing = 0;
+               ldata->lnext = 0;
+       }
+@@ -1951,6 +1962,12 @@ static int copy_from_read_buf(struct tty_struct *tty,
+  *    it copies one line of input up to and including the line-delimiting
+  *    character into the user-space buffer.
+  *
++ *    NB: When termios is changed from non-canonical to canonical mode and
++ *    the read buffer contains data, n_tty_set_termios() simulates an EOF
++ *    push (as if C-d were input) _without_ the DISABLED_CHAR in the buffer.
++ *    This causes data already processed as input to be immediately available
++ *    as input although a newline has not been received.
++ *
+  *    Called under the atomic_read_lock mutex
+  *
+  *    n_tty_read()/consumer path:
+@@ -1997,7 +2014,7 @@ static int canon_copy_from_read_buf(struct tty_struct *tty,
+       n += found;
+       c = n;
+-      if (found && read_buf(ldata, eol) == __DISABLED_CHAR) {
++      if (found && !ldata->push && read_buf(ldata, eol) == __DISABLED_CHAR) {
+               n--;
+               eof_push = !n && ldata->read_tail != ldata->line_start;
+       }
+@@ -2024,7 +2041,10 @@ static int canon_copy_from_read_buf(struct tty_struct *tty,
+       ldata->read_tail += c;
+       if (found) {
+-              ldata->line_start = ldata->read_tail;
++              if (!ldata->push)
++                      ldata->line_start = ldata->read_tail;
++              else
++                      ldata->push = 0;
+               tty_audit_push(tty);
        }
+       return eof_push ? -EAGAIN : 0;
This page took 0.046269 seconds and 4 git commands to generate.