Linux 3.0.46
I'm announcing the release of the 3.0.46 kernel.
All users of the 3.0 kernel series must upgrade.
The updated 3.0.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-3.0.y
and can be browsed at the normal kernel.org git web browser:
http://git.kernel.org/?p=linux/kernel/git/stable/linux-stable.git;a=summary
thanks,
greg k-h
------------
Makefile | 2 arch/mn10300/Makefile | 2 arch/x86/include/asm/pgtable.h | 11 drivers/acpi/bus.c | 8 drivers/block/aoe/aoecmd.c | 1 drivers/gpu/drm/radeon/radeon_irq_kms.c | 10 drivers/gpu/drm/radeon/radeon_pm.c | 8 drivers/media/rc/ite-cir.c | 2 drivers/mtd/maps/autcpu12-nvram.c | 19 - drivers/mtd/nand/nand_bbt.c | 2 drivers/mtd/nand/nandsim.c | 1 drivers/mtd/nand/omap2.c | 3 drivers/net/davinci_cpdma.c | 1 drivers/net/netxen/netxen_nic_main.c | 4 drivers/net/pppoe.c | 2 drivers/net/r8169.c | 444 ++++++++++++++++++++++++-------- drivers/net/tg3.c | 14 - drivers/net/usb/sierra_net.c | 2 drivers/net/wan/ixp4xx_hss.c | 1 drivers/pci/hotplug/acpiphp_glue.c | 7 drivers/pci/probe.c | 6 drivers/s390/scsi/zfcp_aux.c | 1 drivers/s390/scsi/zfcp_ccw.c | 73 ++++- drivers/s390/scsi/zfcp_cfdc.c | 2 drivers/s390/scsi/zfcp_dbf.c | 20 + drivers/s390/scsi/zfcp_dbf.h | 1 drivers/s390/scsi/zfcp_def.h | 2 drivers/s390/scsi/zfcp_ext.h | 2 drivers/s390/scsi/zfcp_fsf.c | 23 + drivers/s390/scsi/zfcp_sysfs.c | 18 + drivers/s390/scsi/zfcp_unit.c | 36 +- drivers/scsi/atp870u.c | 11 fs/ext4/inode.c | 8 fs/ext4/move_extent.c | 7 fs/ext4/namei.c | 2 include/linux/mempolicy.h | 2 include/linux/xfrm.h | 2 include/net/xfrm.h | 3 kernel/cpuset.c | 3 kernel/rcutree.c | 4 kernel/sched.c | 40 ++ kernel/sys.c | 1 kernel/workqueue.c | 2 lib/gcd.c | 3 mm/mempolicy.c | 137 ++++++--- mm/truncate.c | 3 net/8021q/vlan_core.c | 3 net/core/dev.c | 14 - net/core/sock.c | 3 net/ipv4/raw.c | 14 - net/ipv4/tcp.c | 10 net/ipv6/mip6.c | 20 - net/ipv6/raw.c | 21 - net/ipv6/route.c | 11 net/l2tp/l2tp_eth.c | 2 net/netrom/af_netrom.c | 7 net/sched/sch_cbq.c | 5 net/sched/sch_qfq.c | 5 net/sctp/output.c | 21 + net/xfrm/xfrm_input.c | 2 net/xfrm/xfrm_policy.c | 2 net/xfrm/xfrm_replay.c | 15 + net/xfrm/xfrm_user.c | 57 +++- scripts/Kbuild.include | 2 sound/drivers/aloop.c | 6 sound/soc/codecs/wm9712.c | 2 sound/usb/mixer.c | 7 sound/usb/quirks-table.h | 53 +++ 68 files changed, 944 insertions(+), 294 deletions(-)
Alan Cox (1):
netrom: copy_datagram_iovec can fail
Alex Deucher (3):
drm/radeon: only adjust default clocks on NI GPUs drm/radeon: Add MSI quirk for gateway RS690 drm/radeon: force MSIs on RS690 asics
Alexander Shiyan (1):
mtd: autcpu12-nvram: Fix compile breakage
Andrea Arcangeli (1):
mm: thp: fix pmd_present for split_huge_page and PROT_NONE with THP
Andreas Bießmann (2):
mtd: omap2: fix omap_nand_remove segfault
mtd: omap2: fix module loading
Antonio Quartulli (1):
8021q: fix mac_len recomputation in vlan_untag()
Ben Hutchings (1):
media: rc: ite-cir: Initialise ite_dev::rdev earlier
Bernd Schubert (1):
ext4: always set i_op in ext4_mknod()
Bjorn Helgaas (1):
PCI: acpiphp: check whether _ADR evaluation succeeded
Chema Gonzalez (1):
net: small bug on rxhash calculation
David Henningsson (1):
ALSA: usb - disable broken hw volume for Tenx TP6911
Davidlohr Bueso (1):
lib/gcd.c: prevent possible div by 0
Devendra Naga (1):
r8169: call netif_napi_del at errpaths and at driver unload
Dmitry Monakhov (1):
ext4: online defrag is not supported for journaled files
Ed L. Cashin (2):
net: do not disable sg for packets requiring no checksum
aoe: assert AoE packets marked as requiring no checksum
Eric Dumazet (6):
net-sched: sch_cbq: avoid infinite loop
net: guard tcp_set_keepalive() to tcp sockets
ipv4: raw: fix icmp_filter()
ipv6: raw: fix icmpv6_filter()
ipv6: mip6: fix mip6_mh_filter()
l2tp: fix a typo in l2tp_eth_dev_recv()
Florian Fainelli (1):
ixp4xx_hss: fix build failure due to missing linux/module.h inclusion
Francois Romieu (7):
r8169: remove erroneous processing of always set bit.
r8169: jumbo fixes.
r8169: expand received packet length indication.
r8169: Rx FIFO overflow fixes.
r8169: missing barriers.
r8169: Config1 is read-only on 8168c and later.
r8169: 8168c and later require bit 0x20 to be set in Config2 for PME signaling.
Gao feng (1):
ipv6: release reference of ip6_null_entry's dst entry in __ip6_del_rt
Geert Uytterhoeven (1):
mn10300: only add -mmem-funcs to KBUILD_CFLAGS if gcc supports it
Greg Kroah-Hartman (1):
Linux 3.0.46
Hayes Wang (2):
r8169: fix wake on lan setting for non-8111E.
r8169: don't enable rx when shutdown.
Hugh Dickins (1):
mm: fix invalidate_complete_page2() lock ordering
Jan Kara (1):
ext4: fix fdatasync() for files with only i_size changes
Julia Lawall (1):
SCSI: zfcp: remove invalid reference to list iterator variable
Julien Ducourthial (1):
r8169: fix unsigned int wraparound with TSO
KOSAKI Motohiro (3):
revert "mm: mempolicy: Let vma_merge and vma_split handle vma->vm_policy linkages"
mempolicy: remove mempolicy sharing
mempolicy: fix refcount leak in mpol_set_shared_policy()
Lennart Sorensen (1):
sierra_net: Endianess bug fix.
Li RongQing (1):
xfrm: fix a read lock imbalance in make_blackhole
Lin Ming (1):
ACPI: run _OSC after ACPI_FULL_INITIALIZATION
Mark Brown (1):
ASoC: wm9712: Fix name of Capture Switch
Marko Friedemann (1):
ALSA: USB: Support for (original) Xbox Communicator
Martin Michlmayr (1):
drivers/scsi/atp870u.c: fix bad use of udelay
Martin Peschke (1):
SCSI: zfcp: only access zfcp_scsi_dev for valid scsi_device
Mathias Krause (8):
xfrm_user: return error pointer instead of NULL
xfrm_user: return error pointer instead of NULL #2
xfrm_user: fix info leak in copy_to_user_auth()
xfrm_user: fix info leak in copy_to_user_state()
xfrm_user: fix info leak in copy_to_user_policy()
xfrm_user: fix info leak in copy_to_user_tmpl()
xfrm_user: don't copy esn replay window twice for new states
xfrm_user: ensure user supplied esn replay window is valid
Matt Carlson (1):
tg3: Fix TSO CAP for 5704 devs w / ASF enabled
Mel Gorman (2):
mempolicy: fix a race in shared_policy_replace()
mempolicy: fix a memory corruption by refcount imbalance in alloc_pages_vma()
Michal Kubeček (1):
tcp: flush DMA queue before sk_wait_data if rcv_wnd is zero
Nikolay Aleksandrov (1):
netxen: check for root bus in netxen_mask_aer_correctable
Omair Mohammed Abdullah (1):
ALSA: aloop - add locking to timer access
Paolo Valente (1):
pkt_sched: fix virtual-start-time update in QFQ
Paul E. McKenney (1):
rcu: Fix day-one dyntick-idle stall-warning bug
Richard Genoud (1):
mtd: nandsim: bugfix: fail if overridesize is too big
Sascha Hauer (1):
kbuild: make: fix if_changed when command contains backslashes
Shawn Guo (1):
kernel/sys.c: call disable_nonboot_cpus() in kernel_restart()
Shmulik Ladkani (1):
mtd: nand: Use the mirror BBT descriptor when reading its version
Srivatsa S. Bhat (1):
CPU hotplug, cpusets, suspend: Don't modify cpusets during suspend/resume
Steffen Klassert (1):
xfrm: Workaround incompatibility of ESN and async crypto
Steffen Maier (3):
SCSI: zfcp: Make trace record tags unique
SCSI: zfcp: Do not wakeup while suspended
SCSI: zfcp: restore refcount check on port_remove
Tejun Heo (1):
workqueue: add missing smp_wmb() in process_one_work()
Thomas Graf (1):
sctp: Don't charge for data in sndbuf again when transmitting packet
Xiaodong Xu (1):
pppoe: drop PPPOX_ZOMBIEs in pppoe_release
Yinghai Lu (1):
PCI: Check P2P bridge for invalid secondary/subordinate range
françois romieu (2):
r8169: fix Config2 MSIEnable bit setting.
r8169: runtime resume before shutdown.
hayeswang (1):
r8169: increase the delay parameter of pm_schedule_suspend
htbegin (1):
net: ethernet: davinci_cpdma: decrease the desc count when cleaning up the remaining packets
Makefile +1 -1
@@ -1,6 +1,6 @@ VERSION = 3 PATCHLEVEL = 0 -SUBLEVEL = 45 +SUBLEVEL = 46 EXTRAVERSION = NAME = Sneaky Weasel
arch/mn10300/Makefile +1 -1
@@ -26,7 +26,7 @@ CHECKFLAGS += PROCESSOR := unset UNIT := unset -KBUILD_CFLAGS += -mam33 -mmem-funcs -DCPU=AM33 +KBUILD_CFLAGS += -mam33 -DCPU=AM33 $(call cc-option,-mmem-funcs,) KBUILD_AFLAGS += -mam33 -DCPU=AM33 ifeq ($(CONFIG_MN10300_CURRENT_IN_E2),y)
arch/x86/include/asm/pgtable.h +8 -3
@@ -146,8 +146,7 @@ static inline unsigned long pmd_pfn(pmd_t pmd)static inline int pmd_large (pmd_t pte) { -return (pmd_flags (pte) & (_PAGE_PSE | _PAGE_PRESENT)) == - (_PAGE_PSE | _PAGE_PRESENT); +return pmd_flags (pte) & _PAGE_PSE; }#ifdef CONFIG_TRANSPARENT_HUGEPAGE
@@ -415,7 +414,13 @@ static inline int pte_hidden(pte_t pte)static inline int pmd_present (pmd_t pmd) { -return pmd_flags (pmd) & _PAGE_PRESENT; +/* +* Checking for _PAGE_PSE is needed too because +* split_huge_page will temporarily clear the present bit (but +* the _PAGE_PSE flag will remain set at all times while the +* _PAGE_PRESENT bit is clear). +*/ +return pmd_flags (pmd) & (_PAGE_PRESENT | _PAGE_PROTNONE | _PAGE_PSE); }static inline int pmd_none (pmd_t pmd)
drivers/acpi/bus.c +6 -2
@@ -944,8 +944,6 @@ static int __init acpi_bus_init(void) status =acpi_ec_ecdt_probe ();/* Ignore result. Not having an ECDT is not fatal. */ -acpi_bus_osc_support (); - status =acpi_initialize_objects (ACPI_FULL_INITIALIZATION );if (ACPI_FAILURE (status)) { printk(KERN_ERR PREFIX "Unable to initialize ACPI objects\n");
@@ -953,6 +951,12 @@ static int __init acpi_bus_init(void) }/* +* _OSC method may exist in module level code, +* so it must be run after ACPI_FULL_INITIALIZATION +*/ +acpi_bus_osc_support (); + +/* * _PDC control method may load dynamic SSDT tables, * and we need to install the table handler before that. */
drivers/block/aoe/aoecmd.c +1 -0
@@ -35,6 +35,7 @@ new_skb(ulong len)skb_reset_mac_header (skb);skb_reset_network_header (skb); skb->protocol =__constant_htons (ETH_P_AOE ); +skb_checksum_none_assert (skb); }return skb; }
drivers/gpu/drm/radeon/radeon_irq_kms.c +10 -0
@@ -143,6 +143,16 @@ static bool radeon_msi_ok(struct radeon_device *rdev) (rdev->pdev->subsystem_device == 0x01fd))return true; +/* Gateway RS690 only seems to work with MSIs. */ +if ((rdev->pdev->device ==0x791f ) && + (rdev->pdev->subsystem_vendor ==0x107b ) && + (rdev->pdev->subsystem_device ==0x0185 )) +return true; + +/* try and enable MSIs by default on all RS690s */ +if (rdev->family ==CHIP_RS690 ) +return true; +/* RV515 seems to have MSI issues where it loses * MSI rearms occasionally. This leads to lockups and freezes. * disable it by default.
drivers/gpu/drm/radeon/radeon_pm.c +6 -2
@@ -535,7 +535,9 @@ void radeon_pm_suspend(struct radeon_device *rdev)void radeon_pm_resume (struct radeon_device *rdev) {/* set up the default clocks if the MC ucode is loaded */ -if (ASIC_IS_DCE5 (rdev) && rdev->mc_fw) { +if ((rdev->family >=CHIP_BARTS ) && + (rdev->family <=CHIP_CAYMAN ) && + rdev->mc_fw) {if (rdev->pm.default_vddc)radeon_atom_set_voltage (rdev, rdev->pm.default_vddc,SET_VOLTAGE_TYPE_ASIC_VDDC );
@@ -590,7 +592,9 @@ int radeon_pm_init(struct radeon_device *rdev)radeon_pm_print_states (rdev);radeon_pm_init_profile (rdev);/* set up the default clocks if the MC ucode is loaded */ -if (ASIC_IS_DCE5 (rdev) && rdev->mc_fw) { +if ((rdev->family >=CHIP_BARTS ) && + (rdev->family <=CHIP_CAYMAN ) && + rdev->mc_fw) {if (rdev->pm.default_vddc)radeon_atom_set_voltage (rdev, rdev->pm.default_vddc,SET_VOLTAGE_TYPE_ASIC_VDDC );
drivers/media/rc/ite-cir.c +1 -1
@@ -1477,6 +1477,7 @@ static int ite_probe(struct pnp_dev *pdev, const struct pnp_device_id rdev =rc_allocate_device ();if (!rdev) goto failure; + itdev->rdev = rdev; ret = -ENODEV ;
@@ -1608,7 +1609,6 @@ static int ite_probe(struct pnp_dev *pdev, const struct pnp_device_idif (ret) goto failure; - itdev->rdev = rdev;ite_pr (KERN_NOTICE ,"driver has been successfully loaded\n" );return 0 ;
drivers/mtd/maps/autcpu12-nvram.c +11 -8
@@ -43,7 +43,8 @@ struct map_info autcpu12_sram_map = {static int __init init_autcpu12_sram (void ) { -int err, save0, save1; +map_word tmp, save0, save1; +int err; autcpu12_sram_map.virt =ioremap (0x12000000 ,SZ_128K );if (!autcpu12_sram_map.virt) {
@@ -51,7 +52,7 @@ static int __init init_autcpu12_sram (void) err = -EIO ; goto out; } -simple_map_init (&autcpu_sram_map); +simple_map_init (&autcpu12_sram_map);/* * Check for 32K/128K
@@ -61,20 +62,22 @@ static int __init init_autcpu12_sram (void)* Read and check result on ofs 0x0 * Restore contents */ - save0 =map_read32 (&autcpu12_sram_map,0 ); - save1 =map_read32 (&autcpu12_sram_map,0x10000 ); -map_write32 (&autcpu12_sram_map,~save0,0x10000 ); + save0 =map_read (&autcpu12_sram_map,0 ); + save1 =map_read (&autcpu12_sram_map,0x10000 ); + tmp.x[0 ] = ~save0.x[0 ]; +map_write (&autcpu12_sram_map, tmp,0x10000 );/* if we find this pattern on 0x0, we have 32K size * restore contents and exit */ -if (map_read32 (&autcpu12_sram_map,0 ) != save0) { -map_write32 (&autcpu12_sram_map,save0,0x0 ); + tmp =map_read (&autcpu12_sram_map,0 ); +if (!map_word_equal (&autcpu12_sram_map, tmp, save0)) { +map_write (&autcpu12_sram_map, save0,0x0 ); goto map; }/* We have a 128K found, restore 0x10000 and set size * to 128K */ -map_write32 (&autcpu12_sram_map,save1,0x10000 ); +map_write (&autcpu12_sram_map, save1,0x10000 ); autcpu12_sram_map.size =SZ_128K ; map:
drivers/mtd/nand/nand_bbt.c +1 -1
@@ -429,7 +429,7 @@ static int read_abs_bbts(struct mtd_info *mtd, uint8_t *buf,/* Read the mirror version, if available */ if (md && (md->options &NAND_BBT_VERSION )) {scan_read_raw (mtd, buf, (loff_t )md->pages[0 ] << this->page_shift, - mtd->writesize, td); + mtd->writesize, md); md->version[0 ] = buf[bbt_get_ver_offs (mtd, md)];printk (KERN_DEBUG "Bad block table at page %d, version 0x%02X\n" , md->pages[0 ], md->version[0 ]);
drivers/mtd/nand/nandsim.c +1 -0
@@ -2355,6 +2355,7 @@ static int __init ns_init_module(void)uint64_t new_size = (uint64_t )nsmtd->erasesize << overridesize;if (new_size >> overridesize != nsmtd->erasesize) {NS_ERR ("overridesize is too big\n" ); + retval = -EINVAL ; goto err_exit; }/* N.B. This relies on nand_scan not doing anything with the size before we change it */
drivers/mtd/nand/omap2.c +2 -1
@@ -1139,7 +1139,8 @@ static int omap_nand_remove(struct platform_device *pdev)/* Release NAND device, its internal structures and partitions */ nand_release (&info->mtd);iounmap (info->nand.IO_ADDR_R); -kfree (&info->mtd); +release_mem_region (info->phys_base,NAND_IO_SIZE ); +kfree (info);return 0 ; }
drivers/net/davinci_cpdma.c +1 -0
@@ -849,6 +849,7 @@ int cpdma_chan_stop(struct cpdma_chan *chan) next_dma =desc_read (desc, hw_next); chan->head =desc_from_phys (pool, next_dma); + chan->count--; chan->stats.teardown_dequeue++;/* issue callback without locks held */
drivers/net/netxen/netxen_nic_main.c +4 -0
@@ -1288,6 +1288,10 @@ static void netxen_mask_aer_correctable(struct netxen_adapter *adapter)struct pci_dev *root = pdev->bus->self;u32 aer_pos; +/* root bus? */ +if (!root) +return ; +if (adapter->ahw.board_type !=NETXEN_BRDTYPE_P3_4_GB_MM && adapter->ahw.board_type !=NETXEN_BRDTYPE_P3_10G_TP )return ;
drivers/net/pppoe.c +1 -1
@@ -576,7 +576,7 @@ static int pppoe_release(struct socket *sock) po =pppox_sk (sk); -if (sk->sk_state & (PPPOX_CONNECTED |PPPOX_BOUND )) { +if (sk->sk_state & (PPPOX_CONNECTED |PPPOX_BOUND |PPPOX_ZOMBIE )) {dev_put (po->pppoe_dev); po->pppoe_dev =NULL ; }
drivers/net/r8169.c +335 -109
802 lines not on this page · raw message
drivers/net/tg3.c +12 -2
@@ -13647,9 +13647,13 @@ static int __devinit tg3_get_invariants(struct tg3 *tp)if (tg3_flag (tp,HW_TSO_1 ) ||tg3_flag (tp,HW_TSO_2 ) ||tg3_flag (tp,HW_TSO_3 ) || - (tp->fw_needed && !tg3_flag (tp,ENABLE_ASF ))) + tp->fw_needed) { +/* For firmware TSO, assume ASF is disabled. +* We'll disable TSO later if we discover ASF +* is enabled in tg3_get_eeprom_hw_cfg(). +*/ tg3_flag_set (tp,TSO_CAPABLE ); -else { + }else {tg3_flag_clear (tp,TSO_CAPABLE );tg3_flag_clear (tp,TSO_BUG ); tp->fw_needed =NULL ;
@@ -13887,6 +13891,12 @@ static int __devinit tg3_get_invariants(struct tg3 *tp)*/ tg3_get_eeprom_hw_cfg (tp); +if (tp->fw_needed &&tg3_flag (tp,ENABLE_ASF )) { +tg3_flag_clear (tp,TSO_CAPABLE ); +tg3_flag_clear (tp,TSO_BUG ); + tp->fw_needed =NULL ; + } +if (tg3_flag (tp,ENABLE_APE )) {/* Allow reads and writes to the * APE register and memory space.
drivers/net/usb/sierra_net.c +1 -1
@@ -678,7 +678,7 @@ static int sierra_net_get_fw_attr(struct usbnet *dev, u16 *datap)return -EIO ; } - *datap = *attrdata; + *datap =le16_to_cpu (*attrdata);kfree (attrdata);return result;
drivers/net/wan/ixp4xx_hss.c +1 -0
@@ -8,6 +8,7 @@* as published by the Free Software Foundation. */ +#include <linux/module.h> #include <linux/bitops.h> #include <linux/cdev.h> #include <linux/dma-mapping.h>
drivers/pci/hotplug/acpiphp_glue.c +6 -1
@@ -131,7 +131,12 @@ register_slot(acpi_handle handle, u32 lvl, void *context, void **rv)if (!acpi_pci_check_ejectable (pbus, handle) && !is_dock_device (handle))return AE_OK ; -acpi_evaluate_integer (handle,"_ADR" ,NULL , &adr); + status =acpi_evaluate_integer (handle,"_ADR" ,NULL , &adr); +if (ACPI_FAILURE (status)) { +warn ("can't evaluate _ADR (%#x)\n" , status); +return AE_OK ; + } + device = (adr >>16 ) &0xffff ; function = adr &0xffff ;
drivers/pci/probe.c +4 -2
@@ -664,8 +664,10 @@ int __devinit pci_scan_bridge(struct pci_bus *bus, struct pci_dev *dev, int max,/* Check if setup is sensible at all */ if (!pass && - (primary != bus->number || secondary <= bus->number)) { -dev_dbg (&dev->dev,"bus configuration invalid, reconfiguring\n" ); + (primary != bus->number || secondary <= bus->number || + secondary > subordinate)) { +dev_info (&dev->dev,"bridge configuration invalid ([bus %02x-%02x]), reconfiguring\n" , + secondary, subordinate); broken =1 ; }
drivers/s390/scsi/zfcp_aux.c +1 -0
@@ -518,6 +518,7 @@ struct zfcp_port *zfcp_port_enqueue(struct zfcp_adapter *adapter, u64 wwpn,rwlock_init (&port->unit_list_lock);INIT_LIST_HEAD (&port->unit_list); +atomic_set (&port->units,0 );INIT_WORK (&port->gid_pn_work, zfcp_fc_port_did_lookup);INIT_WORK (&port->test_link_work, zfcp_fc_link_test_work);
drivers/s390/scsi/zfcp_ccw.c +63 -10
137 lines not on this page · raw message
drivers/s390/scsi/zfcp_cfdc.c +1 -1
@@ -293,7 +293,7 @@ void zfcp_cfdc_adapter_access_changed(struct zfcp_adapter *adapter) }read_unlock_irqrestore (&adapter->port_list_lock, flags); -shost_for_each_device (sdev, port->adapter->scsi_host) { +shost_for_each_device (sdev, adapter->scsi_host) { zfcp_sdev =sdev_to_zfcp (sdev); status =atomic_read (&zfcp_sdev->status); if ((status & ZFCP_STATUS_COMMON_ACCESS_DENIED) ||
drivers/s390/scsi/zfcp_dbf.c +20 -0
@@ -163,6 +163,26 @@ void zfcp_dbf_hba_bit_err(char *tag, struct zfcp_fsf_req *req)spin_unlock_irqrestore (&dbf->hba_lock, flags); } +/** +* zfcp_dbf_hba_basic - trace event for basic adapter events +* @adapter: pointer to struct zfcp_adapter +*/ +void zfcp_dbf_hba_basic (char *tag,struct zfcp_adapter *adapter) +{ +struct zfcp_dbf *dbf = adapter->dbf; +struct zfcp_dbf_hba *rec = &dbf->hba_buf; +unsigned long flags; + +spin_lock_irqsave (&dbf->hba_lock, flags); +memset (rec,0 ,sizeof (*rec)); + +memcpy (rec->tag, tag,ZFCP_DBF_TAG_LEN ); + rec->id =ZFCP_DBF_HBA_BASIC ; + +debug_event (dbf->hba,1 , rec,sizeof (*rec)); +spin_unlock_irqrestore (&dbf->hba_lock, flags); +} + static void zfcp_dbf_set_common(struct zfcp_dbf_rec *rec, struct zfcp_adapter *adapter, struct zfcp_port *port,
drivers/s390/scsi/zfcp_dbf.h +1 -0
@@ -154,6 +154,7 @@ enum zfcp_dbf_hba_id {ZFCP_DBF_HBA_RES =1 ,ZFCP_DBF_HBA_USS =2 ,ZFCP_DBF_HBA_BIT =3 , + ZFCP_DBF_HBA_BASIC = 4, };/**
drivers/s390/scsi/zfcp_def.h +2 -0
@@ -76,6 +76,7 @@ struct zfcp_reqlist;#define ZFCP_STATUS_ADAPTER_SIOSL_ISSUED 0x00000004#define ZFCP_STATUS_ADAPTER_XCONFIG_OK 0x00000008#define ZFCP_STATUS_ADAPTER_HOST_CON_INIT 0x00000010 +#define ZFCP_STATUS_ADAPTER_SUSPENDED 0x00000040#define ZFCP_STATUS_ADAPTER_ERP_PENDING 0x00000100#define ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED 0x00000200#define ZFCP_STATUS_ADAPTER_DATA_DIV_ENABLED 0x00000400
@@ -203,6 +204,7 @@ struct zfcp_port {struct zfcp_adapter *adapter;/* adapter used to access port */ struct list_head unit_list;/* head of logical unit list */ rwlock_t unit_list_lock;/* unit list lock */ +atomic_t units;/* zfcp_unit count */ atomic_t status;/* status of this remote port */ u64 wwnn;/* WWNN if known */ u64 wwpn;/* WWPN */
drivers/s390/scsi/zfcp_ext.h +2 -0
@@ -53,6 +53,7 @@ extern void zfcp_dbf_hba_fsf_uss(char *, struct zfcp_fsf_req *);extern void zfcp_dbf_hba_fsf_res (char *,struct zfcp_fsf_req *);extern void zfcp_dbf_hba_bit_err (char *,struct zfcp_fsf_req *);extern void zfcp_dbf_hba_berr (struct zfcp_dbf *,struct zfcp_fsf_req *); +extern void zfcp_dbf_hba_basic (char *,struct zfcp_adapter *);extern void zfcp_dbf_san_req (char *,struct zfcp_fsf_req *,u32 );extern void zfcp_dbf_san_res (char *,struct zfcp_fsf_req *);extern void zfcp_dbf_san_in_els (char *,struct zfcp_fsf_req *);
@@ -157,6 +158,7 @@ extern void zfcp_scsi_dif_sense_error(struct scsi_cmnd *, int);extern struct attribute_group zfcp_sysfs_unit_attrs;extern struct attribute_group zfcp_sysfs_adapter_attrs;extern struct attribute_group zfcp_sysfs_port_attrs; +extern struct mutex zfcp_sysfs_port_units_mutex;extern struct device_attribute *zfcp_sysfs_sdev_attrs[];extern struct device_attribute *zfcp_sysfs_shost_attrs[];
drivers/s390/scsi/zfcp_fsf.c +16 -7
@@ -219,7 +219,7 @@ static void zfcp_fsf_status_read_handler(struct zfcp_fsf_req *req)return ; } -zfcp_dbf_hba_fsf_uss ("fssrh_2" , req); +zfcp_dbf_hba_fsf_uss ("fssrh_4" , req);switch (sr_buf->status_type) {case FSF_STATUS_READ_PORT_CLOSED :
@@ -771,12 +771,14 @@ out:static void zfcp_fsf_abort_fcp_command_handler (struct zfcp_fsf_req *req) {struct scsi_device *sdev = req->data; -struct zfcp_scsi_dev *zfcp_sdev =sdev_to_zfcp (sdev); +struct zfcp_scsi_dev *zfcp_sdev;union fsf_status_qual *fsq = &req->qtcb->header.fsf_status_qual;if (req->status &ZFCP_STATUS_FSFREQ_ERROR )return ; + zfcp_sdev =sdev_to_zfcp (sdev); +switch (req->qtcb->header.fsf_status) {case FSF_PORT_HANDLE_NOT_VALID :if (fsq->word[0 ] == fsq->word[1 ]) {
@@ -885,7 +887,7 @@ static void zfcp_fsf_send_ct_handler(struct zfcp_fsf_req *req)switch (header->fsf_status) {case FSF_GOOD : -zfcp_dbf_san_res ("fsscth1" , req); +zfcp_dbf_san_res ("fsscth2" , req); ct->status =0 ;break ;case FSF_SERVICE_CLASS_NOT_SUPPORTED :
@@ -1730,13 +1732,15 @@ static void zfcp_fsf_open_lun_handler(struct zfcp_fsf_req *req) {struct zfcp_adapter *adapter = req->adapter;struct scsi_device *sdev = req->data; -struct zfcp_scsi_dev *zfcp_sdev =sdev_to_zfcp (sdev); +struct zfcp_scsi_dev *zfcp_sdev;struct fsf_qtcb_header *header = &req->qtcb->header;struct fsf_qtcb_bottom_support *bottom = &req->qtcb->bottom.support;if (req->status &ZFCP_STATUS_FSFREQ_ERROR )return ; + zfcp_sdev =sdev_to_zfcp (sdev); + atomic_clear_mask(ZFCP_STATUS_COMMON_ACCESS_DENIED | ZFCP_STATUS_COMMON_ACCESS_BOXED | ZFCP_STATUS_LUN_SHARED |
@@ -1847,11 +1851,13 @@ out:static void zfcp_fsf_close_lun_handler (struct zfcp_fsf_req *req) {struct scsi_device *sdev = req->data; -struct zfcp_scsi_dev *zfcp_sdev =sdev_to_zfcp (sdev); +struct zfcp_scsi_dev *zfcp_sdev;if (req->status &ZFCP_STATUS_FSFREQ_ERROR )return ; + zfcp_sdev =sdev_to_zfcp (sdev); +switch (req->qtcb->header.fsf_status) {case FSF_PORT_HANDLE_NOT_VALID :zfcp_erp_adapter_reopen (zfcp_sdev->port->adapter,0 ,"fscuh_1" );
@@ -1941,7 +1947,7 @@ static void zfcp_fsf_req_trace(struct zfcp_fsf_req *req, struct scsi_cmnd *scsi) {struct fsf_qual_latency_info *lat_in;struct latency_cont *lat =NULL ; -struct zfcp_scsi_dev *zfcp_sdev =sdev_to_zfcp (scsi->device); +struct zfcp_scsi_dev *zfcp_sdev;struct zfcp_blk_drv_data blktrc;int ticks = req->adapter->timer_ticks;
@@ -1956,6 +1962,7 @@ static void zfcp_fsf_req_trace(struct zfcp_fsf_req *req, struct scsi_cmnd *scsi)if (req->adapter->adapter_features &FSF_FEATURE_MEASUREMENT_DATA && !(req->status &ZFCP_STATUS_FSFREQ_ERROR )) { + zfcp_sdev =sdev_to_zfcp (scsi->device); blktrc.flags |=ZFCP_BLK_LAT_VALID ; blktrc.channel_lat = lat_in->channel_lat * ticks; blktrc.fabric_lat = lat_in->fabric_lat * ticks;
@@ -1993,12 +2000,14 @@ static void zfcp_fsf_fcp_handler_common(struct zfcp_fsf_req *req) {struct scsi_cmnd *scmnd = req->data;struct scsi_device *sdev = scmnd->device; -struct zfcp_scsi_dev *zfcp_sdev =sdev_to_zfcp (sdev); +struct zfcp_scsi_dev *zfcp_sdev;struct fsf_qtcb_header *header = &req->qtcb->header;if (unlikely (req->status &ZFCP_STATUS_FSFREQ_ERROR ))return ; + zfcp_sdev =sdev_to_zfcp (sdev); +switch (header->fsf_status) {case FSF_HANDLE_MISMATCH :case FSF_PORT_HANDLE_NOT_VALID :
drivers/s390/scsi/zfcp_sysfs.c +16 -2
@@ -227,6 +227,8 @@ static ssize_t zfcp_sysfs_port_rescan_store(struct device *dev, static ZFCP_DEV_ATTR(adapter, port_rescan, S_IWUSR, NULL, zfcp_sysfs_port_rescan_store); +DEFINE_MUTEX (zfcp_sysfs_port_units_mutex); +static ssize_t zfcp_sysfs_port_remove_store (struct device *dev,struct device_attribute *attr,const char *buf,size_t count)
@@ -249,6 +251,16 @@ static ssize_t zfcp_sysfs_port_remove_store(struct device *dev,else retval =0 ; +mutex_lock (&zfcp_sysfs_port_units_mutex); +if (atomic_read (&port->units) >0 ) { + retval = -EBUSY ; +mutex_unlock (&zfcp_sysfs_port_units_mutex); + goto out; + } +/* port is about to be removed, so no more unit_add */ +atomic_set (&port->units,-1 ); +mutex_unlock (&zfcp_sysfs_port_units_mutex); +write_lock_irq (&adapter->port_list_lock);list_del (&port->list);write_unlock_irq (&adapter->port_list_lock);
@@ -289,12 +301,14 @@ static ssize_t zfcp_sysfs_unit_add_store(struct device *dev, { struct zfcp_port *port = container_of(dev, struct zfcp_port, dev);u64 fcp_lun; +int retval;if (strict_strtoull (buf,0 , (unsigned long long *) &fcp_lun))return -EINVAL ; -if (zfcp_unit_add (port, fcp_lun)) -return -EINVAL ; + retval =zfcp_unit_add (port, fcp_lun); +if (retval) +return retval;return count; }
drivers/s390/scsi/zfcp_unit.c +26 -10
@@ -104,7 +104,7 @@ static void zfcp_unit_release(struct device *dev) { struct zfcp_unit *unit = container_of(dev, struct zfcp_unit, dev); -put_device (&unit->port->dev); +atomic_dec (&unit->port->units);kfree (unit); }
@@ -119,16 +119,27 @@ static void zfcp_unit_release(struct device *dev)int zfcp_unit_add (struct zfcp_port *port,u64 fcp_lun) {struct zfcp_unit *unit; +int retval =0 ; + +mutex_lock (&zfcp_sysfs_port_units_mutex); +if (atomic_read (&port->units) ==-1 ) { +/* port is already gone */ + retval = -ENODEV ; + goto out; + } unit =zfcp_unit_find (port, fcp_lun);if (unit) {put_device (&unit->dev); -return -EEXIST ; + retval = -EEXIST ; + goto out; } unit =kzalloc (sizeof (struct zfcp_unit ),GFP_KERNEL ); -if (!unit) -return -ENOMEM ; +if (!unit) { + retval = -ENOMEM ; + goto out; + } unit->port = port; unit->fcp_lun = fcp_lun;
@@ -139,28 +150,33 @@ int zfcp_unit_add(struct zfcp_port *port, u64 fcp_lun)if (dev_set_name (&unit->dev,"0x%016llx" , (unsigned long long ) fcp_lun)) {kfree (unit); -return -ENOMEM ; + retval = -ENOMEM ; + goto out; } -get_device (&port->dev); -if (device_register (&unit->dev)) {put_device (&unit->dev); -return -ENOMEM ; + retval = -ENOMEM ; + goto out; }if (sysfs_create_group (&unit->dev.kobj, &zfcp_sysfs_unit_attrs)) {device_unregister (&unit->dev); -return -EINVAL ; + retval = -EINVAL ; + goto out; } +atomic_inc (&port->units);/* under zfcp_sysfs_port_units_mutex ! */ +write_lock_irq (&port->unit_list_lock);list_add_tail (&unit->list, &port->unit_list);write_unlock_irq (&port->unit_list_lock);zfcp_unit_scsi_scan (unit); -return 0 ; +out: +mutex_unlock (&zfcp_sysfs_port_units_mutex); +return retval; }/**
drivers/scsi/atp870u.c +10 -1
@@ -1174,7 +1174,16 @@ wait_io1:outw (val, tmport);outb (2 ,0x80 ); TCM_SYNC: -udelay (0x800 ); +/* +* The funny division into multiple delays is to accomodate +* arches like ARM where udelay() multiplies its argument by +* a large number to initialize a loop counter. To avoid +* overflow, the maximum supported udelay is 2000 microseconds. +* +* XXX it would be more polite to find a way to use msleep() +*/ +mdelay (2 ); +udelay (48 );if ((inb (tmport) &0x80 ) ==0x00 ) {/* bsy ? */ outw (0 , tmport--);outb (0 , tmport);
fs/ext4/inode.c +6 -2
@@ -5151,6 +5151,7 @@ static int ext4_do_update_inode(handle_t *handle,struct ext4_inode_info *ei =EXT4_I (inode);struct buffer_head *bh = iloc->bh;int err =0 , rc, block; +int need_datasync =0 ;/* For fields not not tracking in the in-memory inode, * initialise them to zero for new inodes. */
@@ -5199,7 +5200,10 @@ static int ext4_do_update_inode(handle_t *handle, raw_inode->i_file_acl_high =cpu_to_le16 (ei->i_file_acl >>32 ); raw_inode->i_file_acl_lo =cpu_to_le32 (ei->i_file_acl); -ext4_isize_set (raw_inode, ei->i_disksize); +if (ei->i_disksize !=ext4_isize (raw_inode)) { +ext4_isize_set (raw_inode, ei->i_disksize); + need_datasync =1 ; + } if (ei->i_disksize > 0x7fffffffULL) { struct super_block *sb = inode->i_sb; if (!EXT4_HAS_RO_COMPAT_FEATURE(sb,
@@ -5252,7 +5256,7 @@ static int ext4_do_update_inode(handle_t *handle, err = rc;ext4_clear_inode_state (inode,EXT4_STATE_NEW ); -ext4_update_inode_fsync_trans (handle, inode,0 ); +ext4_update_inode_fsync_trans (handle, inode, need_datasync); out_brelse:brelse (bh);ext4_std_error (inode->i_sb, err);
fs/ext4/move_extent.c +6 -1
@@ -1209,7 +1209,12 @@ ext4_move_extents(struct file *o_filp, struct file *d_filp, orig_inode->i_ino, donor_inode->i_ino);return -EINVAL ; } - +/* TODO: This is non obvious task to swap blocks for inodes with full +jornaling enabled */ +if (ext4_should_journal_data (orig_inode) || +ext4_should_journal_data (donor_inode)) { +return -EINVAL ; + }/* Protect orig and donor inodes against a truncate */ ret1 =mext_inode_double_lock (orig_inode, donor_inode);if (ret1 <0 )
fs/ext4/namei.c +0 -2
@@ -1799,9 +1799,7 @@ retry: err =PTR_ERR (inode);if (!IS_ERR (inode)) {init_special_inode (inode, inode->i_mode, rdev); -#ifdef CONFIG_EXT4_FS_XATTR inode->i_op = &ext4_special_inode_operations; -#endif err =ext4_add_nondir (handle, dentry, inode); }ext4_journal_stop (handle);
include/linux/mempolicy.h +1 -1
@@ -188,7 +188,7 @@ struct sp_node {struct shared_policy {struct rb_root root; -spinlock_t lock; +struct mutex mutex; };void mpol_shared_policy_init (struct shared_policy *sp,struct mempolicy *mpol);
include/linux/xfrm.h +2 -0
@@ -84,6 +84,8 @@ struct xfrm_replay_state {__u32 bitmap; }; +#define XFRMA_REPLAY_ESN_MAX 4096 +struct xfrm_replay_state_esn {unsigned int bmp_len;__u32 oseq;
include/net/xfrm.h +3 -0
@@ -269,6 +269,9 @@ struct xfrm_replay {int (*check)(struct xfrm_state *x,struct sk_buff *skb,__be32 net_seq); +int (*recheck)(struct xfrm_state *x, +struct sk_buff *skb, +__be32 net_seq);void (*notify)(struct xfrm_state *x,int event);int (*overflow)(struct xfrm_state *x,struct sk_buff *skb); };
kernel/cpuset.c +3 -0
@@ -2080,6 +2080,9 @@ static void scan_for_empty_cpusets(struct cpuset *root)* (of no affect) on systems that are actively using CPU hotplug * but making no active use of cpusets. * +* The only exception to this is suspend/resume, where we don't +* modify cpusets at all. +* * This routine ensures that top_cpuset.cpus_allowed tracks * cpu_active_mask on each CPU hotplug (cpuhp) event. *
kernel/rcutree.c +3 -1
@@ -283,7 +283,9 @@ cpu_has_callbacks_ready_to_invoke(struct rcu_data *rdp)static int cpu_needs_another_gp (struct rcu_state *rsp,struct rcu_data *rdp) { -return *rdp->nxttail[RCU_DONE_TAIL ] && !rcu_gp_in_progress (rsp); +return *rdp->nxttail[RCU_DONE_TAIL + +ACCESS_ONCE (rsp->completed) != rdp->completed] && + !rcu_gp_in_progress (rsp); }/*
kernel/sched.c +36 -4
@@ -7777,34 +7777,66 @@ int __init sched_create_sysfs_power_savings_entries(struct sysdev_class *cls) }#endif /* CONFIG_SCHED_MC || CONFIG_SCHED_SMT */ +static int num_cpus_frozen;/* used to mark begin/end of suspend/resume */ +/* * Update cpusets according to cpu_active mask. If cpusets are * disabled, cpuset_update_active_cpus() becomes a simple wrapper * around partition_sched_domains(). +* +* If we come here as part of a suspend/resume, don't touch cpusets because we +* want to restore it back to its original state upon resume anyway. */ static int cpuset_cpu_active (struct notifier_block *nfb,unsigned long action,void *hcpu) { -switch (action & ~CPU_TASKS_FROZEN ) { +switch (action) { +case CPU_ONLINE_FROZEN : +case CPU_DOWN_FAILED_FROZEN : + +/* +* num_cpus_frozen tracks how many CPUs are involved in suspend +* resume sequence. As long as this is not the last online +* operation in the resume sequence, just build a single sched +* domain, ignoring cpusets. +*/ + num_cpus_frozen--; +if (likely (num_cpus_frozen)) { +partition_sched_domains (1 ,NULL ,NULL ); +break ; + } + +/* +* This is the last CPU online operation. So fall through and +* restore the original sched domains by considering the +* cpuset configurations. +*/ +case CPU_ONLINE :case CPU_DOWN_FAILED :cpuset_update_active_cpus (); -return NOTIFY_OK ; +break ;default :return NOTIFY_DONE ; } +return NOTIFY_OK ; }static int cpuset_cpu_inactive (struct notifier_block *nfb,unsigned long action,void *hcpu) { -switch (action & ~CPU_TASKS_FROZEN ) { +switch (action) {case CPU_DOWN_PREPARE :cpuset_update_active_cpus (); -return NOTIFY_OK ; +break ; +case CPU_DOWN_PREPARE_FROZEN : + num_cpus_frozen++; +partition_sched_domains (1 ,NULL ,NULL ); +break ;default :return NOTIFY_DONE ; } +return NOTIFY_OK ; } static int update_runtime(struct notifier_block *nfb,
kernel/sys.c +1 -0
@@ -334,6 +334,7 @@ void kernel_restart_prepare(char *cmd)void kernel_restart (char *cmd) {kernel_restart_prepare (cmd); +disable_nonboot_cpus ();if (!cmd)printk (KERN_EMERG "Restarting system.\n" );else
kernel/workqueue.c +2 -0
@@ -1868,7 +1868,9 @@ __acquires(&gcwq->lock)spin_unlock_irq (&gcwq->lock); +smp_wmb ();/* paired with test_and_set_bit(PENDING) */ work_clear_pending (work); +lock_map_acquire_read (&cwq->wq->lockdep_map);lock_map_acquire (&lockdep_map);trace_workqueue_execute_start (work);
lib/gcd.c +3 -0
@@ -9,6 +9,9 @@ unsigned long gcd(unsigned long a, unsigned long b)if (a < b)swap (a, b); + +if (!b) +return a;while ((r = a % b) !=0 ) { a = b; b = r;
mm/mempolicy.c +88 -49
236 lines not on this page · raw message
mm/truncate.c +2 -1
@@ -398,11 +398,12 @@ invalidate_complete_page2(struct address_space *mapping, struct page *page)if (page_has_private (page) && !try_to_release_page (page,GFP_KERNEL ))return 0 ; +clear_page_mlock (page); +spin_lock_irq (&mapping->tree_lock);if (PageDirty (page)) goto failed; -clear_page_mlock (page);BUG_ON (page_has_private (page));__delete_from_page_cache (page);spin_unlock_irq (&mapping->tree_lock);
net/8021q/vlan_core.c +2 -1
@@ -106,7 +106,6 @@ static struct sk_buff *vlan_reorder_header(struct sk_buff *skb)return NULL ;memmove (skb->data -ETH_HLEN , skb->data -VLAN_ETH_HLEN ,2 *ETH_ALEN ); skb->mac_header +=VLAN_HLEN ; -skb_reset_mac_len (skb);return skb; }
@@ -173,6 +172,8 @@ struct sk_buff *vlan_untag(struct sk_buff *skb)skb_reset_network_header (skb);skb_reset_transport_header (skb); +skb_reset_mac_len (skb); +return skb; err_free:
net/core/dev.c +8 -6
@@ -2038,7 +2038,8 @@ static bool can_checksum_protocol(unsigned long features, __be16 protocol)static u32 harmonize_features (struct sk_buff *skb,__be16 protocol,u32 features) { -if (!can_checksum_protocol (features, protocol)) { +if (skb->ip_summed !=CHECKSUM_NONE && + !can_checksum_protocol (features, protocol)) { features &= ~NETIF_F_ALL_CSUM ; features &= ~NETIF_F_SG ; }else if (illegal_highdma (skb->dev, skb)) {
@@ -2559,16 +2560,17 @@ __u32 __skb_get_rxhash(struct sk_buff *skb) poff =proto_ports_offset (ip_proto);if (poff >=0 ) { nhoff += ihl *4 + poff; -if (pskb_may_pull (skb, nhoff +4 )) { +if (pskb_may_pull (skb, nhoff +4 )) ports.v32 = * (__force u32 *) (skb->data + nhoff); -if (ports.v16[1 ] < ports.v16[0 ]) -swap (ports.v16[0 ], ports.v16[1 ]); - } }/* get a consistent hash (same value on both flow directions) */ -if (addr2 < addr1) +if (addr2 < addr1 || + (addr2 == addr1 && + ports.v16[1 ] < ports.v16[0 ])) {swap (addr1, addr2); +swap (ports.v16[0 ], ports.v16[1 ]); + } hash =jhash_3words (addr1, addr2, ports.v32, hashrnd);if (!hash)
net/core/sock.c +2 -1
@@ -594,7 +594,8 @@ set_rcvbuf:case SO_KEEPALIVE :#ifdef CONFIG_INET -if (sk->sk_protocol ==IPPROTO_TCP ) +if (sk->sk_protocol ==IPPROTO_TCP && + sk->sk_type ==SOCK_STREAM )tcp_set_keepalive (sk, valbool);#endif sock_valbool_flag (sk,SOCK_KEEPOPEN , valbool);
net/ipv4/raw.c +8 -6
@@ -130,18 +130,20 @@ found:* 0 - deliver * 1 - block */ -static __inline__int icmp_filter (struct sock *sk,struct sk_buff *skb) +static int icmp_filter (const struct sock *sk,const struct sk_buff *skb) { -int type; +struct icmphdr _hdr; +const struct icmphdr *hdr; -if (!pskb_may_pull (skb,sizeof (struct icmphdr ))) + hdr =skb_header_pointer (skb,skb_transport_offset (skb), +sizeof (_hdr), &_hdr); +if (!hdr)return 1 ; - type =icmp_hdr (skb)->type; -if (type <32 ) { +if (hdr->type <32 ) {__u32 data =raw_sk (sk)->filter.data; -return ((1 << type) & data) !=0 ; +return ((1U << hdr->type) & data) !=0 ; }/* Do not block unknown ICMP types */
net/ipv4/tcp.c +8 -2
@@ -1592,8 +1592,14 @@ int tcp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, }#ifdef CONFIG_NET_DMA -if (tp->ucopy.dma_chan) -dma_async_memcpy_issue_pending (tp->ucopy.dma_chan); +if (tp->ucopy.dma_chan) { +if (tp->rcv_wnd ==0 && + !skb_queue_empty (&sk->sk_async_wait_queue)) { +tcp_service_net_dma (sk, true); +tcp_cleanup_rbuf (sk, copied); + }else +dma_async_memcpy_issue_pending (tp->ucopy.dma_chan); + }#endif if (copied >= target) {/* Do not sleep, just process backlog. */
net/ipv6/mip6.c +11 -9
@@ -84,28 +84,30 @@ static int mip6_mh_len(int type)static int mip6_mh_filter (struct sock *sk,struct sk_buff *skb) { -struct ip6_mh *mh; +struct ip6_mh _hdr; +const struct ip6_mh *mh; -if (!pskb_may_pull (skb, (skb_transport_offset (skb)) +8 ) || - !pskb_may_pull (skb, (skb_transport_offset (skb) + - ((skb_transport_header (skb)[1 ] +1 ) <<3 )))) + mh =skb_header_pointer (skb,skb_transport_offset (skb), +sizeof (_hdr), &_hdr); +if (!mh)return -1 ; - mh = (struct ip6_mh *)skb_transport_header (skb); +if (((mh->ip6mh_hdrlen +1 ) <<3 ) > skb->len) +return -1 ;if (mh->ip6mh_hdrlen <mip6_mh_len (mh->ip6mh_type)) {LIMIT_NETDEBUG (KERN_DEBUG "mip6: MH message too short: %d vs >=%d\n" , mh->ip6mh_hdrlen,mip6_mh_len (mh->ip6mh_type)); -mip6_param_prob (skb,0 , ((&mh->ip6mh_hdrlen) - -skb_network_header (skb))); +mip6_param_prob (skb,0 , offsetof(struct ip6_mh , ip6mh_hdrlen) + +skb_network_header_len (skb));return -1 ; }if (mh->ip6mh_proto !=IPPROTO_NONE ) {LIMIT_NETDEBUG (KERN_DEBUG "mip6: MH invalid payload proto = %d\n" , mh->ip6mh_proto); -mip6_param_prob (skb,0 , ((&mh->ip6mh_proto) - -skb_network_header (skb))); +mip6_param_prob (skb,0 , offsetof(struct ip6_mh , ip6mh_proto) + +skb_network_header_len (skb));return -1 ; }
net/ipv6/raw.c +10 -11
@@ -106,21 +106,20 @@ found:* 0 - deliver * 1 - block */ -static __inline__int icmpv6_filter (struct sock *sk,struct sk_buff *skb) +static int icmpv6_filter (const struct sock *sk,const struct sk_buff *skb) { -struct icmp6hdr *icmph; -struct raw6_sock *rp =raw6_sk (sk); - -if (pskb_may_pull (skb,sizeof (struct icmp6hdr ))) { -__u32 *data = &rp->filter.data[0 ]; -int bit_nr; +struct icmp6hdr *_hdr; +const struct icmp6hdr *hdr; - icmph = (struct icmp6hdr *) skb->data; - bit_nr = icmph->icmp6_type; + hdr =skb_header_pointer (skb,skb_transport_offset (skb), +sizeof (_hdr), &_hdr); +if (hdr) { +const __u32 *data = &raw6_sk (sk)->filter.data[0 ]; +unsigned int type = hdr->icmp6_type; -return (data[bit_nr >>5 ] & (1 << (bit_nr &31 ))) !=0 ; +return (data[type >>5 ] & (1U << (type &31 ))) !=0 ; } -return 0 ; +return 1 ; }#if defined(CONFIG_IPV6_MIP6 ) || defined(CONFIG_IPV6_MIP6_MODULE )
net/ipv6/route.c +6 -5
@@ -1399,17 +1399,18 @@ static int __ip6_del_rt(struct rt6_info *rt, struct nl_info *info)struct fib6_table *table;struct net *net =dev_net (rt->rt6i_dev); -if (rt == net->ipv6.ip6_null_entry) -return -ENOENT ; +if (rt == net->ipv6.ip6_null_entry) { + err = -ENOENT ; + goto out; + } table = rt->rt6i_table;write_lock_bh (&table->tb6_lock); - err =fib6_del (rt, info); -dst_release (&rt->dst); -write_unlock_bh (&table->tb6_lock); +out: +dst_release (&rt->dst);return err; }
net/l2tp/l2tp_eth.c +1 -1
@@ -132,7 +132,7 @@ static void l2tp_eth_dev_recv(struct l2tp_session *session, struct sk_buff *skb,printk ("\n" ); } -if (!pskb_may_pull (skb,sizeof (ETH_HLEN ))) +if (!pskb_may_pull (skb,ETH_HLEN )) goto error;secpath_reset (skb);
net/netrom/af_netrom.c +6 -1
@@ -1170,7 +1170,12 @@ static int nr_recvmsg(struct kiocb *iocb, struct socket *sock, msg->msg_flags |=MSG_TRUNC ; } -skb_copy_datagram_iovec (skb,0 , msg->msg_iov, copied); + er =skb_copy_datagram_iovec (skb,0 , msg->msg_iov, copied); +if (er <0 ) { +skb_free_datagram (sk, skb); +release_sock (sk); +return er; + }if (sax !=NULL ) { sax->sax25_family =AF_NETROM ;
net/sched/sch_cbq.c +3 -2
@@ -250,10 +250,11 @@ cbq_classify(struct sk_buff *skb, struct Qdisc *sch, int *qerr)else if ((cl = defmap[res.classid &TC_PRIO_MAX ]) ==NULL ) cl = defmap[TC_PRIO_BESTEFFORT ]; -if (cl ==NULL || cl->level >= head->level) +if (cl ==NULL ) goto fallback; } - +if (cl->level >= head->level) + goto fallback;#ifdef CONFIG_NET_CLS_ACT switch (result) {case TC_ACT_QUEUED :
net/sched/sch_qfq.c +4 -1
@@ -829,7 +829,10 @@ static void qfq_update_start(struct qfq_sched *q, struct qfq_class *cl)if (mask) {struct qfq_group *next =qfq_ffs (q, mask);if (qfq_gt (roundedF, next->F)) { - cl->S = next->F; +if (qfq_gt (limit, next->F)) + cl->S = next->F; +else /* preserve timestamp correctness */ + cl->S = limit;return ; } }
net/sctp/output.c +20 -1
@@ -334,6 +334,25 @@ finish:return retval; } +static void sctp_packet_release_owner (struct sk_buff *skb) +{ +sk_free (skb->sk); +} + +static void sctp_packet_set_owner_w (struct sk_buff *skb,struct sock *sk) +{ +skb_orphan (skb); + skb->sk = sk; + skb->destructor = sctp_packet_release_owner; + +/* +* The data chunks have already been accounted for in sctp_sendmsg(), +* therefore only reserve a single byte to keep socket around until +* the packet has been transmitted. +*/ +atomic_inc (&sk->sk_wmem_alloc); +} +/* All packets are sent to the network through this function from * sctp_outq_tail(). *
@@ -375,7 +394,7 @@ int sctp_packet_transmit(struct sctp_packet *packet)/* Set the owning socket so that we know where to get the * destination IP address. */ -skb_set_owner_w (nskb, sk); +sctp_packet_set_owner_w (nskb, sk);if (!sctp_transport_dst_check (tp)) {sctp_transport_route (tp,NULL ,sctp_sk (sk));
net/xfrm/xfrm_input.c +1 -1
@@ -212,7 +212,7 @@ resume:/* only the first xfrm gets the encap type */ encap_type =0 ; -if (async && x->repl->check (x, skb, seq)) { +if (async && x->repl->recheck (x, skb, seq)) {XFRM_INC_STATS (net,LINUX_MIB_XFRMINSTATESEQERROR ); goto drop_unlock; }
net/xfrm/xfrm_policy.c +1 -1
@@ -1759,7 +1759,7 @@ static struct dst_entry *make_blackhole(struct net *net, u16 family,if (!afinfo) {dst_release (dst_orig); - ret =ERR_PTR (-EINVAL ); +return ERR_PTR (-EINVAL ); }else { ret = afinfo->blackhole_route (net, dst_orig); }
net/xfrm/xfrm_replay.c +15 -0
@@ -437,6 +437,18 @@ err:return -EINVAL ; } +static int xfrm_replay_recheck_esn (struct xfrm_state *x, +struct sk_buff *skb,__be32 net_seq) +{ +if (unlikely (XFRM_SKB_CB (skb)->seq.input.hi != +htonl (xfrm_replay_seqhi (x, net_seq)))) { + x->stats.replay_window++; +return -EINVAL ; + } + +return xfrm_replay_check_esn (x, skb, net_seq); +} +static void xfrm_replay_advance_esn (struct xfrm_state *x,__be32 net_seq) {unsigned int bitnr, nr, i;
@@ -508,6 +520,7 @@ static void xfrm_replay_advance_esn(struct xfrm_state *x, __be32 net_seq)static struct xfrm_replay xfrm_replay_legacy = { .advance = xfrm_replay_advance, .check = xfrm_replay_check, + .recheck = xfrm_replay_check, .notify = xfrm_replay_notify, .overflow = xfrm_replay_overflow, };
@@ -515,6 +528,7 @@ static struct xfrm_replay xfrm_replay_legacy = {static struct xfrm_replay xfrm_replay_bmp = { .advance = xfrm_replay_advance_bmp, .check = xfrm_replay_check_bmp, + .recheck = xfrm_replay_check_bmp, .notify = xfrm_replay_notify_bmp, .overflow = xfrm_replay_overflow_bmp, };
@@ -522,6 +536,7 @@ static struct xfrm_replay xfrm_replay_bmp = {static struct xfrm_replay xfrm_replay_esn = { .advance = xfrm_replay_advance_esn, .check = xfrm_replay_check_esn, + .recheck = xfrm_replay_recheck_esn, .notify = xfrm_replay_notify_bmp, .overflow = xfrm_replay_overflow_esn, };
net/xfrm/xfrm_user.c +42 -15
166 lines not on this page · raw message
scripts/Kbuild.include +1 -1
@@ -205,7 +205,7 @@ endif # >$< substitution to preserve $ when reloading .cmd file # note: when using inline perl scripts [perl -e '...$$t=1;...'] # in $(cmd_xxx) double $$ your perl vars -make-cmd = $(subst \#,\\\#,$(subst $$,$$$$,$(call escsq,$(cmd_$(1))))) +make-cmd = $(subst \\,\\\\,$(subst \#,\\\#,$(subst $$,$$$$,$(call escsq,$(cmd_$(1)))))) # Find any prerequisites that is newer than target or that does not exist. # PHONY targets skipped in both cases.
sound/drivers/aloop.c +6 -0
@@ -119,6 +119,7 @@ struct loopback_pcm {unsigned int period_size_frac;unsigned long last_jiffies;struct timer_list timer; +spinlock_t timer_lock; };static struct platform_device *devices[SNDRV_CARDS ];
@@ -169,6 +170,7 @@ static void loopback_timer_start(struct loopback_pcm *dpcm)unsigned long tick;unsigned int rate_shift =get_rate_shift (dpcm); +spin_lock (&dpcm->timer_lock);if (rate_shift != dpcm->pcm_rate_shift) { dpcm->pcm_rate_shift = rate_shift; dpcm->period_size_frac =frac_pos (dpcm, dpcm->pcm_period_size);
@@ -181,12 +183,15 @@ static void loopback_timer_start(struct loopback_pcm *dpcm) tick = (tick + dpcm->pcm_bps -1 ) / dpcm->pcm_bps; dpcm->timer.expires = jiffies + tick;add_timer (&dpcm->timer); +spin_unlock (&dpcm->timer_lock); }static inline void loopback_timer_stop (struct loopback_pcm *dpcm) { +spin_lock (&dpcm->timer_lock);del_timer (&dpcm->timer); dpcm->timer.expires =0 ; +spin_unlock (&dpcm->timer_lock); }#define CABLE_VALID_PLAYBACK (1 << SNDRV_PCM_STREAM_PLAYBACK)
@@ -658,6 +663,7 @@ static int loopback_open(struct snd_pcm_substream *substream) dpcm->substream = substream;setup_timer (&dpcm->timer, loopback_timer_function, (unsigned long )dpcm); +spin_lock_init (&dpcm->timer_lock); cable = loopback->cables[substream->number][dev];if (!cable) {
sound/soc/codecs/wm9712.c +1 -1
@@ -144,7 +144,7 @@ SOC_SINGLE("Playback Attenuate (-6dB) Switch", AC97_MASTER_TONE, 6, 1, 0),SOC_SINGLE ("Bass Volume" ,AC97_MASTER_TONE ,8 ,15 ,1 ),SOC_SINGLE ("Treble Volume" ,AC97_MASTER_TONE ,0 ,15 ,1 ), -SOC_SINGLE ("Capture ADC Switch" ,AC97_REC_GAIN ,15 ,1 ,1 ), +SOC_SINGLE ("Capture Switch" ,AC97_REC_GAIN ,15 ,1 ,1 ),SOC_ENUM ("Capture Volume Steps" , wm9712_enum[6 ]),SOC_DOUBLE ("Capture Volume" ,AC97_REC_GAIN ,8 ,0 ,63 ,1 ), SOC_SINGLE("Capture ZC Switch", AC97_REC_GAIN, 7, 1, 0),
sound/usb/mixer.c +7 -0
@@ -1246,6 +1246,13 @@ static int parse_audio_feature_unit(struct mixer_build *state, int unitid, void/* disable non-functional volume control */ master_bits &= ~UAC_CONTROL_BIT (UAC_FU_VOLUME );break ; +case USB_ID (0x1130 ,0xf211 ): +snd_printk (KERN_INFO +"usbmixer: volume control quirk for Tenx TP6911 Audio Headset\n" ); +/* disable non-functional volume control */ + channels =0 ; +break ; + }if (channels >0 ) first_ch_bits =snd_usb_combine_bytes (bmaControls + csize, csize);
sound/usb/quirks-table.h +53 -0
59 lines not on this page · raw message