Linux 2.6.28.2
Subsystems (27)
We (the -stable team) are announcing the release of the 2.6.28.2 kernel.
It contains a wide range of bugfixes, and all users of the 2.6.28 kernel series are strongly encouraged to upgrade.
I'll also be replying to this message with a copy of the patch between 2.6.28.1 and 2.6.28.2
The updated 2.6.28.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-2.6.28.y.git
and can be browsed at the normal kernel.org git web browser:
http://git.kernel.org/?p=linux/kernel/git/stable/linux-2.6.28.y.git;a=summarythanks,
greg k-h
------------
Documentation/sound/alsa/ALSA-Configuration.txt | 3 Makefile | 2 arch/ia64/Kconfig | 1 arch/powerpc/mm/slice.c | 11 + drivers/firmware/dell_rbu.c | 4 drivers/hwmon/abituguru3.c | 2 drivers/misc/sgi-xp/xpc_sn2.c | 2 drivers/net/irda/irda-usb.c | 2 drivers/net/r6040.c | 17 +- drivers/net/wireless/p54/p54usb.c | 6 drivers/net/wireless/rt2x00/rt73usb.c | 1 drivers/pci/pcie/aspm.c | 125 ++++++++++++++-- drivers/usb/core/driver.c | 9 - drivers/usb/core/hub.c | 2 drivers/usb/core/message.c | 25 ++- drivers/usb/core/usb.c | 2 drivers/usb/core/usb.h | 4 drivers/usb/storage/libusual.c | 7 drivers/usb/storage/scsiglue.c | 31 ++++ drivers/usb/storage/transport.c | 80 ++++++++++ drivers/usb/storage/unusual_devs.h | 178 ++---------------------- drivers/usb/storage/usb.c | 6 drivers/usb/storage/usb.h | 4 fs/fs-writeback.c | 92 +++++++----- fs/sync.c | 2 include/linux/fs.h | 1 include/linux/usb_usual.h | 5 include/linux/writeback.h | 1 kernel/sched_fair.c | 2 lib/idr.c | 10 - mm/filemap.c | 18 -- mm/page-writeback.c | 121 +++++++++++----- net/bridge/netfilter/ebtables.c | 2 net/ipv4/netfilter/nf_conntrack_proto_icmp.c | 2 net/ipv4/tcp.c | 8 - net/ipv6/ip6_fib.c | 15 +- net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c | 2 net/netfilter/x_tables.c | 8 + net/sched/cls_u32.c | 3 net/sched/sch_htb.c | 1 net/sctp/sm_statefuns.c | 14 + security/keys/keyctl.c | 1 sound/pci/hda/patch_analog.c | 49 ++++++ sound/pci/hda/patch_realtek.c | 1 sound/pci/hda/patch_sigmatel.c | 16 ++ sound/pci/oxygen/virtuoso.c | 17 +- 46 files changed, 585 insertions(+), 330 deletions(-)
Alan Stern (3):
usb-storage: add last-sector hacks
usb-storage: set CAPACITY_HEURISTICS flag for bad vendors
USB: re-enable interface after driver unbinds
Alistair John Strachan (1):
hwmon: (abituguru3) Fix CONFIG_DMI=n fallback to probe
Andrew Morton (2):
lib/idr.c: use kmem_cache_zalloc() for the idr_layer cache
mm: write_cache_pages more terminate quickly
Christian Lamparter (1):
p54usb: fix traffic stalls / packet drop
Clemens Ladisch (1):
sound: virtuoso: do not overwrite EEPROM on Xonar D2/D2X
Dave Kleikamp (1):
powerpc: is_hugepage_only_range() must account for both 4kB and 64kB slices
Dean Nelson (1):
sgi-xp: eliminate false detection of no heartbeat
Florian Fainelli (1):
r6040: bump release number to 0.19
Giuseppe Bilotta (1):
ALSA: hda - Add quirk for another HP dv5
Greg Kroah-Hartman (1):
Linux 2.6.28.2
Herbert Xu (1):
ipv6: Fix fib6_dump_table walker leak
Jarek Poplawski (2):
pkt_sched: sch_htb: Fix deadlock in hrtimers triggered by HTB
pkt_sched: cls_u32: Fix locking in u32_change()
Joe Chou (2):
r6040: fix wrong logic in mdio code
r6040: save and restore MIER correctly in the interrupt routine
Jos-Vicente Gilabert (1):
drivers/net/irda/irda-usb.c: fix buffer overflow
Lennert Buytenhek (1):
tcp: don't mask EOF and socket errors on nonblocking splice receive
Luke Yelavich (1):
ALSA: hda - Add automatic model setting for Samsung Q45
Michiel (1):
p54usb: Add USB ID for Thomson Speedtouch 121g
Nick Piggin (12):
mm: write_cache_pages cyclic fix
mm: write_cache_pages early loop termination
mm: write_cache_pages writepage error fix
mm: write_cache_pages integrity fix
mm: write_cache_pages cleanups
mm: write_cache_pages optimise page cleaning
mm: write_cache_pages terminate quickly
mm: do_sync_mapping_range integrity fix
mm: direct IO starvation improvement
fs: remove WB_SYNC_HOLD
fs: sync_sb_inodes fix
fs: sys_sync fix
Patrick McHardy (3):
netfilter: x_tables: fix match/target revision lookup
netfilter: ebtables: fix inversion in match code
netfilter: nf_conntrack: fix ICMP/ICMPv6 timeout sysctls on big-endian
Pavel Roskin (1):
dell_rbu: use scnprintf() instead of less secure sprintf()
Peter Zijlstra (1):
sched: fix update_min_vruntime
Shaohua Li (1):
PCI: keep ASPM link state consistent throughout PCIe hierarchy
Stefan Lippers-Hollmann (1):
rt2x00: add USB ID for the Linksys WUSB200.
Takashi Iwai (3):
ALSA: hda - Fix HP dv5 mic input
ALSA: hda - Don't reset HP pinctl in patch_sigmatel.c
ALSA: hda - make laptop-eapd model back for AD1986A
Tony Luck (1):
IA64: Turn on CONFIG_HAVE_UNSTABLE_CLOCK
Vegard Nossum (1):
security: introduce missing kfree
Wei Yongjun (1):
sctp: Avoid memory overflow while FWD-TSN chunk is received with bad stream ID
Documentation/sound/alsa/ALSA-Configuration.txt +2 -1
@@ -979,9 +979,10 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed. 6stack 6-jack, separate surrounds (default) 3stack 3-stack, shared surrounds laptop 2-channel only (FSC V2060, Samsung M50) - laptop-eapd 2-channel with EAPD (Samsung R65, ASUS A6J) + laptop-eapd 2-channel with EAPD (ASUS A6J) laptop-automute 2-channel with EAPD and HP-automute (Lenovo N100) ultra 2-channel with EAPD (Samsung Ultra tablet PC) + samsung 2-channel with EAPD (Samsung R65) AD1988/AD1988B/AD1989A/AD1989B 6stack 6-jack
Makefile +1 -1
@@ -1,7 +1,7 @@ VERSION = 2 PATCHLEVEL = 6 SUBLEVEL = 28 -EXTRAVERSION = .1 +EXTRAVERSION = .2 NAME = Erotic Pickled Herring # *DOCUMENTATION*
arch/ia64/Kconfig +1 -0
@@ -17,6 +17,7 @@ config IA64 select ACPI if (!IA64_HP_SIM) select PM if (!IA64_HP_SIM) select ARCH_SUPPORTS_MSI + select HAVE_UNSTABLE_SCHED_CLOCK select HAVE_IDE select HAVE_OPROFILE select HAVE_KPROBES
arch/powerpc/mm/slice.c +10 -1
@@ -710,9 +710,18 @@ int is_hugepage_only_range(struct mm_struct *mm, unsigned long addr, unsigned long len) {struct slice_mask mask, available; +unsigned int psize = mm->context.user_psize; mask =slice_range_to_mask (addr, len); - available =slice_mask_for_size (mm, mm->context.user_psize); + available =slice_mask_for_size (mm, psize); +#ifdef CONFIG_PPC_64K_PAGES +/* We need to account for 4k slices too */ +if (psize ==MMU_PAGE_64K ) { +struct slice_mask compat_mask; + compat_mask =slice_mask_for_size (mm,MMU_PAGE_4K ); +or_mask (available, compat_mask); + } +#endif #if 0 /* too verbose */ slice_dbg("is_hugepage_only_range(mm=%p, addr=%lx, len=%lx)\n",
drivers/firmware/dell_rbu.c +2 -2
@@ -576,7 +576,7 @@ static ssize_t read_rbu_image_type(struct kobject *kobj, {int size =0 ;if (!pos) - size =sprintf (buffer,"%s\n" , image_type); + size =scnprintf (buffer, count,"%s\n" , image_type);return size; }
@@ -648,7 +648,7 @@ static ssize_t read_rbu_packet_size(struct kobject *kobj,int size =0 ;if (!pos) {spin_lock (&rbu_data.lock); - size =sprintf (buffer,"%lu\n" , rbu_data.packetsize); + size =scnprintf (buffer, count,"%lu\n" , rbu_data.packetsize);spin_unlock (&rbu_data.lock); }return size;
drivers/hwmon/abituguru3.c +1 -1
@@ -1153,7 +1153,7 @@ static int __init abituguru3_dmi_detect(void)static inline int abituguru3_dmi_detect (void ) { -return -ENODEV ; +return 1 ; }#endif /* CONFIG_DMI */
drivers/misc/sgi-xp/xpc_sn2.c +1 -1
@@ -904,7 +904,7 @@ xpc_update_partition_info_sn2(struct xpc_partition *part, u8 remote_rp_version,dev_dbg (xpc_part," remote_vars_pa = 0x%016lx\n" , part_sn2->remote_vars_pa); - part->last_heartbeat = remote_vars->heartbeat; + part->last_heartbeat = remote_vars->heartbeat -1 ;dev_dbg (xpc_part," last_heartbeat = 0x%016lx\n" , part->last_heartbeat);
drivers/net/irda/irda-usb.c +1 -1
@@ -1075,7 +1075,7 @@ static int stir421x_patch_device(struct irda_usb_cb *self) {unsigned int i;int ret; -char stir421x_fw_name[11 ]; +char stir421x_fw_name[12 ];const struct firmware *fw;const unsigned char *fw_version_ptr;/* pointer to version string */ unsigned long fw_version =0 ;
drivers/net/r6040.c +11 -6
@@ -49,8 +49,8 @@#include <asm/processor.h> #define DRV_NAME "r6040" -#define DRV_VERSION "0.18" -#define DRV_RELDATE "13Jul2008" +#define DRV_VERSION "0.19" +#define DRV_RELDATE "18Dec2008"/* PHY CHIP Address */ #define PHY1_ADDR 1/* For MAC1 */
@@ -214,7 +214,7 @@ static int r6040_phy_read(void __iomem *ioaddr, int phy_addr, int reg)/* Wait for the read bit to be cleared */ while (limit--) { cmd =ioread16 (ioaddr +MMDIO ); -if (cmd &MDIO_READ ) +if (!(cmd &MDIO_READ ))break ; }
@@ -233,7 +233,7 @@ static void r6040_phy_write(void __iomem *ioaddr, int phy_addr, int reg, u16 val/* Wait for the write bit to be cleared */ while (limit--) { cmd =ioread16 (ioaddr +MMDIO ); -if (cmd &MDIO_WRITE ) +if (!(cmd &MDIO_WRITE ))break ; } }
@@ -681,8 +681,10 @@ static irqreturn_t r6040_interrupt(int irq, void *dev_id)struct net_device *dev = dev_id;struct r6040_private *lp =netdev_priv (dev);void __iomem *ioaddr = lp->base; -u16 status; +u16 misr, status; +/* Save MIER */ + misr =ioread16 (ioaddr +MIER );/* Mask off RDC MAC interrupt */ iowrite16 (MSK_INT , ioaddr +MIER );/* Read MISR status and clear */
@@ -702,7 +704,7 @@ static irqreturn_t r6040_interrupt(int irq, void *dev_id) dev->stats.rx_fifo_errors++;/* Mask off RX interrupt */ -iowrite16 (ioread16 (ioaddr +MIER ) & ~RX_INTS , ioaddr +MIER ); + misr &= ~RX_INTS ;netif_rx_schedule (dev, &lp->napi); }
@@ -710,6 +712,9 @@ static irqreturn_t r6040_interrupt(int irq, void *dev_id)if (status &TX_INTS )r6040_tx (dev); +/* Restore RDC MAC interrupt */ +iowrite16 (misr, ioaddr +MIER ); +return IRQ_HANDLED ; }
drivers/net/wireless/p54/p54usb.c +6 -0
@@ -54,6 +54,7 @@ static struct usb_device_id p54u_table[] __devinitdata = { {USB_DEVICE(0x050d, 0x7050)}, /* Belkin F5D7050 ver 1000 */ {USB_DEVICE(0x0572, 0x2000)}, /* Cohiba Proto board */ {USB_DEVICE(0x0572, 0x2002)}, /* Cohiba Proto board */ + {USB_DEVICE(0x06b9, 0x0121)}, /* Thomson SpeedTouch 121g */ {USB_DEVICE(0x0707, 0xee13)}, /* SMC 2862W-G version 2 */ {USB_DEVICE(0x083a, 0x4521)}, /* Siemens Gigaset USB Adapter 54 version 2 */ {USB_DEVICE(0x0846, 0x4240)}, /* Netgear WG111 (v2) */
@@ -214,6 +215,8 @@ static void p54u_tx_3887(struct ieee80211_hw *dev, struct p54_control_hdr *data,usb_fill_bulk_urb (data_urb, priv->udev,usb_sndbulkpipe (priv->udev,P54U_PIPE_DATA ), data, len, free_on_tx ? p54u_tx_free_cb : p54u_tx_cb, dev); + addr_urb->transfer_flags |=URB_ZERO_PACKET ; + data_urb->transfer_flags |=URB_ZERO_PACKET ;usb_submit_urb (addr_urb,GFP_ATOMIC );usb_submit_urb (data_urb,GFP_ATOMIC );
@@ -251,6 +254,7 @@ static void p54u_tx_lm87(struct ieee80211_hw *dev,usb_sndbulkpipe (priv->udev,P54U_PIPE_DATA ), hdr, len +sizeof (*hdr), free_on_tx ? p54u_tx_free_cb : p54u_tx_cb, dev); + data_urb->transfer_flags |=URB_ZERO_PACKET ;usb_submit_urb (data_urb,GFP_ATOMIC ); }
@@ -293,11 +297,13 @@ static void p54u_tx_net2280(struct ieee80211_hw *dev, struct p54_control_hdr *dausb_fill_bulk_urb (int_urb, priv->udev,usb_sndbulkpipe (priv->udev,P54U_PIPE_DEV ), reg,sizeof (*reg), p54u_tx_free_cb, dev); + int_urb->transfer_flags |=URB_ZERO_PACKET ;usb_submit_urb (int_urb,GFP_ATOMIC );usb_fill_bulk_urb (data_urb, priv->udev,usb_sndbulkpipe (priv->udev,P54U_PIPE_DATA ), hdr, len +sizeof (*hdr), free_on_tx ? p54u_tx_free_cb : p54u_tx_cb, dev); + data_urb->transfer_flags |=URB_ZERO_PACKET ;usb_submit_urb (data_urb,GFP_ATOMIC ); }
drivers/net/wireless/rt2x00/rt73usb.c +1 -0
@@ -2434,6 +2434,7 @@ static struct usb_device_id rt73usb_device_table[] = {/* Linksys */ { USB_DEVICE(0x13b1, 0x0020), USB_DEVICE_DATA(&rt73usb_ops) }, { USB_DEVICE(0x13b1, 0x0023), USB_DEVICE_DATA(&rt73usb_ops) }, + { USB_DEVICE(0x13b1, 0x0028), USB_DEVICE_DATA(&rt73usb_ops) },/* MSI */ { USB_DEVICE(0x0db0, 0x6877), USB_DEVICE_DATA(&rt73usb_ops) }, { USB_DEVICE(0x0db0, 0x6874), USB_DEVICE_DATA(&rt73usb_ops) },
drivers/pci/pcie/aspm.c +106 -19
205 lines not on this page · raw message
drivers/usb/core/driver.c +6 -3
@@ -279,9 +279,12 @@ static int usb_unbind_interface(struct device *dev)* altsetting means creating new endpoint device entries). * When either of these happens, defer the Set-Interface. */ -if (intf->cur_altsetting->desc.bAlternateSetting ==0 ) - ;/* Already in altsetting 0 so skip Set-Interface */ -else if (!error && intf->dev.power.status ==DPM_ON ) +if (intf->cur_altsetting->desc.bAlternateSetting ==0 ) { +/* Already in altsetting 0 so skip Set-Interface. +* Just re-enable it without affecting the endpoint toggles. +*/ +usb_enable_interface (udev, intf, false); + }else if (!error && intf->dev.power.status ==DPM_ON )usb_set_interface (udev, intf->altsetting[0 ]. desc.bInterfaceNumber,0 );else
drivers/usb/core/hub.c +1 -1
@@ -2385,7 +2385,7 @@ void usb_ep0_reinit(struct usb_device *udev) {usb_disable_endpoint (udev,0 +USB_DIR_IN );usb_disable_endpoint (udev,0 +USB_DIR_OUT ); -usb_enable_endpoint (udev, &udev->ep0); +usb_enable_endpoint (udev, &udev->ep0, true); }EXPORT_SYMBOL_GPL (usb_ep0_reinit);
drivers/usb/core/message.c +15 -10
@@ -1113,22 +1113,26 @@ void usb_disable_device(struct usb_device *dev, int skip_ep0)* usb_enable_endpoint - Enable an endpoint for USB communications * @dev: the device whose interface is being enabled * @ep: the endpoint +* @reset_toggle: flag to set the endpoint's toggle back to 0 * -* Resets the endpoint toggle, and sets dev->ep_{in,out} pointers. +* Resets the endpoint toggle if asked, and sets dev->ep_{in,out} pointers. * For control endpoints, both the input and output sides are handled. */ -void usb_enable_endpoint (struct usb_device *dev,struct usb_host_endpoint *ep) +void usb_enable_endpoint (struct usb_device *dev,struct usb_host_endpoint *ep, +bool reset_toggle) {int epnum =usb_endpoint_num (&ep->desc);int is_out =usb_endpoint_dir_out (&ep->desc);int is_control =usb_endpoint_xfer_control (&ep->desc);if (is_out || is_control) { -usb_settoggle (dev, epnum,1 ,0 ); +if (reset_toggle) +usb_settoggle (dev, epnum,1 ,0 ); dev->ep_out[epnum] = ep; }if (!is_out || is_control) { -usb_settoggle (dev, epnum,0 ,0 ); +if (reset_toggle) +usb_settoggle (dev, epnum,0 ,0 ); dev->ep_in[epnum] = ep; } ep->enabled =1 ;
@@ -1138,17 +1142,18 @@ void usb_enable_endpoint(struct usb_device *dev, struct usb_host_endpoint *ep)* usb_enable_interface - Enable all the endpoints for an interface * @dev: the device whose interface is being enabled * @intf: pointer to the interface descriptor +* @reset_toggles: flag to set the endpoints' toggles back to 0 * * Enables all the endpoints for the interface's current altsetting. */ -static void usb_enable_interface (struct usb_device *dev, -struct usb_interface *intf) +void usb_enable_interface (struct usb_device *dev, +struct usb_interface *intf,bool reset_toggles) {struct usb_host_interface *alt = intf->cur_altsetting;int i;for (i =0 ; i < alt->desc.bNumEndpoints; ++i) -usb_enable_endpoint (dev, &alt->endpoint[i]); +usb_enable_endpoint (dev, &alt->endpoint[i], reset_toggles); }/**
@@ -1271,7 +1276,7 @@ int usb_set_interface(struct usb_device *dev, int interface, int alternate)* during the SETUP stage - hence EP0 toggles are "don't care" here. * (Likewise, EP0 never "halts" on well designed devices.) */ -usb_enable_interface (dev, iface); +usb_enable_interface (dev, iface, true);if (device_is_registered (&iface->dev))usb_create_sysfs_intf_files (iface);
@@ -1346,7 +1351,7 @@ int usb_reset_configuration(struct usb_device *dev) alt = &intf->altsetting[0 ]; intf->cur_altsetting = alt; -usb_enable_interface (dev, intf); +usb_enable_interface (dev, intf, true);if (device_is_registered (&intf->dev))usb_create_sysfs_intf_files (intf); }
@@ -1604,7 +1609,7 @@ free_interfaces: alt = &intf->altsetting[0 ]; intf->cur_altsetting = alt; -usb_enable_interface (dev, intf); +usb_enable_interface (dev, intf, true); intf->dev.parent = &dev->dev; intf->dev.driver =NULL ; intf->dev.bus = &usb_bus_type;
drivers/usb/core/usb.c +1 -1
@@ -362,7 +362,7 @@ struct usb_device *usb_alloc_dev(struct usb_device *parent, dev->ep0.desc.bLength =USB_DT_ENDPOINT_SIZE ; dev->ep0.desc.bDescriptorType =USB_DT_ENDPOINT ;/* ep0 maxpacket comes later, from device descriptor */ -usb_enable_endpoint (dev, &dev->ep0); +usb_enable_endpoint (dev, &dev->ep0, true); dev->can_submit =1 ;/* Save readable and stable topology id, distinguishing devices
drivers/usb/core/usb.h +3 -1
@@ -10,7 +10,9 @@ extern int usb_create_ep_files(struct device *parent,extern void usb_remove_ep_files (struct usb_host_endpoint *endpoint);extern void usb_enable_endpoint (struct usb_device *dev, -struct usb_host_endpoint *ep); +struct usb_host_endpoint *ep,bool reset_toggle); +extern void usb_enable_interface (struct usb_device *dev, +struct usb_interface *intf,bool reset_toggles);extern void usb_disable_endpoint (struct usb_device *dev,unsigned int epaddr);extern void usb_disable_interface (struct usb_device *dev,struct usb_interface *intf);
drivers/usb/storage/libusual.c +7 -0
@@ -46,6 +46,12 @@ static int usu_probe_thread(void *arg); { USB_DEVICE_VER(id_vendor, id_product, bcdDeviceMin,bcdDeviceMax), \ .driver_info = (flags)|(USB_US_TYPE_STOR<<24) } +#define COMPLIANT_DEV (id_vendor, id_product, bcdDeviceMin, bcdDeviceMax, \ + vendorName, productName, useProtocol, useTransport, \ + initFunction, flags) \ +{ USB_DEVICE_VER(id_vendor, id_product, bcdDeviceMin, bcdDeviceMax), \ + .driver_info = (flags) } +#define USUAL_DEV (useProto, useTrans, useType) \ { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, useProto, useTrans), \ .driver_info = ((useType)<<24) }
@@ -57,6 +63,7 @@ struct usb_device_id storage_usb_ids [] = {#undef USUAL_DEV#undef UNUSUAL_DEV +#undef COMPLIANT_DEVMODULE_DEVICE_TABLE (usb, storage_usb_ids);EXPORT_SYMBOL_GPL (storage_usb_ids);
drivers/usb/storage/scsiglue.c +31 -0
@@ -59,6 +59,13 @@#include "transport.h" #include "protocol.h" +/* Vendor IDs for companies that seem to include the READ CAPACITY bug +* in all their devices +*/ +#define VENDOR_ID_NOKIA 0x0421 +#define VENDOR_ID_NIKON 0x04b0 +#define VENDOR_ID_MOTOROLA 0x22b8 +/*********************************************************************** * Host functions ***********************************************************************/
@@ -134,6 +141,22 @@ static int slave_configure(struct scsi_device *sdev)* settings can't be overridden via the scsi devinfo mechanism. */ if (sdev->type ==TYPE_DISK ) { +/* Some vendors seem to put the READ CAPACITY bug into +* all their devices -- primarily makers of cell phones +* and digital cameras. Since these devices always use +* flash media and can be expected to have an even number +* of sectors, we will always enable the CAPACITY_HEURISTICS +* flag unless told otherwise. */ +switch (le16_to_cpu (us->pusb_dev->descriptor.idVendor)) { +case VENDOR_ID_NOKIA : +case VENDOR_ID_NIKON : +case VENDOR_ID_MOTOROLA : +if (!(us->fflags & (US_FL_FIX_CAPACITY | +US_FL_CAPACITY_OK ))) + us->fflags |=US_FL_CAPACITY_HEURISTICS ; +break ; + } +/* Disk-type devices use MODE SENSE(6) if the protocol * (SubClass) is Transparent SCSI, otherwise they use * MODE SENSE(10). */
@@ -196,6 +219,14 @@ static int slave_configure(struct scsi_device *sdev)* sector in a larger then 1 sector read, since the performance * impact is negible we set this flag for all USB disks */ sdev->last_sector_bug =1 ; + +/* Enable last-sector hacks for single-target devices using +* the Bulk-only transport, unless we already know the +* capacity will be decremented or is correct. */ +if (!(us->fflags & (US_FL_FIX_CAPACITY |US_FL_CAPACITY_OK | +US_FL_SCM_MULT_TARG )) && + us->protocol ==US_PR_BULK ) + us->use_last_sector_hacks =1 ; }else {/* Non-disk-type devices don't need to blacklist any pages
drivers/usb/storage/transport.c +80 -0
110 lines not on this page · raw message
drivers/usb/storage/unusual_devs.h +15 -163
220 lines not on this page · raw message
drivers/usb/storage/usb.c +6 -0
@@ -126,6 +126,8 @@ MODULE_PARM_DESC(delay_use, "seconds to delay before using a new device"); { USB_DEVICE_VER(id_vendor, id_product, bcdDeviceMin,bcdDeviceMax), \ .driver_info = (flags)|(USB_US_TYPE_STOR<<24) } +#define COMPLIANT_DEV UNUSUAL_DEV +#define USUAL_DEV (useProto, useTrans, useType) \ { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, useProto, useTrans), \ .driver_info = (USB_US_TYPE_STOR<<24) }
@@ -134,6 +136,7 @@ static struct usb_device_id storage_usb_ids [] = {# include "unusual_devs.h" #undef UNUSUAL_DEV +#undef COMPLIANT_DEV#undef USUAL_DEV/* Terminating entry */ { }
@@ -164,6 +167,8 @@ MODULE_DEVICE_TABLE (usb, storage_usb_ids); .initFunction = init_function, \ } +#define COMPLIANT_DEV UNUSUAL_DEV +#define USUAL_DEV (use_protocol, use_transport, use_type) \ { \ .useProtocol = use_protocol, \
@@ -173,6 +178,7 @@ MODULE_DEVICE_TABLE (usb, storage_usb_ids);static struct us_unusual_dev us_unusual_dev_list[] = { # include "unusual_devs.h" # undef UNUSUAL_DEV +# undef COMPLIANT_DEV # undef USUAL_DEV/* Terminating entry */
drivers/usb/storage/usb.h +4 -0
@@ -155,6 +155,10 @@ struct us_data {#ifdef CONFIG_PM pm_hook suspend_resume_hook;#endif + +/* hacks for READ CAPACITY bug handling */ +int use_last_sector_hacks; +int last_sector_retries; };/* Convert between us_data and the corresponding Scsi_Host */
fs/fs-writeback.c +56 -36
148 lines not on this page · raw message
fs/sync.c +1 -1
@@ -287,7 +287,7 @@ int do_sync_mapping_range(struct address_space *mapping, loff_t offset,if (flags &SYNC_FILE_RANGE_WRITE ) { ret =__filemap_fdatawrite_range (mapping, offset, endbyte, -WB_SYNC_NONE ); +WB_SYNC_ALL );if (ret <0 ) goto out; }
include/linux/fs.h +0 -1
@@ -1124,7 +1124,6 @@ struct super_block {struct rw_semaphore s_umount;struct mutex s_lock;int s_count; -int s_syncing;int s_need_sync_fs;atomic_t s_active;#ifdef CONFIG_SECURITY
include/linux/usb_usual.h +3 -2
@@ -52,8 +52,9 @@US_FLAG (MAX_SECTORS_MIN ,0x00002000 ) \ /* Sets max_sectors to arch min */ \US_FLAG (BULK_IGNORE_TAG ,0x00004000 ) \ - /* Ignore tag mismatch in bulk operations */ - + /* Ignore tag mismatch in bulk operations */ \ +US_FLAG (CAPACITY_OK ,0x00010000 ) \ + /* READ CAPACITY response is correct */#define US_FLAG (name, value) US_FL_##name = value ,enum {US_DO_ALL_FLAGS };
include/linux/writeback.h +0 -1
@@ -30,7 +30,6 @@ static inline int task_is_pdflush(struct task_struct *task)enum writeback_sync_modes {WB_SYNC_NONE ,/* Don't wait on anything */ WB_SYNC_ALL ,/* Wait on every mapping */ -WB_SYNC_HOLD ,/* Hold the inode on sb_dirty for sys_sync() */ };/*
kernel/sched_fair.c +1 -1
@@ -283,7 +283,7 @@ static void update_min_vruntime(struct cfs_rq *cfs_rq) struct sched_entity, run_node); -if (vruntime == cfs_rq->min_vruntime) +if (!cfs_rq->curr) vruntime = se->vruntime;else vruntime =min_vruntime (vruntime, se->vruntime);
lib/idr.c +2 -8
@@ -121,7 +121,7 @@ int idr_pre_get(struct idr *idp, gfp_t gfp_mask) {while (idp->id_free_cnt <IDR_FREE_MAX ) {struct idr_layer *new; - new =kmem_cache_alloc (idr_layer_cache, gfp_mask); + new =kmem_cache_zalloc (idr_layer_cache, gfp_mask);if (new ==NULL )return (0 );move_to_free_list (idp, new);
@@ -623,16 +623,10 @@ void *idr_replace(struct idr *idp, void *ptr, int id) }EXPORT_SYMBOL (idr_replace); -static void idr_cache_ctor (void *idr_layer) -{ -memset (idr_layer,0 ,sizeof (struct idr_layer )); -} -void __init idr_init_cache (void ) { idr_layer_cache =kmem_cache_create ("idr_layer_cache" , -sizeof (struct idr_layer ),0 ,SLAB_PANIC , - idr_cache_ctor); +sizeof (struct idr_layer ),0 ,SLAB_PANIC ,NULL ); }/**
mm/filemap.c +6 -12
@@ -210,7 +210,7 @@ int __filemap_fdatawrite_range(struct address_space *mapping, loff_t start,int ret;struct writeback_control wbc = { .sync_mode = sync_mode, - .nr_to_write = mapping->nrpages *2 , + .nr_to_write =LONG_MAX , .range_start = start, .range_end = end, };
@@ -1317,7 +1317,8 @@ generic_file_aio_read(struct kiocb *iocb, const struct iovec *iov, goto out;/* skip atime */ size =i_size_read (inode);if (pos < size) { - retval =filemap_write_and_wait (mapping); + retval =filemap_write_and_wait_range (mapping, pos, + pos +iov_length (iov, nr_segs) -1 );if (!retval) { retval = mapping->a_ops->direct_IO (READ , iocb, iov, pos, nr_segs);
@@ -2067,18 +2068,10 @@ generic_file_direct_write(struct kiocb *iocb, const struct iovec *iov,if (count != ocount) *nr_segs =iov_shorten ((struct iovec *)iov, *nr_segs, count); -/* -* Unmap all mmappings of the file up-front. -* -* This will cause any pte dirty bits to be propagated into the -* pageframes for the subsequent filemap_write_and_wait(). -*/ write_len =iov_length (iov, *nr_segs); end = (pos + write_len -1 ) >>PAGE_CACHE_SHIFT ; -if (mapping_mapped (mapping)) -unmap_mapping_range (mapping, pos, write_len,0 ); - written =filemap_write_and_wait (mapping); + written =filemap_write_and_wait_range (mapping, pos, pos + write_len -1 );if (written) goto out;
@@ -2298,7 +2291,8 @@ generic_file_buffered_write(struct kiocb *iocb, const struct iovec *iov,* the file data here, to try to honour O_DIRECT expectations. */ if (unlikely (file->f_flags &O_DIRECT ) && written) - status =filemap_write_and_wait (mapping); + status =filemap_write_and_wait_range (mapping, + pos, pos + written -1 );return written ? written : status; }
mm/page-writeback.c +87 -34
179 lines not on this page · raw message
net/bridge/netfilter/ebtables.c +1 -1
@@ -80,7 +80,7 @@ static inline int ebt_do_match (struct ebt_entry_match *m, { par->match = m->u.match; par->matchinfo = m->data; -return m->u.match->match (skb, par); +return m->u.match->match (skb, par) ?EBT_MATCH :EBT_NOMATCH ; }static inline int ebt_dev_check (char *entry,const struct net_device *device)
net/ipv4/netfilter/nf_conntrack_proto_icmp.c +1 -1
@@ -20,7 +20,7 @@#include <net/netfilter/nf_conntrack_core.h> #include <net/netfilter/nf_log.h> -static unsigned long nf_ct_icmp_timeout__read_mostly =30 *HZ ; +static unsigned int nf_ct_icmp_timeout__read_mostly =30 *HZ ;static bool icmp_pkt_to_tuple (const struct sk_buff *skb,unsigned int dataoff,struct nf_conntrack_tuple *tuple)
net/ipv4/tcp.c +4 -4
@@ -578,10 +578,6 @@ ssize_t tcp_splice_read(struct socket *sock, loff_t *ppos,else if (!ret) {if (spliced)break ; -if (flags &SPLICE_F_NONBLOCK ) { - ret = -EAGAIN ; -break ; - }if (sock_flag (sk,SOCK_DONE ))break ;if (sk->sk_err) {
@@ -599,6 +595,10 @@ ssize_t tcp_splice_read(struct socket *sock, loff_t *ppos, ret = -ENOTCONN ;break ; } +if (flags &SPLICE_F_NONBLOCK ) { + ret = -EAGAIN ; +break ; + }if (!timeo) { ret = -EAGAIN ;break ;
net/ipv6/ip6_fib.c +8 -7
@@ -298,6 +298,10 @@ static void fib6_dump_end(struct netlink_callback *cb)struct fib6_walker_t *w = (void *)cb->args[2 ];if (w) { +if (cb->args[4 ]) { + cb->args[4 ] =0 ; +fib6_walker_unlink (w); + } cb->args[2 ] =0 ;kfree (w); }
@@ -330,15 +334,12 @@ static int fib6_dump_table(struct fib6_table *table, struct sk_buff *skb,read_lock_bh (&table->tb6_lock); res =fib6_walk_continue (w);read_unlock_bh (&table->tb6_lock); -if (res !=0 ) { -if (res <0 ) -fib6_walker_unlink (w); - goto end; +if (res <=0 ) { +fib6_walker_unlink (w); + cb->args[4 ] =0 ; } -fib6_walker_unlink (w); - cb->args[4 ] =0 ; } -end: +return res; }
net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c +1 -1
@@ -26,7 +26,7 @@#include <net/netfilter/ipv6/nf_conntrack_icmpv6.h> #include <net/netfilter/nf_log.h> -static unsigned long nf_ct_icmpv6_timeout__read_mostly =30 *HZ ; +static unsigned int nf_ct_icmpv6_timeout__read_mostly =30 *HZ ; static bool icmpv6_pkt_to_tuple(const struct sk_buff *skb, unsigned int dataoff,
net/netfilter/x_tables.c +8 -0
@@ -273,6 +273,10 @@ static int match_revfn(u8 af, const char *name, u8 revision, int *bestp) have_rev =1 ; } } + +if (af !=NFPROTO_UNSPEC && !have_rev) +return match_revfn (NFPROTO_UNSPEC , name, revision, bestp); +return have_rev; }
@@ -289,6 +293,10 @@ static int target_revfn(u8 af, const char *name, u8 revision, int *bestp) have_rev =1 ; } } + +if (af !=NFPROTO_UNSPEC && !have_rev) +return target_revfn (NFPROTO_UNSPEC , name, revision, bestp); +return have_rev; }
net/sched/cls_u32.c +2 -1
@@ -637,8 +637,9 @@ static int u32_change(struct tcf_proto *tp, unsigned long base, u32 handle,break ; n->next = *ins; -wmb (); +tcf_tree_lock (tp); *ins = n; +tcf_tree_unlock (tp); *arg = (unsigned long )n;return 0 ;
net/sched/sch_htb.c +1 -0
@@ -924,6 +924,7 @@ static struct sk_buff *htb_dequeue(struct Qdisc *sch) } } sch->qstats.overlimits++; +qdisc_watchdog_cancel (&q->watchdog);qdisc_watchdog_schedule (&q->watchdog, next_event); fin:return skb;
net/sctp/sm_statefuns.c +14 -0
@@ -3691,6 +3691,7 @@ sctp_disposition_t sctp_sf_eat_fwd_tsn(const struct sctp_endpoint *ep, {struct sctp_chunk *chunk = arg;struct sctp_fwdtsn_hdr *fwdtsn_hdr; +struct sctp_fwdtsn_skip *skip;__u16 len;__u32 tsn;
@@ -3720,6 +3721,12 @@ sctp_disposition_t sctp_sf_eat_fwd_tsn(const struct sctp_endpoint *ep,if (sctp_tsnmap_check (&asoc->peer.tsn_map, tsn) <0 ) goto discard_noforce; +/* Silently discard the chunk if stream-id is not valid */ + sctp_walk_fwdtsn(skip, chunk) { +if (ntohs (skip->stream) >= asoc->c.sinit_max_instreams) + goto discard_noforce; + } +sctp_add_cmd_sf (commands,SCTP_CMD_REPORT_FWDTSN ,SCTP_U32 (tsn));if (len >sizeof (struct sctp_fwdtsn_hdr )) sctp_add_cmd_sf(commands, SCTP_CMD_PROCESS_FWDTSN,
@@ -3751,6 +3758,7 @@ sctp_disposition_t sctp_sf_eat_fwd_tsn_fast( {struct sctp_chunk *chunk = arg;struct sctp_fwdtsn_hdr *fwdtsn_hdr; +struct sctp_fwdtsn_skip *skip;__u16 len;__u32 tsn;
@@ -3780,6 +3788,12 @@ sctp_disposition_t sctp_sf_eat_fwd_tsn_fast(if (sctp_tsnmap_check (&asoc->peer.tsn_map, tsn) <0 ) goto gen_shutdown; +/* Silently discard the chunk if stream-id is not valid */ + sctp_walk_fwdtsn(skip, chunk) { +if (ntohs (skip->stream) >= asoc->c.sinit_max_instreams) + goto gen_shutdown; + } +sctp_add_cmd_sf (commands,SCTP_CMD_REPORT_FWDTSN ,SCTP_U32 (tsn));if (len >sizeof (struct sctp_fwdtsn_hdr )) sctp_add_cmd_sf(commands, SCTP_CMD_PROCESS_FWDTSN,
security/keys/keyctl.c +1 -0
@@ -270,6 +270,7 @@ long keyctl_join_session_keyring(const char __user *_name)/* join the session */ ret =join_session_keyring (name); +kfree (name); error:return ret;
sound/pci/hda/patch_analog.c +46 -3
79 lines not on this page · raw message
sound/pci/hda/patch_realtek.c +1 -0
@@ -10473,6 +10473,7 @@ static struct snd_pci_quirk alc262_cfg_tbl[] = {SND_PCI_QUIRK (0x10cf ,0x142d ,"Fujitsu Lifebook E8410" ,ALC262_FUJITSU ),SND_PCI_QUIRK (0x144d ,0xc032 ,"Samsung Q1 Ultra" ,ALC262_ULTRA ),SND_PCI_QUIRK (0x144d ,0xc039 ,"Samsung Q1U EL" ,ALC262_ULTRA ), +SND_PCI_QUIRK (0x144d ,0xc510 ,"Samsung Q45" ,ALC262_HIPPO ),SND_PCI_QUIRK (0x17aa ,0x384e ,"Lenovo 3000 y410" ,ALC262_LENOVO_3000 ),SND_PCI_QUIRK (0x17ff ,0x0560 ,"Benq ED8" ,ALC262_BENQ_ED8 ), SND_PCI_QUIRK(0x17ff, 0x058d, "Benq T31-16", ALC262_BENQ_T31),
sound/pci/hda/patch_sigmatel.c +16 -0
@@ -89,6 +89,7 @@ enum {STAC_DELL_M4_2 ,STAC_DELL_M4_3 ,STAC_HP_M4 , +STAC_HP_DV5 , STAC_92HD71BXX_MODELS };
@@ -1702,6 +1703,7 @@ static unsigned int *stac92hd71bxx_brd_tbl[STAC_92HD71BXX_MODELS] = { [STAC_DELL_M4_2] = dell_m4_2_pin_configs, [STAC_DELL_M4_3] = dell_m4_3_pin_configs, [STAC_HP_M4] = NULL, + [STAC_HP_DV5] = NULL, };static const char *stac92hd71bxx_models[STAC_92HD71BXX_MODELS ] = {
@@ -1710,6 +1712,7 @@ static const char *stac92hd71bxx_models[STAC_92HD71BXX_MODELS] = { [STAC_DELL_M4_2] = "dell-m4-2", [STAC_DELL_M4_3] = "dell-m4-3", [STAC_HP_M4] = "hp-m4", + [STAC_HP_DV5] = "hp-dv5", };static struct snd_pci_quirk stac92hd71bxx_cfg_tbl[] = {
@@ -1722,6 +1725,8 @@ static struct snd_pci_quirk stac92hd71bxx_cfg_tbl[] = { "HP dv7", STAC_HP_M4),SND_PCI_QUIRK (PCI_VENDOR_ID_HP ,0x30fc ,"HP dv7" ,STAC_HP_M4 ), +SND_PCI_QUIRK (PCI_VENDOR_ID_HP ,0x3603 , +"HP dv5" ,STAC_HP_DV5 ),SND_PCI_QUIRK (PCI_VENDOR_ID_HP ,0x361a ,"unknown HP" ,STAC_HP_M4 ), SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0233,
@@ -3980,8 +3985,19 @@ static void stac92xx_hp_detect(struct hda_codec *codec, unsigned int res)continue ;if (presence)stac92xx_set_pinctl (codec, cfg->hp_pins[i], val); +#if 0 /* FIXME */ +/* Resetting the pinctl like below may lead to (a sort of) regressions +* on some devices since they use the HP pin actually for line/speaker +* outs although the default pin config shows a different pin (that is +* wrong and useless). +* +* So, it's basically a problem of default pin configs, likely a BIOS issue. +* But, disabling the code below just works around it, and I'm too tired of +* bug reports with such devices... +*/ else stac92xx_reset_pinctl(codec, cfg->hp_pins[i], val); +#endif /* FIXME */ } }
sound/pci/oxygen/virtuoso.c +13 -4
@@ -26,7 +26,7 @@* SPI 0 -> 1st PCM1796 (front) * SPI 1 -> 2nd PCM1796 (surround) * SPI 2 -> 3rd PCM1796 (center/LFE) -* SPI 4 -> 4th PCM1796 (back) +* SPI 4 -> 4th PCM1796 (back) and EEPROM self-destruct (do not use!) * * GPIO 2 -> M0 of CS5381 * GPIO 3 -> M1 of CS5381
@@ -207,6 +207,12 @@ static void xonar_gpio_changed(struct oxygen *chip);static inline void pcm1796_write_spi (struct oxygen *chip,unsigned int codec,u8 reg,u8 value) { +/* +* We don't want to do writes on SPI 4 because the EEPROM, which shares +* the same pin, might get confused and broken. We'd better take care +* that the driver works with the default register values ... +*/ +#if 0 /* maps ALSA channel pair number to SPI output */ static const u8 codec_map[4 ] = { 0, 1, 2, 4
@@ -217,6 +223,7 @@ static inline void pcm1796_write_spi(struct oxygen *chip, unsigned int codec, (codec_map[codec] <<OXYGEN_SPI_CODEC_SHIFT ) |OXYGEN_SPI_CEN_LATCH_CLOCK_HI , (reg << 8) | value); +#endif } static inline void pcm1796_write_i2c(struct oxygen *chip, unsigned int codec,
@@ -750,6 +757,9 @@ static const DECLARE_TLV_DB_SCALE(cs4362a_db_scale, -12700, 100, 0);static int xonar_d2_control_filter (struct snd_kcontrol_new *template) { +if (!strncmp (template->name,"Master Playback " ,16 )) +/* disable volume/mute because they would require SPI writes */ +return 1 ;if (!strncmp (template->name,"CD Capture " ,11 ))/* CD in is actually connected to the video in pin */ template->private_value ^=AC97_CD ^AC97_VIDEO ;
@@ -840,9 +850,8 @@ static const struct oxygen_model model_xonar_d2 = { .dac_volume_min = 0x0f, .dac_volume_max = 0xff, .misc_flags = OXYGEN_MISC_MIDI, - .function_flags = OXYGEN_FUNCTION_SPI | - OXYGEN_FUNCTION_ENABLE_SPI_4_5, - .dac_i2s_format = OXYGEN_I2S_FORMAT_LJUST, + .function_flags = OXYGEN_FUNCTION_SPI, + .dac_i2s_format = OXYGEN_I2S_FORMAT_I2S, .adc_i2s_format = OXYGEN_I2S_FORMAT_LJUST, };