Linux 2.6.30.5
Subsystems (49)
I'm announcing the release of the 2.6.30.5 kernel. All users of the 2.6.30 kernel series are very strongly encouraged to upgrade.
I'll also be replying to this message with a copy of the patch between 2.6.30.4 and 2.6.30.5
The updated 2.6.30.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-2.6.30.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.30.y.git;a=summarythanks,
greg k-h
------------
Makefile | 2 arch/powerpc/boot/dts/asp834x-redboot.dts | 2 arch/powerpc/boot/dts/mpc8349emitx.dts | 2 arch/powerpc/boot/dts/mpc834x_mds.dts | 2 arch/powerpc/boot/dts/sbc8349.dts | 2 arch/powerpc/platforms/83xx/mpc83xx.h | 4 - arch/powerpc/platforms/83xx/usb.c | 10 +-- arch/x86/include/asm/irqflags.h | 8 ++ arch/x86/kernel/vmi_32.c | 2 arch/x86/mm/pageattr.c | 39 ++++++++++---- block/Kconfig | 11 ++-- drivers/acpi/sleep.c | 8 ++ drivers/edac/x38_edac.c | 2 drivers/firewire/fw-sbp2.c | 10 +++ drivers/gpu/drm/i915/i915_dma.c | 5 + drivers/gpu/drm/i915/i915_drv.h | 8 ++ drivers/gpu/drm/i915/i915_gem.c | 13 ++++ drivers/gpu/drm/i915/i915_irq.c | 2 drivers/gpu/drm/i915/i915_suspend.c | 20 +++++++ drivers/gpu/drm/i915/intel_bios.c | 10 ++- drivers/gpu/drm/i915/intel_display.c | 2 drivers/gpu/drm/i915/intel_fb.c | 8 ++ drivers/gpu/drm/i915/intel_lvds.c | 17 +++++- drivers/hwmon/asus_atk0110.c | 6 +- drivers/hwmon/smsc47m1.c | 11 ++++ drivers/i2c/chips/tsl2550.c | 17 +++--- drivers/ide/ide-disk.c | 1 drivers/ide/ide-dma.c | 21 ------- drivers/ide/ide-iops.c | 3 - drivers/ide/ide-probe.c | 23 +++++++- drivers/ieee1394/sbp2.c | 1 drivers/ieee1394/sbp2.h | 8 ++ drivers/md/md.c | 15 +++++ drivers/md/raid5.c | 26 ++++----- drivers/net/atl1c/atl1c.h | 8 +- drivers/net/atl1c/atl1c_ethtool.c | 2 drivers/net/atl1c/atl1c_main.c | 2 drivers/net/benet/be.h | 2 drivers/net/benet/be_ethtool.c | 4 - drivers/net/benet/be_main.c | 45 +++++++++++----- drivers/net/e100.c | 3 + drivers/net/sky2.c | 2 drivers/net/usb/cdc_subset.c | 7 +- drivers/net/wireless/iwlwifi/iwl-agn.c | 19 ------- drivers/net/wireless/iwlwifi/iwl3945-base.c | 19 ------- drivers/parisc/eisa_eeprom.c | 2 drivers/platform/x86/Kconfig | 4 + drivers/scsi/libsas/sas_port.c | 19 +++++-- drivers/staging/rt2870/2870_main_dev.c | 67 ++++++++++++++++--------- drivers/staging/rt2870/common/2870_rtmp_init.c | 35 +++++-------- drivers/staging/rt2870/common/cmm_data.c | 3 + drivers/staging/rt2870/common/rtmp_init.c | 2 drivers/staging/rt2870/common/rtusb_io.c | 3 - drivers/staging/rt2870/rt2870.h | 6 -- drivers/staging/rt2870/rt_linux.h | 11 ++-- drivers/usb/core/devio.c | 10 ++- drivers/usb/serial/ftdi_sio.c | 3 + drivers/usb/serial/ftdi_sio.h | 14 +++++ drivers/usb/storage/transport.c | 2 drivers/usb/storage/unusual_devs.h | 7 ++ fs/binfmt_flat.c | 17 ++++-- fs/cifs/cifs_dfs_ref.c | 12 +++- fs/cifs/connect.c | 13 +++- fs/compat_ioctl.c | 1 fs/nfs/direct.c | 20 +++---- fs/nfs/read.c | 6 -- fs/nfs/write.c | 6 -- fs/nilfs2/segment.c | 16 +++++ fs/proc/base.c | 27 ++++------ fs/proc/task_mmu.c | 1 fs/proc/task_nommu.c | 1 fs/sysfs/dir.c | 2 include/linux/ide.h | 2 include/linux/netdevice.h | 5 - include/linux/nfs_fs.h | 5 - include/net/sctp/sctp.h | 1 include/net/sock.h | 34 +++++++----- kernel/fork.c | 22 ++++---- kernel/posix-timers.c | 7 ++ kernel/smp.c | 2 kernel/trace/ring_buffer.c | 11 +--- kernel/trace/trace.c | 10 ++- kernel/trace/trace_functions_graph.c | 11 +++- mm/hugetlb.c | 2 mm/page_alloc.c | 13 +++- net/ax25/ax25_in.c | 3 - net/core/dev.c | 10 +-- net/core/sock.c | 39 +++++++++++++- net/ipv4/ip_input.c | 3 + net/ipv6/ip6_input.c | 3 + net/irda/af_irda.c | 3 - net/irda/ircomm/ircomm_lmp.c | 1 net/socket.c | 2 net/wireless/scan.c | 4 + net/xfrm/xfrm_algo.c | 4 - sound/pci/hda/patch_realtek.c | 2 96 files changed, 612 insertions(+), 331 deletions(-)
Ajit Khaparde (1):
be2net: Fix to avoid a crash seen on PPC with LRO and Jumbo frames.
Alan Stern (1):
USB: usbfs: fix -ENOENT error code to be -ENODEV
Alok Kataria (1):
x86: Fix VMI && stack protector
Anton Vorontsov (1):
sky2: Fix checksum endianness
Bartlomiej Zolnierkiewicz (3):
PM / ACPI: HP G7000 Notebook needs a SCI_EN resume quirk
ide: fix handling of unexpected IRQs vs request_irq()
ide: relax DMA info validity checking
Dan Williams (1):
md/raid6: release spare page at ->stop()
David Brownell (1):
usbnet cdc_subset: fix issues talking to PXA gadgets
Dhaval Vasa (1):
USB: ftdi_sio: add product_id for Marvell OpenRD Base, Client
Eric Anholt (1):
drm/i915: Save/restore cursor state on suspend/resume.
Eric Dumazet (4):
net: sk_prot_alloc() should not blindly overwrite memory
net: sock_copy() fixes
execve: must clear current->clear_child_tid
ring-buffer: Fix memleak in ring_buffer_free()
Eric Sandeen (2):
hugetlbfs: fix i_blocks accounting
compat_ioctl: hook up compat handler for FIEMAP ioctl
Giacomo Lozito (1):
USB: storage: raise timeout in usb_stor_Bulk_max_lun
Greg Kroah-Hartman (2):
Staging: rt2870: Revert d44ca7 Removal of kernel_thread() API Linux 2.6.30.5
Grégoire Henry (1):
drm/i915: initialize fence registers to zero when loading GEM
H. Peter Anvin (1):
x86: fix assembly constraints in native_save_fl()
Henrique de Moraes Holschuh (1):
thinkpad-acpi: disable broken bay and dock subdrivers
Herbert Xu (5):
ipsec: Fix name of CAST algorithm
gro: Flush GRO packets in napi_disable_pending path
gso: Stop fraglists from escaping
net: Move rx skb_orphan call to where needed
inet: Call skb_orphan before tproxy activates
Hiroshi Shimamoto (1):
posix-timers: Fix oops in clock_nanosleep() with CLOCK_MONOTONIC_RAW
Jarod Wilson (1):
drm/i915: add ignore lvds quirk info for AOpen Mini PC
Jean Delvare (1):
hwmon: (smsc47m1) Differentiate between LPC47M233 and LPC47M292
Jeff Layton (1):
cifs: fix error handling in mount-time DFS referral chasing code
Jesse Barnes (2):
drm/i915: apply G45 vblank count code to all G4x chips and fix max_frame_count drm/i915: avoid non-atomic sysrq execution
Johannes Berg (1):
cfg80211: add two missing NULL pointer checks
John Stoffel (1):
Make SCSI SG v4 driver enabled by default and remove EXPERIMENTAL dependency, since udev depends on BSG
Keith Packard (1):
drm/i915: Hook connector to encoder during load detection (fixes tv/vga detect)
Krzysztof Halasa (1):
E100: work around the driver using streaming DMA mapping for RX descriptors.
Lai Jiangshan (2):
tracing: Fix invalid function_graph entry
tracing: Fix missing function_graph events when we splice_read from trace_pipe
Linus Torvalds (2):
flat: fix uninitialized ptr with shared libs Make sock_sendpage() use kernel_sendpage()
Lu Zhihe (1):
edac: x38 fix mchbar high register addr
Luca Tettamanti (1):
hwmon: (asus_atk0110) Fix upper limit readings
Ma Ling (1):
drm/i915: Set SSC frequency for 8xx chips correctly
Marko Hänninen (1):
USB: ftdi_sio: add vendor and product id for Bayer glucose meter serial converter cable
Maxime Bizon (1):
ide: fix memory leak when flush command is issued
Mel Gorman (1):
page-allocator: preserve PFN ordering when __GFP_COLD is set
Michael Buesch (2):
parisc: isa-eeprom - Fix loff_t usage
USB: devio: Properly do access_ok() checks
Michael Cousin (1):
drm/i915: Skip lvds with Aopen i945GTt-VFA
Michele Jr De Candia (1):
i2c/tsl2550: Fix lux value in dark environment
Neil Brown (1):
md: Handle growth of v1.x metadata correctly.
NeilBrown (1):
md: when a level change reduces the number of devices, remove the excess.
Oleg Nesterov (3):
mm_for_maps: simplify, use ptrace_may_access()
mm_for_maps: shift down_read(mmap_sem) to the caller
mm_for_maps: take ->cred_guard_mutex to fix the race with exec
Pallipadi, Venkatesh (1):
x86, pat: Fix set_memory_wc related corruption
Peter Korsgaard (1):
powerpc/mpc83xx: Fix usb mux setup for mpc834x
Peter Oberparleiter (1):
sysfs: fix hardlink count on device_move
Reinette Chatre (1):
iwlwifi: only show active power level via sysfs
Robert Richter (1):
ring-buffer: Fix advance of reader in rb_buffer_peek()
Roel Kluin (1):
atl1c: WAKE_MCAST tested twice, not WAKE_UCAST
Rogerio Brito (1):
USB: storage: include Prolific Technology USB drive in unusual_devs list
Ryusuke Konishi (1):
nilfs2: fix oops due to inconsistent state in page with discrete b-tree nodes
Stefan Richter (2):
firewire: sbp2: add support for disks >2 TB (and 16 bytes long CDBs)
ieee1394: sbp2: add support for disks >2 TB (and 16 bytes long CDBs)
Takashi Iwai (1):
ALSA: hda - Add missing vmaster initialization for ALC269
Thomas Hellstrom (1):
x86: Fix CPA memtype reserving in the set_pages_array*() cases
Tom Peng (1):
SCSI: libsas: reuse the original port when hotplugging phys in wide ports
Trond Myklebust (1):
NFS: Fix an O_DIRECT Oops...
Xiao Guangrong (1):
generic-ipi: fix hotplug_cfd()
roel kluin (2):
atl1c: add missing parentheses
atl1c: misplaced parenthesis
Makefile +1 -1
@@ -1,7 +1,7 @@ VERSION = 2 PATCHLEVEL = 6 SUBLEVEL = 30 -EXTRAVERSION = .4 +EXTRAVERSION = .5 NAME = Man-Eating Seals of Antiquity # *DOCUMENTATION*
arch/powerpc/boot/dts/asp834x-redboot.dts +1 -1
@@ -167,7 +167,7 @@ interrupt-parent = <&ipic>; interrupts = <39 0x8>; phy_type = "ulpi"; - port1; + port0; }; /* phy type (ULPI, UTMI, UTMI_WIDE, SERIAL) */ usb@23000 {
arch/powerpc/boot/dts/mpc8349emitx.dts +1 -1
@@ -156,7 +156,7 @@ interrupt-parent = <&ipic>; interrupts = <39 0x8>; phy_type = "ulpi"; - port1; + port0; }; usb@23000 {
arch/powerpc/boot/dts/mpc834x_mds.dts +1 -1
@@ -153,7 +153,7 @@ interrupt-parent = <&ipic>; interrupts = <39 0x8>; phy_type = "ulpi"; - port1; + port0; }; /* phy type (ULPI, UTMI, UTMI_WIDE, SERIAL) */ usb@23000 {
arch/powerpc/boot/dts/sbc8349.dts +1 -1
@@ -144,7 +144,7 @@ interrupt-parent = <&ipic>; interrupts = <39 0x8>; phy_type = "ulpi"; - port1; + port0; }; /* phy type (ULPI, UTMI, UTMI_WIDE, SERIAL) */ usb@23000 {
arch/powerpc/platforms/83xx/mpc83xx.h +2 -2
@@ -22,8 +22,8 @@/* system i/o configuration register low */ #define MPC83XX_SICRL_OFFS 0x114#define MPC834X_SICRL_USB_MASK 0x60000000 -#define MPC834X_SICRL_USB0 0x40000000 -#define MPC834X_SICRL_USB1 0x20000000 +#define MPC834X_SICRL_USB0 0x20000000 +#define MPC834X_SICRL_USB1 0x40000000#define MPC831X_SICRL_USB_MASK 0x00000c00#define MPC831X_SICRL_USB_ULPI 0x00000800#define MPC8315_SICRL_USB_MASK 0x000000fc
arch/powerpc/platforms/83xx/usb.c +5 -5
@@ -47,25 +47,25 @@ int mpc834x_usb_cfg(void) sccr |=MPC83XX_SCCR_USB_DRCM_11 ;/* 1:3 */ prop =of_get_property (np,"phy_type" ,NULL ); + port1_is_dr =1 ;if (prop && (!strcmp (prop,"utmi" ) || !strcmp (prop,"utmi_wide" ))) { sicrl |=MPC834X_SICRL_USB0 |MPC834X_SICRL_USB1 ; sicrh |=MPC834X_SICRH_USB_UTMI ; - port1_is_dr =1 ; + port0_is_dr =1 ; }else if (prop && !strcmp (prop,"serial" )) { dr_mode =of_get_property (np,"dr_mode" ,NULL );if (dr_mode && !strcmp (dr_mode,"otg" )) { sicrl |=MPC834X_SICRL_USB0 |MPC834X_SICRL_USB1 ; - port1_is_dr =1 ; + port0_is_dr =1 ; }else { - sicrl |=MPC834X_SICRL_USB0 ; + sicrl |=MPC834X_SICRL_USB1 ; } }else if (prop && !strcmp (prop,"ulpi" )) { - sicrl |=MPC834X_SICRL_USB0 ; + sicrl |=MPC834X_SICRL_USB1 ; }else {printk (KERN_WARNING "834x USB PHY type not supported\n" ); } - port0_is_dr =1 ;of_node_put (np); } np =of_find_compatible_node (NULL ,NULL ,"fsl-usb2-mph" );
arch/x86/include/asm/irqflags.h +7 -1
@@ -12,9 +12,15 @@ static inline unsigned long native_save_fl(void) {unsigned long flags; +/* +* Note: this needs to be "=r" not "=rm", because we have the +* stack offset from what gcc expects at the time the "pop" is +* executed, and so a memory reference with respect to the stack +* would end up using the wrong address. +*/ asmvolatile ("# __raw_save_flags\n\t" "pushf ; pop %0" - :"=g" (flags) + :"=r" (flags) :/* no input */ :"memory" );
arch/x86/kernel/vmi_32.c +1 -1
@@ -441,7 +441,7 @@ vmi_startup_ipi_hook(int phys_apicid, unsigned long start_eip, ap.ds = __USER_DS; ap.es = __USER_DS; ap.fs = __KERNEL_PERCPU; - ap.gs =0 ; + ap.gs = __KERNEL_STACK_CANARY; ap.eflags =0 ;
arch/x86/mm/pageattr.c +27 -12
@@ -590,9 +590,12 @@ static int __change_page_attr(struct cpa_data *cpa, int primary)unsigned int level;pte_t *kpte, old_pte; -if (cpa->flags &CPA_PAGES_ARRAY ) - address = (unsigned long )page_address (cpa->pages[cpa->curpage]); -else if (cpa->flags &CPA_ARRAY ) +if (cpa->flags &CPA_PAGES_ARRAY ) { +struct page *page = cpa->pages[cpa->curpage]; +if (unlikely (PageHighMem (page))) +return 0 ; + address = (unsigned long )page_address (page); + }else if (cpa->flags &CPA_ARRAY ) address = cpa->vaddr[cpa->curpage];else address = *cpa->vaddr;
@@ -695,9 +698,12 @@ static int cpa_process_alias(struct cpa_data *cpa)* No need to redo, when the primary call touched the direct * mapping already: */ -if (cpa->flags &CPA_PAGES_ARRAY ) - vaddr = (unsigned long )page_address (cpa->pages[cpa->curpage]); -else if (cpa->flags &CPA_ARRAY ) +if (cpa->flags &CPA_PAGES_ARRAY ) { +struct page *page = cpa->pages[cpa->curpage]; +if (unlikely (PageHighMem (page))) +return 0 ; + vaddr = (unsigned long )page_address (page); + }else if (cpa->flags &CPA_ARRAY ) vaddr = cpa->vaddr[cpa->curpage];else vaddr = *cpa->vaddr;
@@ -996,12 +1002,15 @@ EXPORT_SYMBOL(set_memory_array_uc);int _set_memory_wc (unsigned long addr,int numpages) {int ret; +unsigned long addr_copy = addr; + ret =change_page_attr_set (&addr, numpages,__pgprot (_PAGE_CACHE_UC_MINUS),0 ); -if (!ret) { - ret =change_page_attr_set (&addr, numpages, -__pgprot (_PAGE_CACHE_WC),0 ); + ret =change_page_attr_set_clr (&addr_copy, numpages, +__pgprot (_PAGE_CACHE_WC), +__pgprot (_PAGE_CACHE_MASK), +0 ,0 ,NULL ); }return ret; }
@@ -1118,7 +1127,9 @@ int set_pages_array_uc(struct page **pages, int addrinarray)int free_idx;for (i =0 ; i < addrinarray; i++) { - start = (unsigned long )page_address (pages[i]); +if (PageHighMem (pages[i])) +continue ; + start =page_to_pfn (pages[i]) <<PAGE_SHIFT ; end = start +PAGE_SIZE ;if (reserve_memtype (start, end, _PAGE_CACHE_UC_MINUS,NULL )) goto err_out;
@@ -1131,7 +1142,9 @@ int set_pages_array_uc(struct page **pages, int addrinarray) err_out: free_idx = i;for (i =0 ; i < free_idx; i++) { - start = (unsigned long )page_address (pages[i]); +if (PageHighMem (pages[i])) +continue ; + start =page_to_pfn (pages[i]) <<PAGE_SHIFT ; end = start +PAGE_SIZE ;free_memtype (start, end); }
@@ -1160,7 +1173,9 @@ int set_pages_array_wb(struct page **pages, int addrinarray)return retval;for (i =0 ; i < addrinarray; i++) { - start = (unsigned long )page_address (pages[i]); +if (PageHighMem (pages[i])) +continue ; + start =page_to_pfn (pages[i]) <<PAGE_SHIFT ; end = start +PAGE_SIZE ;free_memtype (start, end); }
block/Kconfig +7 -4
@@ -45,9 +45,9 @@ config LBD If unsure, say N. config BLK_DEV_BSG - bool "Block layer SG support v4 (EXPERIMENTAL)" - depends on EXPERIMENTAL - ---help--- + bool "Block layer SG support v4" + default y + help Saying Y here will enable generic SG (SCSI generic) v4 support for any block device.
@@ -57,7 +57,10 @@ config BLK_DEV_BSG protocols (e.g. Task Management Functions and SMP in Serial Attached SCSI). - If unsure, say N. + This option is required by recent UDEV versions to properly + access device serial numbers, etc. + + If unsure, say Y. config BLK_DEV_INTEGRITY bool "Block layer data integrity support"
drivers/acpi/sleep.c +8 -0
@@ -397,6 +397,14 @@ static struct dmi_system_id __initdata acpisleep_dmi_table[] = { }, }, { + .callback = init_set_sci_en_on_resume, + .ident = "Hewlett-Packard HP G7000 Notebook PC", + .matches = { +DMI_MATCH (DMI_SYS_VENDOR ,"Hewlett-Packard" ), + DMI_MATCH(DMI_PRODUCT_NAME, "HP G7000 Notebook PC"), + }, + }, + { .callback = init_old_suspend_ordering, .ident = "Panasonic CF51-2L", .matches = {
drivers/edac/x38_edac.c +1 -1
@@ -30,7 +30,7 @@/* Intel X38 register addresses - device 0 function 0 - DRAM Controller */ #define X38_MCHBAR_LOW 0x48/* MCH Memory Mapped Register BAR */ -#define X38_MCHBAR_HIGH 0x4b +#define X38_MCHBAR_HIGH 0x4c#define X38_MCHBAR_MASK 0xfffffc000ULL/* bits 35:14 */ #define X38_MMR_WINDOW_SIZE 16384
drivers/firewire/fw-sbp2.c +9 -1
@@ -190,6 +190,12 @@ struct sbp2_target {#define SBP2_CYCLE_LIMIT (0xc8 << 12)/* 200 125us cycles */ /* +* There is no transport protocol limit to the CDB length, but we implement +* a fixed length only. 16 bytes is enough for disks larger than 2 TB. +*/ +#define SBP2_MAX_CDB_SIZE 16 + +/* * The default maximum s/g segment size of a FireWire controller is * usually 0x10000, but SBP-2 only allows 0xffff. Since buffers have to * be quadlet-aligned, we set the length limit to 0xffff & ~3.
@@ -301,7 +307,7 @@ struct sbp2_command_orb {struct sbp2_pointer next;struct sbp2_pointer data_descriptor;__be32 misc; -u8 command_block[12 ]; +u8 command_block[SBP2_MAX_CDB_SIZE ]; } request;struct scsi_cmnd *cmd;scsi_done_fn_t done;
@@ -1135,6 +1141,8 @@ static int sbp2_probe(struct device *dev)if (fw_device_enable_phys_dma (device) <0 ) goto fail_shost_put; + shost->max_cmd_len =SBP2_MAX_CDB_SIZE ; +if (scsi_add_host (shost, &unit->device) <0 ) goto fail_shost_put;
drivers/gpu/drm/i915/i915_dma.c +4 -1
@@ -1153,8 +1153,11 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)#endif dev->driver->get_vblank_counter = i915_get_vblank_counter; -if (IS_GM45 (dev)) + dev->max_vblank_count =0xffffff ;/* only 24 bits of frame count */ +if (IS_G4X (dev)) { + dev->max_vblank_count =0xffffffff ;/* full 32 bit counter */ dev->driver->get_vblank_counter = gm45_get_vblank_counter; + }i915_gem_load (dev);
drivers/gpu/drm/i915/i915_drv.h +8 -0
@@ -285,6 +285,13 @@ typedef struct drm_i915_private {u8 saveDACMASK;u8 saveCR[37 ];uint64_t saveFENCE[16 ]; +u32 saveCURACNTR; +u32 saveCURAPOS; +u32 saveCURABASE; +u32 saveCURBCNTR; +u32 saveCURBPOS; +u32 saveCURBBASE; +u32 saveCURSIZE;struct {struct drm_mm gtt_space;
@@ -642,6 +649,7 @@ void i915_gem_detach_phys_object(struct drm_device *dev,void i915_gem_free_all_phys_object (struct drm_device *dev);int i915_gem_object_get_pages (struct drm_gem_object *obj);void i915_gem_object_put_pages (struct drm_gem_object *obj); +void i915_gem_release (struct drm_device * dev,struct drm_file *file_priv);/* i915_gem_tiling.c */ void i915_gem_detect_bit_6_swizzle (struct drm_device *dev);
drivers/gpu/drm/i915/i915_gem.c +13 -0
@@ -4154,6 +4154,7 @@ i915_gem_lastclose(struct drm_device *dev)void i915_gem_load (struct drm_device *dev) { +int i;drm_i915_private_t *dev_priv = dev->dev_private;spin_lock_init (&dev_priv->mm.active_list_lock);
@@ -4173,6 +4174,18 @@ i915_gem_load(struct drm_device *dev)else dev_priv->num_fence_regs =8 ; +/* Initialize fence registers to zero */ +if (IS_I965G (dev)) { +for (i =0 ; i <16 ; i++) +I915_WRITE64 (FENCE_REG_965_0 + (i *8 ),0 ); + }else { +for (i =0 ; i <8 ; i++) +I915_WRITE (FENCE_REG_830_0 + (i *4 ),0 ); +if (IS_I945G (dev) ||IS_I945GM (dev) ||IS_G33 (dev)) +for (i =0 ; i <8 ; i++) +I915_WRITE (FENCE_REG_945_8 + (i *4 ),0 ); + } +i915_gem_detect_bit_6_swizzle (dev); }
drivers/gpu/drm/i915/i915_irq.c +0 -2
@@ -572,8 +572,6 @@ int i915_driver_irq_postinstall(struct drm_device *dev) dev_priv->vblank_pipe =DRM_I915_VBLANK_PIPE_A |DRM_I915_VBLANK_PIPE_B ; - dev->max_vblank_count =0xffffff ;/* only 24 bits of frame count */ -/* Unmask the interrupts that we always want on. */ dev_priv->irq_mask_reg = ~I915_INTERRUPT_ENABLE_FIX ;
drivers/gpu/drm/i915/i915_suspend.c +20 -0
@@ -295,6 +295,16 @@ int i915_save_state(struct drm_device *dev)i915_save_palette (dev,PIPE_B ); dev_priv->savePIPEBSTAT =I915_READ (PIPEBSTAT ); +/* Cursor state */ + dev_priv->saveCURACNTR =I915_READ (CURACNTR ); + dev_priv->saveCURAPOS =I915_READ (CURAPOS ); + dev_priv->saveCURABASE =I915_READ (CURABASE ); + dev_priv->saveCURBCNTR =I915_READ (CURBCNTR ); + dev_priv->saveCURBPOS =I915_READ (CURBPOS ); + dev_priv->saveCURBBASE =I915_READ (CURBBASE ); +if (!IS_I9XX (dev)) + dev_priv->saveCURSIZE =I915_READ (CURSIZE ); +/* CRT state */ dev_priv->saveADPA =I915_READ (ADPA );
@@ -480,6 +490,16 @@ int i915_restore_state(struct drm_device *dev)I915_WRITE (DSPBCNTR , dev_priv->saveDSPBCNTR);I915_WRITE (DSPBADDR ,I915_READ (DSPBADDR )); +/* Cursor state */ +I915_WRITE (CURAPOS , dev_priv->saveCURAPOS); +I915_WRITE (CURACNTR , dev_priv->saveCURACNTR); +I915_WRITE (CURABASE , dev_priv->saveCURABASE); +I915_WRITE (CURBPOS , dev_priv->saveCURBPOS); +I915_WRITE (CURBCNTR , dev_priv->saveCURBCNTR); +I915_WRITE (CURBBASE , dev_priv->saveCURBBASE); +if (!IS_I9XX (dev)) +I915_WRITE (CURSIZE , dev_priv->saveCURSIZE); +/* CRT state */ I915_WRITE (ADPA , dev_priv->saveADPA);
drivers/gpu/drm/i915/intel_bios.c +6 -4
@@ -185,10 +185,12 @@ parse_general_features(struct drm_i915_private *dev_priv, dev_priv->lvds_use_ssc = general->enable_ssc;if (dev_priv->lvds_use_ssc) { -if (IS_I855 (dev_priv->dev)) - dev_priv->lvds_ssc_freq = general->ssc_freq ?66 :48 ; -else - dev_priv->lvds_ssc_freq = general->ssc_freq ?100 :96 ; +if (IS_I85X (dev_priv->dev)) + dev_priv->lvds_ssc_freq = + general->ssc_freq ?66 :48 ; +else + dev_priv->lvds_ssc_freq = + general->ssc_freq ?100 :96 ; } } }
drivers/gpu/drm/i915/intel_display.c +2 -0
@@ -1590,6 +1590,7 @@ struct drm_crtc *intel_get_load_detect_pipe(struct intel_output *intel_output, } encoder->crtc = crtc; + intel_output->base.encoder = encoder; intel_output->load_detect_temp = true; intel_crtc =to_intel_crtc (crtc);
@@ -1625,6 +1626,7 @@ void intel_release_load_detect_pipe(struct intel_output *intel_output, int dpms_if (intel_output->load_detect_temp) { encoder->crtc =NULL ; + intel_output->base.encoder =NULL ; intel_output->load_detect_temp = false; crtc->enabled =drm_helper_crtc_in_use (crtc);drm_helper_disable_unused_functions (dev);
drivers/gpu/drm/i915/intel_fb.c +7 -1
@@ -857,9 +857,15 @@ void intelfb_restore(void)drm_crtc_helper_set_config (&kernelfb_mode); } +static void intelfb_restore_work_fn (struct work_struct *ignored) +{ +intelfb_restore (); +} +static DECLARE_WORK(intelfb_restore_work, intelfb_restore_work_fn); +static void intelfb_sysrq (int dummy1,struct tty_struct *dummy3) { -intelfb_restore (); +schedule_work (&intelfb_restore_work); }static struct sysrq_key_op sysrq_intelfb_restore_op = {
drivers/gpu/drm/i915/intel_lvds.c +15 -2
@@ -420,8 +420,21 @@ static const struct dmi_system_id intel_no_lvds[] = { DMI_MATCH(DMI_PRODUCT_NAME, "Studio Hybrid 140g"), }, }, - -/* FIXME: add a check for the Aopen Mini PC */ + { + .callback = intel_no_lvds_dmi_callback, + .ident = "AOpen Mini PC", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "AOpen"), + DMI_MATCH(DMI_PRODUCT_NAME, "i965GMx-IF"), + }, + }, + { + .callback = intel_no_lvds_dmi_callback, + .ident = "Aopen i945GTt-VFA", + .matches = { + DMI_MATCH(DMI_PRODUCT_VERSION, "AO00001JW"), + }, + }, { }/* terminating entry */ };
drivers/hwmon/asus_atk0110.c +5 -1
@@ -593,7 +593,11 @@ static int atk_add_sensor(struct atk_data *data, union acpi_object *obj) sensor->data = data; sensor->id = flags->integer.value; sensor->limit1 = limit1->integer.value; - sensor->limit2 = limit2->integer.value; +if (data->old_interface) + sensor->limit2 = limit2->integer.value; +else +/* The upper limit is expressed as delta from lower limit */ + sensor->limit2 = sensor->limit1 + limit2->integer.value;snprintf (sensor->input_attr_name,ATTR_NAME_SIZE ,"%s%d_input" , base_name, start + *num);
drivers/hwmon/smsc47m1.c +11 -0
@@ -86,6 +86,7 @@ superio_exit(void)#define SUPERIO_REG_ACT 0x30#define SUPERIO_REG_BASE 0x60#define SUPERIO_REG_DEVID 0x20 +#define SUPERIO_REG_DEVREV 0x21/* Logical device registers */
@@ -429,6 +430,9 @@ static int __init smsc47m1_find(unsigned short *addr,* The LPC47M292 (device id 0x6B) is somewhat compatible, but it * supports a 3rd fan, and the pin configuration registers are * unfortunately different. +* The LPC47M233 has the same device id (0x6B) but is not compatible. +* We check the high bit of the device revision register to +* differentiate them. */ switch (val) {case 0x51 :
@@ -448,6 +452,13 @@ static int __init smsc47m1_find(unsigned short *addr, sio_data->type = smsc47m1;break ;case 0x6B : +if (superio_inb (SUPERIO_REG_DEVREV ) &0x80 ) { +pr_debug (DRVNAME ": " +"Found SMSC LPC47M233, unsupported\n" ); +superio_exit (); +return -ENODEV ; + } +pr_info (DRVNAME ": Found SMSC LPC47M292\n" ); sio_data->type = smsc47m2;break ;
drivers/i2c/chips/tsl2550.c +10 -7
@@ -27,7 +27,7 @@#include <linux/delay.h> #define TSL2550_DRV_NAME "tsl2550" -#define DRIVER_VERSION "1.1.1" +#define DRIVER_VERSION "1.1.2"/* * Defines
@@ -189,13 +189,16 @@ static int tsl2550_calculate_lux(u8 ch0, u8 ch1)u8 r =128 ;/* Avoid division by 0 and count 1 cannot be greater than count 0 */ -if (c0 && (c1 <= c0)) - r = c1 *128 / c0; +if (c1 <= c0) +if (c0) { + r = c1 *128 / c0; + +/* Calculate LUX */ + lux = ((c0 - c1) * ratio_lut[r]) /256 ; + }else + lux =0 ;else -return -1 ; - -/* Calculate LUX */ - lux = ((c0 - c1) * ratio_lut[r]) /256 ; +return -EAGAIN ;/* LUX range check */ return lux >TSL2550_MAX_LUX ?TSL2550_MAX_LUX : lux;
drivers/ide/ide-disk.c +1 -0
@@ -413,6 +413,7 @@ static void idedisk_prepare_flush(struct request_queue *q, struct request *rq) rq->cmd_type =REQ_TYPE_ATA_TASKFILE ; rq->cmd_flags |=REQ_SOFTBARRIER ; rq->special = cmd; + cmd->rq = rq; }ide_devset_get (multcount, mult_count);
drivers/ide/ide-dma.c +0 -21
@@ -362,9 +362,6 @@ static int ide_tune_dma(ide_drive_t *drive)if (__ide_dma_bad_drive (drive))return 0 ; -if (ide_id_dma_bug (drive)) -return 0 ; -if (hwif->host_flags &IDE_HFLAG_TRUST_BIOS_FOR_DMA )return config_drive_for_dma (drive);
@@ -395,24 +392,6 @@ static int ide_dma_check(ide_drive_t *drive)return -1 ; } -int ide_id_dma_bug (ide_drive_t *drive) -{ -u16 *id = drive->id; - -if (id[ATA_ID_FIELD_VALID ] &4 ) { -if ((id[ATA_ID_UDMA_MODES ] >>8 ) && - (id[ATA_ID_MWDMA_MODES ] >>8 )) - goto err_out; - }else if ((id[ATA_ID_MWDMA_MODES ] >>8 ) && - (id[ATA_ID_SWDMA_MODES ] >>8 )) - goto err_out; - -return 0 ; -err_out: -printk (KERN_ERR "%s: bad DMA info in identify block\n" , drive->name); -return 1 ; -} -int ide_set_dma (ide_drive_t *drive) {int rc;
drivers/ide/ide-iops.c +0 -3
@@ -306,9 +306,6 @@ int ide_driveid_update(ide_drive_t *drive)kfree (id); -if ((drive->dev_flags &IDE_DFLAG_USING_DMA ) &&ide_id_dma_bug (drive)) -ide_dma_off (drive); -return 1 ; out_err:SELECT_MASK (drive,0 );
drivers/ide/ide-probe.c +20 -3
@@ -830,6 +830,24 @@ static int ide_port_setup_devices(ide_hwif_t *hwif)return j; } +static void ide_host_enable_irqs (struct ide_host *host) +{ +ide_hwif_t *hwif; +int i; + +ide_host_for_each_port (i, hwif, host) { +if (hwif ==NULL ) +continue ; + +/* clear any pending IRQs */ + hwif->tp_ops->read_status (hwif); + +/* unmask IRQs */ +if (hwif->io_ports.ctl_addr) + hwif->tp_ops->write_devctl (hwif,ATA_DEVCTL_OBS ); + } +} +/* * This routine sets up the IRQ for an IDE interface. */
@@ -843,9 +861,6 @@ static int init_irq (ide_hwif_t *hwif)if (irq_handler ==NULL ) irq_handler = ide_intr; -if (io_ports->ctl_addr) - hwif->tp_ops->write_devctl (hwif,ATA_DEVCTL_OBS ); -if (request_irq (hwif->irq, irq_handler, sa, hwif->name, hwif)) goto out_up;
@@ -1389,6 +1404,8 @@ int ide_host_register(struct ide_host *host, const struct ide_port_info *d,ide_port_tune_devices (hwif); } +ide_host_enable_irqs (host); +ide_host_for_each_port (i, hwif, host) {if (hwif ==NULL )continue ;
drivers/ieee1394/sbp2.c +1 -0
@@ -880,6 +880,7 @@ static struct sbp2_lu *sbp2_alloc_device(struct unit_directory *ud) } shost->hostdata[0 ] = (unsigned long )lu; + shost->max_cmd_len =SBP2_MAX_CDB_SIZE ;if (!scsi_add_host (shost, &ud->device)) { lu->shost = shost;
drivers/ieee1394/sbp2.h +7 -1
@@ -25,6 +25,12 @@#define SBP2_DEVICE_NAME "sbp2"/* +* There is no transport protocol limit to the CDB length, but we implement +* a fixed length only. 16 bytes is enough for disks larger than 2 TB. +*/ +#define SBP2_MAX_CDB_SIZE 16 + +/* * SBP-2 specific definitions */
@@ -51,7 +57,7 @@ struct sbp2_command_orb {u32 data_descriptor_hi;u32 data_descriptor_lo;u32 misc; -u8 cdb[12 ]; +u8 cdb[SBP2_MAX_CDB_SIZE ]; } __attribute__((packed));#define SBP2_LOGIN_REQUEST 0x0
drivers/md/md.c +14 -1
@@ -1410,8 +1410,14 @@ static void super_1_sync(mddev_t *mddev, mdk_rdev_t *rdev)if (rdev2->desc_nr+1 > max_dev) max_dev = rdev2->desc_nr+1 ; -if (max_dev >le32_to_cpu (sb->max_dev)) +if (max_dev >le32_to_cpu (sb->max_dev)) { +int bmask; sb->max_dev =cpu_to_le32 (max_dev); + rdev->sb_size = max_dev *2 +256 ; + bmask =queue_hardsect_size (rdev->bdev->bd_disk->queue)-1 ; +if (rdev->sb_size & bmask) + rdev->sb_size = (rdev->sb_size | bmask) +1 ; + }for (i=0 ; i<max_dev;i++) sb->dev_roles[i] =cpu_to_le16 (0xfffe );
@@ -2680,6 +2686,7 @@ level_store(mddev_t *mddev, const char *buf, size_t len)ssize_t rv = len;struct mdk_personality *pers;void *priv; +mdk_rdev_t *rdev;if (mddev->pers ==NULL ) {if (len ==0 )
@@ -2759,6 +2766,12 @@ level_store(mddev_t *mddev, const char *buf, size_t len)mddev_suspend (mddev); mddev->pers->stop (mddev);module_put (mddev->pers->owner); +/* Invalidate devices that are now superfluous */ +list_for_each_entry (rdev, &mddev->disks, same_set) +if (rdev->raid_disk >= mddev->raid_disks) { + rdev->raid_disk =-1 ; +clear_bit (In_sync, &rdev->flags); + } mddev->pers = pers; mddev->private = priv;strlcpy (mddev->clevel, pers->name,sizeof (mddev->clevel));
drivers/md/raid5.c +12 -14
@@ -4310,6 +4310,15 @@ raid5_size(mddev_t *mddev, sector_t sectors, int raid_disks)return sectors * (raid_disks - conf->max_degraded); } +static void free_conf (raid5_conf_t *conf) +{ +shrink_stripes (conf); +safe_put_page (conf->spare_page); +kfree (conf->disks); +kfree (conf->stripe_hashtbl); +kfree (conf); +} +static raid5_conf_t *setup_conf (mddev_t *mddev) {raid5_conf_t *conf;
@@ -4439,11 +4448,7 @@ static raid5_conf_t *setup_conf(mddev_t *mddev) abort:if (conf) { -shrink_stripes (conf); -safe_put_page (conf->spare_page); -kfree (conf->disks); -kfree (conf->stripe_hashtbl); -kfree (conf); +free_conf (conf);return ERR_PTR (-EIO ); }else return ERR_PTR (-ENOMEM );
@@ -4609,12 +4614,8 @@ abort:md_unregister_thread (mddev->thread); mddev->thread =NULL ;if (conf) { -shrink_stripes (conf);print_raid5_conf (conf); -safe_put_page (conf->spare_page); -kfree (conf->disks); -kfree (conf->stripe_hashtbl); -kfree (conf); +free_conf (conf); } mddev->private =NULL ;printk (KERN_ALERT "raid5: failed to run raid set %s\n" ,mdname (mddev));
@@ -4629,13 +4630,10 @@ static int stop(mddev_t *mddev)md_unregister_thread (mddev->thread); mddev->thread =NULL ; -shrink_stripes (conf); -kfree (conf->stripe_hashtbl); mddev->queue->backing_dev_info.congested_fn =NULL ;blk_sync_queue (mddev->queue);/* the unplug fn references 'conf'*/ sysfs_remove_group (&mddev->kobj, &raid5_attrs_group); -kfree (conf->disks); -kfree (conf); +free_conf (conf); mddev->private =NULL ;return 0 ; }
drivers/net/atl1c/atl1c.h +4 -4
@@ -188,14 +188,14 @@ struct atl1c_tpd_ext_desc {#define RRS_HDS_TYPE_DATA 2#define RRS_IS_NO_HDS_TYPE (flag) \ - (((flag) >> (RRS_HDS_TYPE_SHIFT)) & RRS_HDS_TYPE_MASK == 0) + ((((flag) >> (RRS_HDS_TYPE_SHIFT)) & RRS_HDS_TYPE_MASK) == 0)#define RRS_IS_HDS_HEAD (flag) \ - (((flag) >> (RRS_HDS_TYPE_SHIFT)) & RRS_HDS_TYPE_MASK == \ + ((((flag) >> (RRS_HDS_TYPE_SHIFT)) & RRS_HDS_TYPE_MASK) == \ RRS_HDS_TYPE_HEAD)#define RRS_IS_HDS_DATA (flag) \ - (((flag) >> (RRS_HDS_TYPE_SHIFT)) & RRS_HDS_TYPE_MASK == \ + ((((flag) >> (RRS_HDS_TYPE_SHIFT)) & RRS_HDS_TYPE_MASK) == \ RRS_HDS_TYPE_DATA)/* rrs word 3 bit 0:31 */
@@ -245,7 +245,7 @@ struct atl1c_tpd_ext_desc {#define RRS_PACKET_TYPE_802_3 1#define RRS_PACKET_TYPE_ETH 0#define RRS_PACKET_IS_ETH (word) \ - (((word) >> RRS_PACKET_TYPE_SHIFT) & RRS_PACKET_TYPE_MASK == \ + ((((word) >> RRS_PACKET_TYPE_SHIFT) & RRS_PACKET_TYPE_MASK) == \ RRS_PACKET_TYPE_ETH)#define RRS_RXD_IS_VALID (word) \ ((((word) >> RRS_RXD_UPDATED_SHIFT) & RRS_RXD_UPDATED_MASK) == 1)
drivers/net/atl1c/atl1c_ethtool.c +1 -1
@@ -271,7 +271,7 @@ static int atl1c_set_wol(struct net_device *netdev, struct ethtool_wolinfo *wol)struct atl1c_adapter *adapter =netdev_priv (netdev);if (wol->wolopts & (WAKE_ARP |WAKE_MAGICSECURE | -WAKE_MCAST |WAKE_BCAST |WAKE_MCAST )) +WAKE_UCAST |WAKE_BCAST |WAKE_MCAST ))return -EOPNOTSUPP ;/* these settings will always override what we currently have */ adapter->wol =0 ;
drivers/net/atl1c/atl1c_main.c +1 -1
@@ -1701,7 +1701,7 @@ static void atl1c_clean_rx_irq(struct atl1c_adapter *adapter, u8 que,if (likely (RRS_RXD_IS_VALID (rrs->word3))) { rfd_num = (rrs->word0 >>RRS_RX_RFD_CNT_SHIFT ) &RRS_RX_RFD_CNT_MASK ; -if (unlikely (rfd_num) !=1 ) +if (unlikely (rfd_num !=1 ))/* TODO support mul rfd*/ if (netif_msg_rx_err (adapter)) dev_warn(&pdev->dev,
drivers/net/benet/be.h +1 -1
@@ -73,7 +73,7 @@ static inline char *nic_name(struct pci_dev *pdev)#define RX_FRAGS_REFILL_WM (RX_Q_LEN - MAX_RX_POST)#define BE_MAX_LRO_DESCRIPTORS 16 -#define BE_MAX_FRAGS_PER_FRAME 16 +#define BE_MAX_FRAGS_PER_FRAME (min((u32) 16, (u32) MAX_SKB_FRAGS))struct be_dma_mem {void *va;
drivers/net/benet/be_ethtool.c +2 -2
@@ -162,8 +162,8 @@ be_set_coalesce(struct net_device *netdev, struct ethtool_coalesce *coalesce)return -EINVAL ; adapter->max_rx_coal = coalesce->rx_max_coalesced_frames; -if (adapter->max_rx_coal >MAX_SKB_FRAGS ) - adapter->max_rx_coal =MAX_SKB_FRAGS -1 ; +if (adapter->max_rx_coal >BE_MAX_FRAGS_PER_FRAME ) + adapter->max_rx_coal =BE_MAX_FRAGS_PER_FRAME ;/* if AIC is being turned on now, start with an EQD of 0 */ if (rx_eq->enable_aic == 0 &&
drivers/net/benet/be_main.c +32 -13
88 lines not on this page · raw message
drivers/net/e100.c +3 -0
@@ -1762,6 +1762,9 @@ static int e100_rx_indicate(struct nic *nic, struct rx *rx,if (ioread8 (&nic->csr->scb.status) & rus_no_res) nic->ru_running =RU_SUSPENDED ; +pci_dma_sync_single_for_device (nic->pdev, rx->dma_addr, +sizeof (struct rfd ), +PCI_DMA_BIDIRECTIONAL );return -ENODATA ; }
drivers/net/sky2.c +1 -1
@@ -2441,7 +2441,7 @@ static int sky2_status_intr(struct sky2_hw *hw, int to_do, u16 idx)if (likely (status >>16 == (status &0xffff ))) { skb = sky2->rx_ring[sky2->rx_next].skb; skb->ip_summed =CHECKSUM_COMPLETE ; - skb->csum = status &0xffff ; + skb->csum =le16_to_cpu (status); }else { printk(KERN_NOTICE PFX "%s: hardware receive " "checksum problem (status = %#x)\n",
drivers/net/usb/cdc_subset.c +4 -3
@@ -307,9 +307,10 @@ static const struct usb_device_id products [] = { USB_DEVICE (0x1286, 0x8001), // "blob" bootloader .driver_info = (unsigned long ) &blob_info, }, { -// Linux Ethernet/RNDIS gadget on pxa210/25x/26x, second config -// e.g. Gumstix, current OpenZaurus, ... -USB_DEVICE_VER (0x0525 ,0xa4a2 ,0x0203 ,0x0203 ), +// Linux Ethernet/RNDIS gadget, mostly on PXA, second config +// e.g. Gumstix, current OpenZaurus, ... or anything else +// that just enables this gadget option. +USB_DEVICE (0x0525 ,0xa4a2 ), .driver_info = (unsigned long) &linuxdev_info, }, #endif
drivers/net/wireless/iwlwifi/iwl-agn.c +1 -18
@@ -3101,27 +3101,10 @@ static ssize_t show_power_level(struct device *d, struct device_attribute *attr, char *buf) { struct iwl_priv *priv = dev_get_drvdata(d); -int mode = priv->power_data.user_power_setting; -int system = priv->power_data.system_power_setting;int level = priv->power_data.power_mode;char *p = buf; -switch (system) { -case IWL_POWER_SYS_AUTO : - p +=sprintf (p,"SYSTEM:auto" ); -break ; -case IWL_POWER_SYS_AC : - p +=sprintf (p,"SYSTEM:ac" ); -break ; -case IWL_POWER_SYS_BATTERY : - p +=sprintf (p,"SYSTEM:battery" ); -break ; - } - - p +=sprintf (p,"\tMODE:%s" , (mode <IWL_POWER_AUTO ) ? -"fixed" :"auto" ); - p +=sprintf (p,"\tINDEX:%d" , level); - p +=sprintf (p,"\n" ); + p +=sprintf (p,"%d\n" , level);return p - buf +1 ; }
drivers/net/wireless/iwlwifi/iwl3945-base.c +1 -18
@@ -4623,27 +4623,10 @@ static ssize_t show_power_level(struct device *d, struct device_attribute *attr, char *buf) { struct iwl_priv *priv = dev_get_drvdata(d); -int mode = priv->power_data.user_power_setting; -int system = priv->power_data.system_power_setting;int level = priv->power_data.power_mode;char *p = buf; -switch (system) { -case IWL_POWER_SYS_AUTO : - p +=sprintf (p,"SYSTEM:auto" ); -break ; -case IWL_POWER_SYS_AC : - p +=sprintf (p,"SYSTEM:ac" ); -break ; -case IWL_POWER_SYS_BATTERY : - p +=sprintf (p,"SYSTEM:battery" ); -break ; - } - - p +=sprintf (p,"\tMODE:%s" , (mode <IWL_POWER_AUTO ) ? -"fixed" :"auto" ); - p +=sprintf (p,"\tINDEX:%d" , level); - p +=sprintf (p,"\n" ); + p +=sprintf (p,"%d\n" , level);return p - buf +1 ; }
drivers/parisc/eisa_eeprom.c +1 -1
@@ -55,7 +55,7 @@ static ssize_t eisa_eeprom_read(struct file * file,ssize_t ret;int i; -if (*ppos >=HPEE_MAX_LENGTH ) +if (*ppos <0 || *ppos >=HPEE_MAX_LENGTH )return 0 ; count = *ppos + count <HPEE_MAX_LENGTH ? count :HPEE_MAX_LENGTH - *ppos;
drivers/platform/x86/Kconfig +3 -1
@@ -265,6 +265,7 @@ config THINKPAD_ACPI_DOCK bool "Legacy Docking Station Support" depends on THINKPAD_ACPI depends on ACPI_DOCK=n + depends on BROKEN default n ---help--- Allows the thinkpad_acpi driver to handle docking station events.
@@ -278,7 +279,8 @@ config THINKPAD_ACPI_DOCK config THINKPAD_ACPI_BAY bool "Legacy Removable Bay Support" depends on THINKPAD_ACPI - default y + depends on BROKEN + default n ---help--- Allows the thinkpad_acpi driver to handle removable bays. It will electrically disable the device in the bay, and also generate
drivers/scsi/libsas/sas_port.c +15 -4
@@ -56,7 +56,7 @@ static void sas_form_port(struct asd_sas_phy *phy) } } -/* find a port */ +/* see if the phy should be part of a wide port */ spin_lock_irqsave (&sas_ha->phy_port_lock, flags);for (i =0 ; i < sas_ha->num_phys; i++) { port = sas_ha->sas_port[i];
@@ -69,12 +69,23 @@ static void sas_form_port(struct asd_sas_phy *phy)SAS_DPRINTK ("phy%d matched wide port%d\n" , phy->id, port->id);break ; - }else if (*(u64 *) port->sas_addr ==0 && port->num_phys==0 ) { -memcpy (port->sas_addr, phy->sas_addr,SAS_ADDR_SIZE ); -break ; }spin_unlock (&port->phy_list_lock); } +/* The phy does not match any existing port, create a new one */ +if (i == sas_ha->num_phys) { +for (i =0 ; i < sas_ha->num_phys; i++) { + port = sas_ha->sas_port[i]; +spin_lock (&port->phy_list_lock); +if (*(u64 *)port->sas_addr ==0 + && port->num_phys ==0 ) { +memcpy (port->sas_addr, phy->sas_addr, +SAS_ADDR_SIZE ); +break ; + } +spin_unlock (&port->phy_list_lock); + } + }if (i >= sas_ha->num_phys) { printk(KERN_NOTICE "%s: couldn't find a free port, bug?\n",
drivers/staging/rt2870/2870_main_dev.c +45 -22
119 lines not on this page · raw message
drivers/staging/rt2870/common/2870_rtmp_init.c +16 -19
@@ -727,8 +727,8 @@ NDIS_STATUS AdapterBlockAllocateMemory( usb_dev = pObj->pUsb_Dev; - pObj->MLMEThr_task =NULL ; - pObj->RTUSBCmdThr_task =NULL ; + pObj->MLMEThr_pid =THREAD_PID_INIT_VALUE ; + pObj->RTUSBCmdThr_pid =THREAD_PID_INIT_VALUE ; *ppAd = (PVOID )vmalloc (sizeof (RTMP_ADAPTER ));
@@ -765,7 +765,7 @@ NDIS_STATUS CreateThreads( {PRTMP_ADAPTER pAd = net_dev->ml_priv;POS_COOKIE pObj = (POS_COOKIE ) pAd->OS_Cookie; -struct task_struct *tsk; +pid_t pid_number =-1 ;//init_MUTEX(&(pAd->usbdev_semaphore));
@@ -779,39 +779,36 @@ NDIS_STATUS CreateThreads(init_completion (&pAd->TimerQComplete);// Creat MLME Thread - pObj->MLMEThr_task =NULL ; - tsk =kthread_run (MlmeThread, pAd, pAd->net_dev->name); - -if (IS_ERR (tsk)) { + pObj->MLMEThr_pid=THREAD_PID_INIT_VALUE ; + pid_number =kernel_thread (MlmeThread, pAd,CLONE_VM ); +if (pid_number <0 ) + {printk (KERN_WARNING "%s: unable to start Mlme thread\n" ,pAd->net_dev->name);return NDIS_STATUS_FAILURE ; } - - pObj->MLMEThr_task = tsk; + pObj->MLMEThr_pid =GET_PID (pid_number);// Wait for the thread to start wait_for_completion (&(pAd->mlmeComplete));// Creat Command Thread - pObj->RTUSBCmdThr_task =NULL ; - tsk =kthread_run (RTUSBCmdThread, pAd, pAd->net_dev->name); - -if (IS_ERR (tsk) <0 ) + pObj->RTUSBCmdThr_pid=THREAD_PID_INIT_VALUE ; + pid_number =kernel_thread (RTUSBCmdThread, pAd,CLONE_VM ); +if (pid_number <0 ) {printk (KERN_WARNING "%s: unable to start RTUSBCmd thread\n" ,pAd->net_dev->name);return NDIS_STATUS_FAILURE ; } - - pObj->RTUSBCmdThr_task = tsk; + pObj->RTUSBCmdThr_pid =GET_PID (pid_number);wait_for_completion (&(pAd->CmdQComplete)); - pObj->TimerQThr_task =NULL ; - tsk =kthread_run (TimerQThread, pAd, pAd->net_dev->name); -if (IS_ERR (tsk) <0 ) + pObj->TimerQThr_pid=THREAD_PID_INIT_VALUE ; + pid_number =kernel_thread (TimerQThread, pAd,CLONE_VM ); +if (pid_number <0 ) {printk (KERN_WARNING "%s: unable to start TimerQThread\n" ,pAd->net_dev->name);return NDIS_STATUS_FAILURE ; } - pObj->TimerQThr_task = tsk; + pObj->TimerQThr_pid =GET_PID (pid_number);// Wait for the thread to start wait_for_completion (&(pAd->TimerQComplete));
drivers/staging/rt2870/common/cmm_data.c +3 -0
@@ -709,6 +709,9 @@ BOOLEAN RTMP_FillTxBlkInfo( }return TRUE; + +FillTxBlkErr: +return FALSE; }
drivers/staging/rt2870/common/rtmp_init.c +1 -1
@@ -3655,7 +3655,7 @@ VOID UserCfgInit(#ifdef RALINK_28xx_QA//pAd->ate.Repeat = 0; pAd->ate.TxStatus =0 ; - pAd->ate.AtePid =NULL ; + pAd->ate.AtePid =THREAD_PID_INIT_VALUE ;#endif // RALINK_28xx_QA // #endif // RALINK_ATE //
drivers/staging/rt2870/common/rtusb_io.c +1 -2
@@ -958,8 +958,7 @@ NDIS_STATUS RTUSBEnqueueCmdFromNdis(POS_COOKIE pObj = (POS_COOKIE ) pAd->OS_Cookie; -BUG_ON (pObj->RTUSBCmdThr_task ==NULL ); -CHECK_PID_LEGALITY (task_pid (pObj->RTUSBCmdThr_task)) +CHECK_PID_LEGALITY (pObj->RTUSBCmdThr_pid) return (NDIS_STATUS_RESOURCES); status =RTMPAllocateMemory ((PVOID *)&cmdqelmt,sizeof (CmdQElmt));
drivers/staging/rt2870/rt2870.h +2 -4
@@ -580,16 +580,14 @@ VOID RTUSBBulkRxComplete(purbb_t pUrb, struct pt_regs *pt_regs);#define RTUSBMlmeUp (pAd) \ { \ POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie; \ - BUG_ON(pObj->MLMEThr_task == NULL); \ - CHECK_PID_LEGALITY(task_pid(pObj->MLMEThr_task)) \ + CHECK_PID_LEGALITY(pObj->MLMEThr_pid) \ up(&(pAd->mlme_semaphore)); \ }#define RTUSBCMDUp (pAd) \ { \ POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie; \ - BUG_ON(pObj->RTUSBCmdThr_task == NULL); \ - CHECK_PID_LEGALITY(task_pid(pObj->RTUSBCmdThr_task)) \ + CHECK_PID_LEGALITY(pObj->RTUSBCmdThr_pid) \ up(&(pAd->RTUSBCmd_semaphore)); \ }
drivers/staging/rt2870/rt_linux.h +6 -5
@@ -44,7 +44,6 @@#include <linux/module.h> #include <linux/version.h> #include <linux/kernel.h> -#include <linux/kthread.h> #include <linux/spinlock.h> #include <linux/init.h>
@@ -166,12 +165,14 @@ typedef int (*HARD_START_XMIT_FUNC)(struct sk_buff *skb, struct net_device *net_#if LINUX_VERSION_CODE >=KERNEL_VERSION (2 ,6 ,27 )typedef struct pid *THREAD_PID ; +#define THREAD_PID_INIT_VALUE NULL#define GET_PID (_v) find_get_pid(_v)#define GET_PID_NUMBER (_v) pid_nr(_v)#define CHECK_PID_LEGALITY (_pid) if (pid_nr(_pid) >= 0)#define KILL_THREAD_PID (_A, _B, _C) kill_pid(_A, _B, _C)#else typedef pid_t THREAD_PID ; +#define THREAD_PID_INIT_VALUE -1#define GET_PID (_v) _v#define GET_PID_NUMBER (_v) _v#define CHECK_PID_LEGALITY (_pid) if (_pid >= 0)
@@ -187,11 +188,11 @@ struct os_lock {struct os_cookie {#ifdef RT2870 -struct usb_device *pUsb_Dev; +struct usb_device *pUsb_Dev; -struct task_struct *MLMEThr_task; -struct task_struct *RTUSBCmdThr_task; -struct task_struct *TimerQThr_task; +THREAD_PID MLMEThr_pid; +THREAD_PID RTUSBCmdThr_pid; +THREAD_PID TimerQThr_pid;#endif // RT2870 // struct tasklet_struct rx_done_task;
drivers/usb/core/devio.c +6 -4
@@ -582,7 +582,7 @@ static int usbdev_open(struct inode *inode, struct file *file)if (!ps) goto out; - ret = -ENOENT ; + ret = -ENODEV ;/* usbdev device-node */ if (imajor (inode) ==USB_DEVICE_MAJOR )
@@ -1308,7 +1308,8 @@ static int get_urb32(struct usbdevfs_urb *kurb, struct usbdevfs_urb32 __user *uurb) {__u32 uptr; - if (get_user(kurb->type, &uurb->type) || + if (!access_ok(VERIFY_READ, uurb, sizeof(*uurb)) || + __get_user(kurb->type, &uurb->type) || __get_user(kurb->endpoint, &uurb->endpoint) || __get_user(kurb->status, &uurb->status) || __get_user(kurb->flags, &uurb->flags) ||
@@ -1523,8 +1524,9 @@ static int proc_ioctl_compat(struct dev_state *ps, compat_uptr_t arg)u32 udata; uioc =compat_ptr ((long )arg); -if (get_user (ctrl.ifno, &uioc->ifno) || -get_user (ctrl.ioctl_code, &uioc->ioctl_code) || +if (!access_ok (VERIFY_READ , uioc,sizeof (*uioc)) || +__get_user (ctrl.ifno, &uioc->ifno) || +__get_user (ctrl.ioctl_code, &uioc->ioctl_code) ||__get_user (udata, &uioc->data))return -EFAULT ; ctrl.data =compat_ptr (udata);
drivers/usb/serial/ftdi_sio.c +3 -0
@@ -672,6 +672,9 @@ static struct usb_device_id id_table_combined [] = { { USB_DEVICE(JETI_VID, JETI_SPC1201_PID) }, { USB_DEVICE(MARVELL_VID, MARVELL_SHEEVAPLUG_PID), .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, + { USB_DEVICE(BAYER_VID, BAYER_CONTOUR_CABLE_PID) }, + { USB_DEVICE(FTDI_VID, MARVELL_OPENRD_PID), + .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, { }, /* Optional parameter entry */ { } /* Terminating entry */ };
drivers/usb/serial/ftdi_sio.h +14 -0
@@ -926,6 +926,20 @@#define MARVELL_SHEEVAPLUG_PID 0x9e8f/* +* Bayer Ascensia Contour blood glucose meter USB-converter cable. +* http://winglucofacts.com/cables/ +*/ +#define BAYER_VID 0x1A79 +#define BAYER_CONTOUR_CABLE_PID 0x6001 + +/* +* Marvell OpenRD Base, Client +* http://www.open-rd.org +* OpenRD Base, Client use VID 0x0403 +*/ +#define MARVELL_OPENRD_PID 0x9e90 + +/* * BmRequestType: 1100 0000b * bRequest: FTDI_E2_READ * wValue: 0
drivers/usb/storage/transport.c +1 -1
@@ -961,7 +961,7 @@ int usb_stor_Bulk_max_lun(struct us_data *us)US_BULK_GET_MAX_LUN ,USB_DIR_IN |USB_TYPE_CLASS |USB_RECIP_INTERFACE , - 0, us->ifnum, us->iobuf, 1, HZ); + 0, us->ifnum, us->iobuf, 1, 10*HZ);US_DEBUGP ("GetMaxLUN command result is %d, data is %d\n" , result, us->iobuf[0 ]);
drivers/usb/storage/unusual_devs.h +7 -0
@@ -838,6 +838,13 @@ UNUSUAL_DEV( 0x066f, 0x8000, 0x0001, 0x0001, US_SC_DEVICE, US_PR_DEVICE, NULL, US_FL_FIX_CAPACITY ), +/* Reported by Rogerio Brito <[email protected]> */ +UNUSUAL_DEV (0x067b ,0x2317 ,0x0001 ,0x001 , +"Prolific Technology, Inc." , +"Mass Storage Device" , +US_SC_DEVICE ,US_PR_DEVICE ,NULL , + US_FL_NOT_LOCKABLE ), +/* Reported by Richard -=[]=- <[email protected]> */ /* Change to bcdDeviceMin (0x0100 to 0x0001) reported by * Thomas Bartosik <[email protected]> */
fs/binfmt_flat.c +12 -5
@@ -828,15 +828,22 @@ static int load_flat_shared_library(int id, struct lib_info *libs)if (IS_ERR (bprm.file))return res; + bprm.cred =prepare_exec_creds (); + res = -ENOMEM ; +if (!bprm.cred) + goto out; + res =prepare_binprm (&bprm);if (res <= (unsigned long )-4096 ) res =load_flat_file (&bprm, libs, id,NULL ); -if (bprm.file) { -allow_write_access (bprm.file); -fput (bprm.file); - bprm.file =NULL ; - } + +abort_creds (bprm.cred); + +out: +allow_write_access (bprm.file); +fput (bprm.file); +return (res); }
fs/cifs/cifs_dfs_ref.c +9 -3
@@ -55,7 +55,7 @@ void cifs_dfs_release_automount_timer(void)* i.e. strips from UNC trailing path that is not part of share * name and fixup missing '\' in the begining of DFS node refferal * if neccessary. -* Returns pointer to share name on success or NULL on error. +* Returns pointer to share name on success or ERR_PTR on error. * Caller is responsible for freeing returned string. */ static char *cifs_get_share_name (const char *node_name)
@@ -68,7 +68,7 @@ static char *cifs_get_share_name(const char *node_name)UNC =kmalloc (len+2 /*for term null and additional \ if it's missed */ ,GFP_KERNEL );if (!UNC ) -return NULL ; +return ERR_PTR (-ENOMEM );/* get share name and server name */ if (node_name[1 ] !='\\' ) {
@@ -87,7 +87,7 @@ static char *cifs_get_share_name(const char *node_name)cERROR (1 , ("%s: no server name end in node name: %s" , __func__, node_name));kfree (UNC ); -return NULL ; +return ERR_PTR (-EINVAL ); }/* find sharename end */
@@ -133,6 +133,12 @@ char *cifs_compose_mount_options(const char *sb_mountdata,return ERR_PTR (-EINVAL ); *devname =cifs_get_share_name (ref->node_name); +if (IS_ERR (*devname)) { + rc =PTR_ERR (*devname); + *devname =NULL ; + goto compose_mount_options_err; + } + rc =dns_resolve_server_name_to_ip (*devname, &srvIP);if (rc !=0 ) { cERROR(1, ("%s: Failed to resolve server part of %s to IP: %d",
fs/cifs/connect.c +10 -3
@@ -2563,11 +2563,20 @@ remote_path_check:if (mount_data != mount_data_global)kfree (mount_data); + mount_data =cifs_compose_mount_options ( cifs_sb->mountdata, full_path +1 , referrals, &fake_devname); -kfree (fake_devname); +free_dfs_info_array (referrals, num_referrals); +kfree (fake_devname); +kfree (full_path); + +if (IS_ERR (mount_data)) { + rc =PTR_ERR (mount_data); + mount_data =NULL ; + goto mount_fail_check; + }if (tcon)cifs_put_tcon (tcon);
@@ -2575,8 +2584,6 @@ remote_path_check:cifs_put_smb_ses (pSesInfo);cleanup_volume_info (&volume_info); -FreeXid (xid); -kfree (full_path); referral_walks_count++; goto try_mount_again; }
fs/compat_ioctl.c +1 -0
@@ -1915,6 +1915,7 @@ COMPATIBLE_IOCTL(FIONCLEX) COMPATIBLE_IOCTL(FIOASYNC) COMPATIBLE_IOCTL(FIONBIO) COMPATIBLE_IOCTL(FIONREAD) /* This is also TIOCINQ */ +COMPATIBLE_IOCTL(FS_IOC_FIEMAP) /* 0x00 */ COMPATIBLE_IOCTL(FIBMAP) COMPATIBLE_IOCTL(FIGETBSZ)
fs/nfs/direct.c +10 -10
@@ -255,7 +255,7 @@ static void nfs_direct_read_release(void *calldata)if (put_dreq (dreq))nfs_direct_complete (dreq); -nfs_readdata_release (calldata); +nfs_readdata_free (data); }static const struct rpc_call_ops nfs_read_direct_ops = {
@@ -311,14 +311,14 @@ static ssize_t nfs_direct_read_schedule_segment(struct nfs_direct_req *dreq, data->npages, 1, 0, data->pagevec, NULL);up_read (¤t->mm->mmap_sem);if (result <0 ) { -nfs_readdata_release (data); +nfs_readdata_free (data);break ; }if ((unsigned )result < data->npages) { bytes = result *PAGE_SIZE ;if (bytes <= pgbase) {nfs_direct_release_pages (data->pagevec, result); -nfs_readdata_release (data); +nfs_readdata_free (data);break ; } bytes -= pgbase;
@@ -331,7 +331,7 @@ static ssize_t nfs_direct_read_schedule_segment(struct nfs_direct_req *dreq, data->inode = inode; data->cred = msg.rpc_cred; data->args.fh =NFS_FH (inode); - data->args.context =get_nfs_open_context (ctx); + data->args.context = ctx; data->args.offset = pos; data->args.pgbase = pgbase; data->args.pages = data->pagevec;
@@ -438,7 +438,7 @@ static void nfs_direct_free_writedata(struct nfs_direct_req *dreq) struct nfs_write_data *data = list_entry(dreq->rewrite_list.next, struct nfs_write_data, pages);list_del (&data->pages);nfs_direct_release_pages (data->pagevec, data->npages); -nfs_writedata_release (data); +nfs_writedata_free (data); } }
@@ -531,7 +531,7 @@ static void nfs_direct_commit_release(void *calldata)dprintk ("NFS: %5u commit returned %d\n" , data->task.tk_pid, status);nfs_direct_write_complete (dreq, data->inode); -nfs_commitdata_release (calldata); +nfs_commit_free (data); }static const struct rpc_call_ops nfs_commit_direct_ops = {
@@ -564,7 +564,7 @@ static void nfs_direct_commit_schedule(struct nfs_direct_req *dreq) data->args.fh =NFS_FH (data->inode); data->args.offset =0 ; data->args.count =0 ; - data->args.context =get_nfs_open_context (dreq->ctx); + data->args.context = dreq->ctx; data->res.count =0 ; data->res.fattr = &data->fattr; data->res.verf = &data->verf;
@@ -725,14 +725,14 @@ static ssize_t nfs_direct_write_schedule_segment(struct nfs_direct_req *dreq, data->npages, 0, 0, data->pagevec, NULL);up_read (¤t->mm->mmap_sem);if (result <0 ) { -nfs_writedata_release (data); +nfs_writedata_free (data);break ; }if ((unsigned )result < data->npages) { bytes = result *PAGE_SIZE ;if (bytes <= pgbase) {nfs_direct_release_pages (data->pagevec, result); -nfs_writedata_release (data); +nfs_writedata_free (data);break ; } bytes -= pgbase;
@@ -747,7 +747,7 @@ static ssize_t nfs_direct_write_schedule_segment(struct nfs_direct_req *dreq, data->inode = inode; data->cred = msg.rpc_cred; data->args.fh =NFS_FH (inode); - data->args.context =get_nfs_open_context (ctx); + data->args.context = ctx; data->args.offset = pos; data->args.pgbase = pgbase; data->args.pages = data->pagevec;
fs/nfs/read.c +2 -4
@@ -59,17 +59,15 @@ struct nfs_read_data *nfs_readdata_alloc(unsigned int pagecount)return p; } -static void nfs_readdata_free (struct nfs_read_data *p) +void nfs_readdata_free (struct nfs_read_data *p) {if (p && (p->pagevec != &p->page_array[0 ]))kfree (p->pagevec);mempool_free (p, nfs_rdata_mempool); } -void nfs_readdata_release (void *data) +static void nfs_readdata_release (struct nfs_read_data *rdata) { -struct nfs_read_data *rdata = data; -put_nfs_open_context (rdata->args.context);nfs_readdata_free (rdata); }
fs/nfs/write.c +2 -4
@@ -84,17 +84,15 @@ struct nfs_write_data *nfs_writedata_alloc(unsigned int pagecount)return p; } -static void nfs_writedata_free (struct nfs_write_data *p) +void nfs_writedata_free (struct nfs_write_data *p) {if (p && (p->pagevec != &p->page_array[0 ]))kfree (p->pagevec);mempool_free (p, nfs_wdata_mempool); } -void nfs_writedata_release (void *data) +static void nfs_writedata_release (struct nfs_write_data *wdata) { -struct nfs_write_data *wdata = data; -put_nfs_open_context (wdata->args.context);nfs_writedata_free (wdata); }
fs/nilfs2/segment.c +15 -1
@@ -1876,12 +1876,26 @@ static void nilfs_end_page_io(struct page *page, int err)if (!page)return ; -if (buffer_nilfs_node (page_buffers (page)) && !PageWriteback (page)) +if (buffer_nilfs_node (page_buffers (page)) && !PageWriteback (page)) {/* * For b-tree node pages, this function may be called twice * or more because they might be split in a segment. */ +if (PageDirty (page)) { +/* +* For pages holding split b-tree node buffers, dirty +* flag on the buffers may be cleared discretely. +* In that case, the page is once redirtied for +* remaining buffers, and it must be cancelled if +* all the buffers get cleaned later. +*/ +lock_page (page); +if (nilfs_page_buffers_clean (page)) +__nilfs_clear_page_dirty (page); +unlock_page (page); + }return ; + }__nilfs_end_page_io (page, err); }
fs/proc/base.c +12 -15
@@ -234,23 +234,20 @@ static int check_mem_permission(struct task_struct *task)struct mm_struct *mm_for_maps (struct task_struct *task) { -struct mm_struct *mm =get_task_mm (task); -if (!mm) +struct mm_struct *mm; + +if (mutex_lock_killable (&task->cred_exec_mutex))return NULL ; -down_read (&mm->mmap_sem); -task_lock (task); -if (task->mm != mm) - goto out; -if (task->mm != current->mm && -__ptrace_may_access (task,PTRACE_MODE_READ ) <0 ) - goto out; -task_unlock (task); + + mm =get_task_mm (task); +if (mm && mm != current->mm && + !ptrace_may_access (task,PTRACE_MODE_READ )) { +mmput (mm); + mm =NULL ; + } +mutex_unlock (&task->cred_exec_mutex); +return mm; -out: -task_unlock (task); -up_read (&mm->mmap_sem); -mmput (mm); -return NULL ; }static int proc_pid_cmdline (struct task_struct *task,char * buffer)
fs/proc/task_mmu.c +1 -0
@@ -119,6 +119,7 @@ static void *m_start(struct seq_file *m, loff_t *pos) mm =mm_for_maps (priv->task);if (!mm)return NULL ; +down_read (&mm->mmap_sem); tail_vma =get_gate_vma (priv->task); priv->tail_vma = tail_vma;
fs/proc/task_nommu.c +1 -0
@@ -189,6 +189,7 @@ static void *m_start(struct seq_file *m, loff_t *pos) priv->task =NULL ;return NULL ; } +down_read (&mm->mmap_sem);/* start from the Nth VMA */ for (p =rb_first (&mm->mm_rb); p; p =rb_next (p))
fs/sysfs/dir.c +2 -0
@@ -939,8 +939,10 @@ again:/* Remove from old parent's list and insert into new parent's list. */ sysfs_unlink_sibling (sd);sysfs_get (new_parent_sd); +drop_nlink (old_parent->d_inode);sysfs_put (sd->s_parent); sd->s_parent = new_parent_sd; +inc_nlink (new_parent->d_inode);sysfs_link_sibling (sd); out_unlock:
include/linux/ide.h +0 -2
@@ -1384,7 +1384,6 @@ int ide_in_drive_list(u16 *, const struct drive_list_entry *);#ifdef CONFIG_BLK_DEV_IDEDMA int ide_dma_good_drive (ide_drive_t *);int __ide_dma_bad_drive (ide_drive_t *); -int ide_id_dma_bug (ide_drive_t *);u8 ide_find_dma_mode (ide_drive_t *,u8 );
@@ -1425,7 +1424,6 @@ void ide_dma_lost_irq(ide_drive_t *);ide_startstop_t ide_dma_timeout_retry (ide_drive_t *,int );#else -static inline int ide_id_dma_bug (ide_drive_t *drive) {return 0 ; }static inline u8 ide_find_dma_mode (ide_drive_t *drive,u8 speed) {return 0 ; }static inline u8 ide_max_dma_mode (ide_drive_t *drive) {return 0 ; }static inline void ide_dma_off_quietly (ide_drive_t *drive) { ; }
include/linux/netdevice.h +2 -3
@@ -1856,15 +1856,14 @@ static inline int net_gso_ok(int features, int gso_type)static inline int skb_gso_ok (struct sk_buff *skb,int features) { -return net_gso_ok (features,skb_shinfo (skb)->gso_type); +return net_gso_ok (features,skb_shinfo (skb)->gso_type) && + (!skb_shinfo (skb)->frag_list || (features &NETIF_F_FRAGLIST )); }static inline int netif_needs_gso (struct net_device *dev,struct sk_buff *skb) {return skb_is_gso (skb) && (!skb_gso_ok (skb, dev->features) || - (skb_shinfo (skb)->frag_list && - !(dev->features &NETIF_F_FRAGLIST )) ||unlikely (skb->ip_summed !=CHECKSUM_PARTIAL )); }
include/linux/nfs_fs.h +2 -3
@@ -473,7 +473,6 @@ extern int nfs_writepages(struct address_space *, struct writeback_control *);extern int nfs_flush_incompatible (struct file *file,struct page *page);extern int nfs_updatepage (struct file *,struct page *,unsigned int ,unsigned int );extern int nfs_writeback_done (struct rpc_task *,struct nfs_write_data *); -extern void nfs_writedata_release (void *);/* * Try to write back everything synchronously (but check the
@@ -488,7 +487,6 @@ extern int nfs_wb_page_cancel(struct inode *inode, struct page* page);extern int nfs_commit_inode (struct inode *,int );extern struct nfs_write_data *nfs_commitdata_alloc (void );extern void nfs_commit_free (struct nfs_write_data *wdata); -extern void nfs_commitdata_release (void *wdata);#else static inline int nfs_commit_inode (struct inode *inode,int how)
@@ -507,6 +505,7 @@ nfs_have_writebacks(struct inode *inode)* Allocate nfs_write_data structures */ extern struct nfs_write_data *nfs_writedata_alloc (unsigned int npages); +extern void nfs_writedata_free (struct nfs_write_data *);/* * linux/fs/nfs/read.c
@@ -515,7 +514,6 @@ extern int nfs_readpage(struct file *, struct page *);extern int nfs_readpages (struct file *,struct address_space *,struct list_head *,unsigned );extern int nfs_readpage_result (struct rpc_task *,struct nfs_read_data *); -extern void nfs_readdata_release (void *data);extern int nfs_readpage_async (struct nfs_open_context *,struct inode *,struct page *);
@@ -523,6 +521,7 @@ extern int nfs_readpage_async(struct nfs_open_context *, struct inode *,* Allocate nfs_read_data structures */ extern struct nfs_read_data *nfs_readdata_alloc (unsigned int npages); +extern void nfs_readdata_free (struct nfs_read_data *);/* * linux/fs/nfs3proc.c
include/net/sctp/sctp.h +1 -0
@@ -448,6 +448,7 @@ static inline void sctp_skb_set_owner_r(struct sk_buff *skb, struct sock *sk) {struct sctp_ulpevent *event =sctp_skb2event (skb); +skb_orphan (skb); skb->sk = sk; skb->destructor = sctp_sock_rfree;atomic_add (event->rmem_len, &sk->sk_rmem_alloc);
include/net/sock.h +21 -13
@@ -103,15 +103,15 @@ struct net;/** * struct sock_common - minimal network layer representation of sockets +* @skc_node: main hash linkage for various protocol lookup tables +* @skc_nulls_node: main hash linkage for UDP/UDP-Lite protocol +* @skc_refcnt: reference count +* @skc_hash: hash value used with various protocol lookup tables * @skc_family: network address family * @skc_state: Connection state * @skc_reuse: %SO_REUSEADDR setting * @skc_bound_dev_if: bound device index if != 0 -* @skc_node: main hash linkage for various protocol lookup tables -* @skc_nulls_node: main hash linkage for UDP/UDP-Lite protocol * @skc_bind_node: bind hash linkage for various protocol lookup tables -* @skc_refcnt: reference count -* @skc_hash: hash value used with various protocol lookup tables * @skc_prot: protocol handlers inside a network family * @skc_net: reference to the network namespace of this socket *
@@ -119,17 +119,21 @@ struct net;* for struct sock and struct inet_timewait_sock. */ struct sock_common { -unsigned short skc_family; -volatile unsigned char skc_state; -unsigned char skc_reuse; -int skc_bound_dev_if; +/* +* first fields are not copied in sock_copy() +*/ union {struct hlist_node skc_node;struct hlist_nulls_node skc_nulls_node; }; -struct hlist_node skc_bind_node;atomic_t skc_refcnt; +unsigned int skc_hash; +unsigned short skc_family; +volatile unsigned char skc_state; +unsigned char skc_reuse; +int skc_bound_dev_if; +struct hlist_node skc_bind_node;struct proto *skc_prot;#ifdef CONFIG_NET_NS struct net *skc_net;
@@ -207,15 +211,17 @@ struct sock {* don't add nothing before this first member (__sk_common) --acme */ struct sock_common __sk_common; +#define sk_node __sk_common.skc_node +#define sk_nulls_node __sk_common.skc_nulls_node +#define sk_refcnt __sk_common.skc_refcnt + +#define sk_copy_start __sk_common.skc_hash +#define sk_hash __sk_common.skc_hash#define sk_family __sk_common.skc_family#define sk_state __sk_common.skc_state#define sk_reuse __sk_common.skc_reuse#define sk_bound_dev_if __sk_common.skc_bound_dev_if -#define sk_node __sk_common.skc_node -#define sk_nulls_node __sk_common.skc_nulls_node#define sk_bind_node __sk_common.skc_bind_node -#define sk_refcnt __sk_common.skc_refcnt -#define sk_hash __sk_common.skc_hash#define sk_prot __sk_common.skc_prot#define sk_net __sk_common.skc_net unsigned char sk_shutdown : 2,
@@ -1225,6 +1231,8 @@ static inline void skb_set_owner_w(struct sk_buff *skb, struct sock *sk)static inline void skb_set_owner_r (struct sk_buff *skb,struct sock *sk) { +skb_orphan (skb); +skb_orphan (skb); skb->sk = sk; skb->destructor = sock_rfree;atomic_add (skb->truesize, &sk->sk_rmem_alloc);
kernel/fork.c +11 -11
@@ -568,18 +568,18 @@ void mm_release(struct task_struct *tsk, struct mm_struct *mm)* the value intact in a core dump, and to save the unnecessary * trouble otherwise. Userland only wants this done for a sys_exit. */ -if (tsk->clear_child_tid - && !(tsk->flags &PF_SIGNALED ) - &&atomic_read (&mm->mm_users) >1 ) { -u32 __user * tidptr = tsk->clear_child_tid; +if (tsk->clear_child_tid) { +if (!(tsk->flags &PF_SIGNALED ) && +atomic_read (&mm->mm_users) >1 ) { +/* +* We don't check the error code - if userspace has +* not set up a proper pointer then tough luck. +*/ +put_user (0 , tsk->clear_child_tid); +sys_futex (tsk->clear_child_tid,FUTEX_WAKE , +1 ,NULL ,NULL ,0 ); + } tsk->clear_child_tid =NULL ; - -/* -* We don't check the error code - if userspace has -* not set up a proper pointer then tough luck. -*/ -put_user (0 , tidptr); -sys_futex (tidptr,FUTEX_WAKE ,1 ,NULL ,NULL ,0 ); } }
kernel/posix-timers.c +7 -0
@@ -202,6 +202,12 @@ static int no_timer_create(struct k_itimer *new_timer)return -EOPNOTSUPP ; } +static int no_nsleep (const clockid_t which_clock,int flags, +struct timespec *tsave,struct timespec __user *rmtp) +{ +return -EOPNOTSUPP ; +} +/* * Return nonzero if we know a priori this clockid_t value is bogus. */
@@ -254,6 +260,7 @@ static __init int init_posix_timers(void) .clock_get = posix_get_monotonic_raw, .clock_set = do_posix_clock_nosettime, .timer_create = no_timer_create, + .nsleep = no_nsleep, };register_posix_clock (CLOCK_REALTIME , &clock_realtime);
kernel/smp.c +1 -1
@@ -57,7 +57,7 @@ hotplug_cfd(struct notifier_block *nfb, unsigned long action, void *hcpu)return NOTIFY_BAD ;break ; -#ifdef CONFIG_CPU_HOTPLUG +#ifdef CONFIG_HOTPLUG_CPU case CPU_UP_CANCELED :case CPU_UP_CANCELED_FROZEN :
kernel/trace/ring_buffer.c +5 -6
@@ -695,6 +695,7 @@ ring_buffer_free(struct ring_buffer *buffer)put_online_cpus (); +kfree (buffer->buffers);free_cpumask_var (buffer->cpumask);kfree (buffer);
@@ -2101,7 +2102,6 @@ rb_buffer_peek(struct ring_buffer *buffer, int cpu, u64 *ts)* the box. Return the padding, and we will release * the current locks, and try again. */ -rb_advance_reader (cpu_buffer);return event;case RINGBUF_TYPE_TIME_EXTEND :
@@ -2218,6 +2218,8 @@ ring_buffer_peek(struct ring_buffer *buffer, int cpu, u64 *ts) again:spin_lock_irqsave (&cpu_buffer->reader_lock, flags); event =rb_buffer_peek (buffer, cpu, ts); +if (event && event->type ==RINGBUF_TYPE_PADDING ) +rb_advance_reader (cpu_buffer);spin_unlock_irqrestore (&cpu_buffer->reader_lock, flags);if (event && event->type ==RINGBUF_TYPE_PADDING ) {
@@ -2282,12 +2284,9 @@ ring_buffer_consume(struct ring_buffer *buffer, int cpu, u64 *ts)spin_lock_irqsave (&cpu_buffer->reader_lock, flags); event =rb_buffer_peek (buffer, cpu, ts); -if (!event) - goto out_unlock; - -rb_advance_reader (cpu_buffer); +if (event) +rb_advance_reader (cpu_buffer); - out_unlock:spin_unlock_irqrestore (&cpu_buffer->reader_lock, flags); out:
kernel/trace/trace.c +7 -3
@@ -2993,7 +2993,8 @@ tracing_fill_pipe_page(size_t rem, struct trace_iterator *iter)break ; } -trace_consume (iter); +if (ret !=TRACE_TYPE_NO_CONSUME ) +trace_consume (iter); rem -= count;if (!find_next_entry_inc (iter)) { rem =0 ;
@@ -4122,8 +4123,11 @@ static void __ftrace_dump(bool disable_tracing) iter.pos =-1 ;if (find_next_entry_inc (&iter) !=NULL ) { -print_trace_line (&iter); -trace_consume (&iter); +int ret; + + ret =print_trace_line (&iter); +if (ret !=TRACE_TYPE_NO_CONSUME ) +trace_consume (&iter); }trace_printk_seq (&iter.seq);
kernel/trace/trace_functions_graph.c +9 -2
@@ -798,9 +798,16 @@ print_graph_function(struct trace_iterator *iter)switch (entry->type) {case TRACE_GRAPH_ENT : { -struct ftrace_graph_ent_entry *field; +/* +* print_graph_entry() may consume the current event, +* thus @field may become invalid, so we need to save it. +* sizeof(struct ftrace_graph_ent_entry) is very small, +* it can be safely saved at the stack. +*/ +struct ftrace_graph_ent_entry *field, saved;trace_assign_type (field, entry); -return print_graph_entry (field, s, iter); + saved = *field; +return print_graph_entry (&saved, s, iter); }case TRACE_GRAPH_RET : {struct ftrace_graph_ret_entry *field;
mm/hugetlb.c +1 -1
@@ -2341,7 +2341,7 @@ void hugetlb_unreserve_pages(struct inode *inode, long offset, long freed)long chg =region_truncate (&inode->i_mapping->private_list, offset);spin_lock (&inode->i_lock); - inode->i_blocks -=blocks_per_huge_page (h); + inode->i_blocks -= (blocks_per_huge_page (h) * freed);spin_unlock (&inode->i_lock);hugetlb_put_quota (inode->i_mapping, (chg - freed));
mm/page_alloc.c +9 -4
@@ -858,7 +858,7 @@ static struct page *__rmqueue(struct zone *zone, unsigned int order,*/ static int rmqueue_bulk (struct zone *zone,unsigned int order,unsigned long count,struct list_head *list, -int migratetype) +int migratetype,int cold) {int i;
@@ -877,7 +877,10 @@ static int rmqueue_bulk(struct zone *zone, unsigned int order,* merge IO requests if the physical pages are ordered * properly. */ -list_add (&page->lru, list); +if (likely (cold ==0 )) +list_add (&page->lru, list); +else +list_add_tail (&page->lru, list);set_page_private (page, migratetype); list = &page->lru; }
@@ -1077,7 +1080,8 @@ again:local_irq_save (flags);if (!pcp->count) { pcp->count =rmqueue_bulk (zone,0 , - pcp->batch, &pcp->list, migratetype); + pcp->batch, &pcp->list, + migratetype, cold);if (unlikely (!pcp->count)) goto failed; }
@@ -1096,7 +1100,8 @@ again:/* Allocate more to the pcp list if necessary */ if (unlikely (&page->lru == &pcp->list)) { pcp->count +=rmqueue_bulk (zone,0 , - pcp->batch, &pcp->list, migratetype); + pcp->batch, &pcp->list, + migratetype, cold); page = list_entry(pcp->list.next, struct page, lru); }
net/ax25/ax25_in.c +1 -2
@@ -437,8 +437,7 @@ free:int ax25_kiss_rcv (struct sk_buff *skb,struct net_device *dev,struct packet_type *ptype,struct net_device *orig_dev) { - skb->sk =NULL ;/* Initially we don't know who it's for */ - skb->destructor =NULL ;/* Who initializes this, dammit?! */ +skb_orphan (skb);if (!net_eq (dev_net (dev), &init_net)) {kfree_skb (skb);
net/core/dev.c +5 -5
@@ -2284,8 +2284,6 @@ ncls:if (!skb) goto out; -skb_orphan (skb); - type = skb->protocol;list_for_each_entry_rcu (ptype, &ptype_base[ntohs (type) &PTYPE_HASH_MASK ], list) {
@@ -2788,9 +2786,11 @@ static void net_rx_action(struct softirq_action *h)* move the instance around on the list at-will. */ if (unlikely (work == weight)) { -if (unlikely (napi_disable_pending (n))) -__napi_complete (n); -else +if (unlikely (napi_disable_pending (n))) { +local_irq_enable (); +napi_complete (n); +local_irq_disable (); + }else list_move_tail (&n->poll_list, list); }
net/core/sock.c +35 -4
@@ -915,13 +915,19 @@ static inline void sock_lock_init(struct sock *sk) af_family_keys + sk->sk_family); } +/* +* Copy all fields from osk to nsk but nsk->sk_refcnt must not change yet, +* even temporarly, because of RCU lookups. sk_node should also be left as is. +*/ static void sock_copy (struct sock *nsk,const struct sock *osk) {#ifdef CONFIG_SECURITY_NETWORK void *sptr = nsk->sk_security;#endif - -memcpy (nsk, osk, osk->sk_prot->obj_size); +BUILD_BUG_ON (offsetof(struct sock , sk_copy_start) != +sizeof (osk->sk_node) +sizeof (osk->sk_refcnt)); +memcpy (&nsk->sk_copy_start, &osk->sk_copy_start, + osk->sk_prot->obj_size - offsetof(struct sock , sk_copy_start));#ifdef CONFIG_SECURITY_NETWORK nsk->sk_security = sptr;security_sk_clone (osk, nsk);
@@ -935,8 +941,23 @@ static struct sock *sk_prot_alloc(struct proto *prot, gfp_t priority,struct kmem_cache *slab; slab = prot->slab; -if (slab !=NULL ) - sk =kmem_cache_alloc (slab, priority); +if (slab !=NULL ) { + sk =kmem_cache_alloc (slab, priority & ~__GFP_ZERO); +if (!sk) +return sk; +if (priority & __GFP_ZERO) { +/* +* caches using SLAB_DESTROY_BY_RCU should let +* sk_node.next un-modified. Special care is taken +* when initializing object to zero. +*/ + if (offsetof(struct sock, sk_node.next) != 0) + memset(sk, 0, offsetof(struct sock, sk_node.next)); +memset (&sk->sk_node.pprev,0 , + prot->obj_size - offsetof(struct sock , + sk_node.pprev)); + } + }else sk =kmalloc (prot->obj_size, priority);
@@ -1103,6 +1124,11 @@ struct sock *sk_clone(const struct sock *sk, const gfp_t priority) newsk->sk_err =0 ; newsk->sk_priority =0 ; +/* +* Before updating sk_refcnt, we must commit prior changes to memory +* (Documentation/RCU/rculist_nulls.txt for details) +*/ +smp_wmb ();atomic_set (&newsk->sk_refcnt,2 );/*
@@ -1794,6 +1820,11 @@ void sock_init_data(struct socket *sock, struct sock *sk) sk->sk_stamp =ktime_set (-1L ,0 ); +/* +* Before updating sk_refcnt, we must commit prior changes to memory +* (Documentation/RCU/rculist_nulls.txt for details) +*/ +smp_wmb ();atomic_set (&sk->sk_refcnt,1 );atomic_set (&sk->sk_drops,0 ); }
net/ipv4/ip_input.c +3 -0
@@ -437,6 +437,9 @@ int ip_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt,/* Remove any debris in the socket control block */ memset (IPCB (skb),0 ,sizeof (struct inet_skb_parm )); +/* Must drop socket now because of tproxy. */ +skb_orphan (skb); +return NF_HOOK (PF_INET ,NF_INET_PRE_ROUTING , skb, dev,NULL , ip_rcv_finish);
net/ipv6/ip6_input.c +3 -0
@@ -139,6 +139,9 @@ int ipv6_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *ptrcu_read_unlock (); +/* Must drop socket now because of tproxy. */ +skb_orphan (skb); +return NF_HOOK (PF_INET6 ,NF_INET_PRE_ROUTING , skb, dev,NULL , ip6_rcv_finish); err:
net/irda/af_irda.c +0 -3
@@ -913,9 +913,6 @@ static int irda_accept(struct socket *sock, struct socket *newsock, int flags)/* Clean up the original one to keep it in listen state */ irttp_listen (self->tsap); -/* Wow ! What is that ? Jean II */ - skb->sk =NULL ; - skb->destructor =NULL ;kfree_skb (skb); sk->sk_ack_backlog--;
net/irda/ircomm/ircomm_lmp.c +1 -0
@@ -196,6 +196,7 @@ static int ircomm_lmp_data_request(struct ircomm_cb *self,/* Don't forget to refcount it - see ircomm_tty_do_softint() */ skb_get (skb); +skb_orphan (skb); skb->destructor = ircomm_lmp_flow_control;if ((self->pkt_count++ >7 ) && (self->flow_status ==FLOW_START )) {
net/socket.c +1 -1
@@ -736,7 +736,7 @@ static ssize_t sock_sendpage(struct file *file, struct page *page,if (more) flags |=MSG_MORE ; -return sock->ops->sendpage (sock, page, offset, size, flags); +return kernel_sendpage (sock, page, offset, size, flags); } static ssize_t sock_splice_read(struct file *file, loff_t *ppos,
net/wireless/scan.c +3 -1
@@ -118,7 +118,7 @@ static int cmp_ies(u8 num, u8 *ies1, size_t len1, u8 *ies2, size_t len2)if (!ie1 && !ie2)return 0 ; -if (!ie1) +if (!ie1 || !ie2)return -1 ; r =memcmp (ie1 +2 , ie2 +2 ,min (ie1[1 ], ie2[1 ]));
@@ -171,6 +171,8 @@ static bool is_mesh(struct cfg80211_bss *a, ie =find_ie (WLAN_EID_MESH_CONFIG , a->information_elements, a->len_information_elements); +if (!ie) +return false;if (ie[1 ] !=IEEE80211_MESH_CONFIG_LEN )return false;
net/xfrm/xfrm_algo.c +2 -2
@@ -292,8 +292,8 @@ static struct xfrm_algo_desc ealg_list[] = { } }, { - .name = "cbc(cast128)", - .compat = "cast128", + .name = "cbc(cast5)", + .compat = "cast5", .uinfo = { .encr = {
sound/pci/hda/patch_realtek.c +2 -0
@@ -13150,6 +13150,8 @@ static int patch_alc269(struct hda_codec *codec)set_capture_mixer (spec);set_beep_amp (spec,0x0b ,0x04 ,HDA_INPUT ); + spec->vmaster_nid =0x02 ; + codec->patch_ops = alc_patch_ops;if (board_config ==ALC269_AUTO ) spec->init_hook = alc269_auto_init;