[kernel] r12361 - in dists/sid/linux-2.6/debian: . patches/bugfix/all/stable patches/series

Bastian Blank waldi at alioth.debian.org
Wed Oct 29 11:31:28 UTC 2008


Author: waldi
Date: Wed Oct 29 11:31:26 2008
New Revision: 12361

Log:
Add stable release 2.6.26.7.

* debian/changelog: Update.
* debian/patches/bugfix/all/stable/2.6.26.7.patch: Add.
* debian/patches/series/10: Add new patch.


Added:
   dists/sid/linux-2.6/debian/patches/bugfix/all/stable/2.6.26.7.patch
Modified:
   dists/sid/linux-2.6/debian/changelog
   dists/sid/linux-2.6/debian/patches/series/10

Modified: dists/sid/linux-2.6/debian/changelog
==============================================================================
--- dists/sid/linux-2.6/debian/changelog	(original)
+++ dists/sid/linux-2.6/debian/changelog	Wed Oct 29 11:31:26 2008
@@ -10,6 +10,33 @@
 
   [ Bastian Blank ]
   * agp: Fix stolen memory counting on Intel G4X. (closes: #502606)
+  * Add stable release 2.6.26.7:
+    - security: avoid calling a NULL function pointer in drivers/video/tvaudio.c
+    - DVB: au0828: add support for another USB id for Hauppauge HVR950Q
+    - drm/i915: fix ioremap of a user address for non-root (CVE-2008-3831)
+    - ACPI: Ignore _BQC object when registering backlight device
+    - hwmon: (it87) Prevent power-off on Shuttle SN68PT
+    - Check mapped ranges on sysfs resource files
+    - x86: avoid dereferencing beyond stack + THREAD_SIZE
+    - PCI: disable ASPM on pre-1.1 PCIe devices
+    - PCI: disable ASPM per ACPI FADT setting
+    - V4L/DVB (9053): fix buffer overflow in uvc-video
+    - V4L/DVB (8617): uvcvideo: don't use stack-based buffers for USB transfers.
+    - V4L/DVB (8498): uvcvideo: Return sensible min and max values when querying
+      a boolean control.
+    - V4L: zr36067: Fix RGBR pixel format
+    - V4L: bttv: Prevent NULL pointer dereference in radio_open
+    - libata: fix EH action overwriting in ata_eh_reset()
+    - libata: always do follow-up SRST if hardreset returned -EAGAIN
+    - fbcon_set_all_vcs: fix kernel crash when switching the rotated consoles
+    - modules: fix module "notes" kobject leak
+    - b43legacy: Fix failure in rate-adjustment mechanism
+    - CIFS: make sure we have the right resume info before calling CIFSFindNext
+    - sched_rt.c: resch needed in rt_rq_enqueue() for the root rt_rq
+    - tty: Termios locking - sort out real_tty confusions and lock reads
+    - x86, early_ioremap: fix fencepost error
+    - x86: improve UP kernel when CPU-hotplug and SMP is enabled
+    - x86: Reserve FIRST_DEVICE_VECTOR in used_vectors bitmap.
 
  -- dann frazier <dannf at debian.org>  Mon, 20 Oct 2008 23:27:25 -0600
 

Added: dists/sid/linux-2.6/debian/patches/bugfix/all/stable/2.6.26.7.patch
==============================================================================
--- (empty file)
+++ dists/sid/linux-2.6/debian/patches/bugfix/all/stable/2.6.26.7.patch	Wed Oct 29 11:31:26 2008
@@ -0,0 +1,958 @@
+diff --git a/Documentation/video4linux/CARDLIST.au0828 b/Documentation/video4linux/CARDLIST.au0828
+index 86d1c8e..e441214 100644
+--- a/Documentation/video4linux/CARDLIST.au0828
++++ b/Documentation/video4linux/CARDLIST.au0828
+@@ -1,4 +1,4 @@
+   0 -> Unknown board                            (au0828)
+-  1 -> Hauppauge HVR950Q                        (au0828)        [2040:7200,2040:7210,2040:7217,2040:721b,2040:721f,2040:7280,0fd9:0008]
++  1 -> Hauppauge HVR950Q                        (au0828)        [2040:7200,2040:7210,2040:7217,2040:721b,2040:721e,2040:721f,2040:7280,0fd9:0008]
+   2 -> Hauppauge HVR850                         (au0828)        [2040:7240]
+   3 -> DViCO FusionHDTV USB                     (au0828)        [0fe9:d620]
+diff --git a/Makefile b/Makefile
+index 0250a37..ac8e8a1 100644
+diff --git a/arch/x86/kernel/alternative.c b/arch/x86/kernel/alternative.c
+index d5ccf42..5e1c92b 100644
+--- a/arch/x86/kernel/alternative.c
++++ b/arch/x86/kernel/alternative.c
+@@ -454,7 +454,7 @@ void __init alternative_instructions(void)
+ 					    _text, _etext);
+ 
+ 		/* Only switch to UP mode if we don't immediately boot others */
+-		if (num_possible_cpus() == 1 || setup_max_cpus <= 1)
++		if (num_present_cpus() == 1 || setup_max_cpus <= 1)
+ 			alternatives_smp_switch(0);
+ 	}
+ #endif
+diff --git a/arch/x86/kernel/io_apic_32.c b/arch/x86/kernel/io_apic_32.c
+index 4dc8600..ad745cd 100644
+--- a/arch/x86/kernel/io_apic_32.c
++++ b/arch/x86/kernel/io_apic_32.c
+@@ -2264,6 +2264,9 @@ void __init setup_IO_APIC(void)
+ 	for (i = FIRST_SYSTEM_VECTOR; i < NR_VECTORS; i++)
+ 		set_bit(i, used_vectors);
+ 
++	/* Mark FIRST_DEVICE_VECTOR which is assigned to IRQ0 as used. */
++	set_bit(FIRST_DEVICE_VECTOR, used_vectors);
++
+ 	enable_IO_APIC();
+ 
+ 	if (acpi_ioapic)
+diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c
+index c6eb5c9..a803de3 100644
+--- a/arch/x86/kernel/process_64.c
++++ b/arch/x86/kernel/process_64.c
+@@ -740,12 +740,12 @@ unsigned long get_wchan(struct task_struct *p)
+ 	if (!p || p == current || p->state==TASK_RUNNING)
+ 		return 0; 
+ 	stack = (unsigned long)task_stack_page(p);
+-	if (p->thread.sp < stack || p->thread.sp > stack+THREAD_SIZE)
++	if (p->thread.sp < stack || p->thread.sp >= stack+THREAD_SIZE)
+ 		return 0;
+ 	fp = *(u64 *)(p->thread.sp);
+ 	do { 
+ 		if (fp < (unsigned long)stack ||
+-		    fp > (unsigned long)stack+THREAD_SIZE)
++		    fp >= (unsigned long)stack+THREAD_SIZE)
+ 			return 0; 
+ 		ip = *(u64 *)(fp+8);
+ 		if (!in_sched_functions(ip))
+diff --git a/arch/x86/mm/ioremap.c b/arch/x86/mm/ioremap.c
+index d1b8671..035752d 100644
+--- a/arch/x86/mm/ioremap.c
++++ b/arch/x86/mm/ioremap.c
+@@ -582,7 +582,7 @@ void __init *early_ioremap(unsigned long phys_addr, unsigned long size)
+ 	 */
+ 	offset = phys_addr & ~PAGE_MASK;
+ 	phys_addr &= PAGE_MASK;
+-	size = PAGE_ALIGN(last_addr) - phys_addr;
++	size = PAGE_ALIGN(last_addr + 1) - phys_addr;
+ 
+ 	/*
+ 	 * Mappings have to fit in the FIX_BTMAP area.
+diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c
+index d089c45..004da4d 100644
+--- a/drivers/acpi/video.c
++++ b/drivers/acpi/video.c
+@@ -720,7 +720,7 @@ static void acpi_video_device_find_cap(struct acpi_video_device *device)
+ 
+ 	kfree(obj);
+ 
+-	if (device->cap._BCL && device->cap._BCM && device->cap._BQC && max_level > 0){
++	if (device->cap._BCL && device->cap._BCM && max_level > 0) {
+ 		int result;
+ 		static int count = 0;
+ 		char *name;
+@@ -732,7 +732,17 @@ static void acpi_video_device_find_cap(struct acpi_video_device *device)
+ 		device->backlight = backlight_device_register(name,
+ 			NULL, device, &acpi_backlight_ops);
+ 		device->backlight->props.max_brightness = device->brightness->count-3;
+-		device->backlight->props.brightness = acpi_video_get_brightness(device->backlight);
++		/*
++		 * If there exists the _BQC object, the _BQC object will be
++		 * called to get the current backlight brightness. Otherwise
++		 * the brightness will be set to the maximum.
++		 */
++		if (device->cap._BQC)
++			device->backlight->props.brightness =
++				acpi_video_get_brightness(device->backlight);
++		else
++			device->backlight->props.brightness =
++				device->backlight->props.max_brightness;
+ 		backlight_update_status(device->backlight);
+ 		kfree(name);
+ 
+diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c
+index 7894d83..27023e3 100644
+--- a/drivers/ata/libata-eh.c
++++ b/drivers/ata/libata-eh.c
+@@ -2050,18 +2050,12 @@ static int ata_do_reset(struct ata_link *link, ata_reset_fn_t reset,
+ }
+ 
+ static int ata_eh_followup_srst_needed(struct ata_link *link,
+-				       int rc, int classify,
+-				       const unsigned int *classes)
++				       int rc, const unsigned int *classes)
+ {
+ 	if ((link->flags & ATA_LFLAG_NO_SRST) || ata_link_offline(link))
+ 		return 0;
+-	if (rc == -EAGAIN) {
+-		if (classify)
+-			return 1;
+-		rc = 0;
+-	}
+-	if (rc != 0)
+-		return 0;
++	if (rc == -EAGAIN)
++		return 1;
+ 	if (sata_pmp_supported(link->ap) && ata_is_host_link(link))
+ 		return 1;
+ 	return 0;
+@@ -2118,10 +2112,10 @@ int ata_eh_reset(struct ata_link *link, int classify,
+ 	ehc->i.action &= ~ATA_EH_RESET;
+ 	if (hardreset) {
+ 		reset = hardreset;
+-		ehc->i.action = ATA_EH_HARDRESET;
++		ehc->i.action |= ATA_EH_HARDRESET;
+ 	} else if (softreset) {
+ 		reset = softreset;
+-		ehc->i.action = ATA_EH_SOFTRESET;
++		ehc->i.action |= ATA_EH_SOFTRESET;
+ 	}
+ 
+ 	if (prereset) {
+@@ -2174,9 +2168,11 @@ int ata_eh_reset(struct ata_link *link, int classify,
+ 			ehc->i.flags |= ATA_EHI_DID_SOFTRESET;
+ 
+ 		rc = ata_do_reset(link, reset, classes, deadline);
++		if (rc && rc != -EAGAIN)
++			goto fail;
+ 
+ 		if (reset == hardreset &&
+-		    ata_eh_followup_srst_needed(link, rc, classify, classes)) {
++		    ata_eh_followup_srst_needed(link, rc, classes)) {
+ 			/* okay, let's do follow-up softreset */
+ 			reset = softreset;
+ 
+@@ -2191,10 +2187,6 @@ int ata_eh_reset(struct ata_link *link, int classify,
+ 			ata_eh_about_to_do(link, NULL, ATA_EH_RESET);
+ 			rc = ata_do_reset(link, reset, classes, deadline);
+ 		}
+-
+-		/* -EAGAIN can happen if we skipped followup SRST */
+-		if (rc && rc != -EAGAIN)
+-			goto fail;
+ 	} else {
+ 		if (verbose)
+ 			ata_link_printk(link, KERN_INFO, "no reset method "
+diff --git a/drivers/char/drm/i915_dma.c b/drivers/char/drm/i915_dma.c
+index 8897434..a219ae4 100644
+--- a/drivers/char/drm/i915_dma.c
++++ b/drivers/char/drm/i915_dma.c
+@@ -836,7 +836,7 @@ struct drm_ioctl_desc i915_ioctls[] = {
+ 	DRM_IOCTL_DEF(DRM_I915_SET_VBLANK_PIPE,  i915_vblank_pipe_set, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY ),
+ 	DRM_IOCTL_DEF(DRM_I915_GET_VBLANK_PIPE,  i915_vblank_pipe_get, DRM_AUTH ),
+ 	DRM_IOCTL_DEF(DRM_I915_VBLANK_SWAP, i915_vblank_swap, DRM_AUTH),
+-	DRM_IOCTL_DEF(DRM_I915_HWS_ADDR, i915_set_status_page, DRM_AUTH),
++	DRM_IOCTL_DEF(DRM_I915_HWS_ADDR, i915_set_status_page, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
+ };
+ 
+ int i915_max_ioctl = DRM_ARRAY_SIZE(i915_ioctls);
+diff --git a/drivers/char/tty_io.c b/drivers/char/tty_io.c
+index 7501310..a51374e 100644
+--- a/drivers/char/tty_io.c
++++ b/drivers/char/tty_io.c
+@@ -3474,7 +3474,7 @@ long tty_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
+ 	case TIOCSTI:
+ 		return tiocsti(tty, p);
+ 	case TIOCGWINSZ:
+-		return tiocgwinsz(tty, p);
++		return tiocgwinsz(real_tty, p);
+ 	case TIOCSWINSZ:
+ 		return tiocswinsz(tty, real_tty, p);
+ 	case TIOCCONS:
+diff --git a/drivers/hwmon/it87.c b/drivers/hwmon/it87.c
+index e12c132..48b9f28 100644
+--- a/drivers/hwmon/it87.c
++++ b/drivers/hwmon/it87.c
+@@ -46,6 +46,8 @@
+ #include <linux/err.h>
+ #include <linux/mutex.h>
+ #include <linux/sysfs.h>
++#include <linux/string.h>
++#include <linux/dmi.h>
+ #include <asm/io.h>
+ 
+ #define DRVNAME "it87"
+@@ -235,6 +237,8 @@ struct it87_sio_data {
+ 	enum chips type;
+ 	/* Values read from Super-I/O config space */
+ 	u8 vid_value;
++	/* Values set based on DMI strings */
++	u8 skip_pwm;
+ };
+ 
+ /* For each registered chip, we need to keep some data in memory.
+@@ -952,6 +956,7 @@ static int __init it87_find(unsigned short *address,
+ {
+ 	int err = -ENODEV;
+ 	u16 chip_type;
++	const char *board_vendor, *board_name;
+ 
+ 	superio_enter();
+ 	chip_type = force_id ? force_id : superio_inw(DEVID);
+@@ -1009,6 +1014,25 @@ static int __init it87_find(unsigned short *address,
+ 			pr_info("it87: in7 is VCCH (+5V Stand-By)\n");
+ 	}
+ 
++	sio_data->skip_pwm = 0;
++	/* Disable specific features based on DMI strings */
++	board_vendor = dmi_get_system_info(DMI_BOARD_VENDOR);
++	board_name = dmi_get_system_info(DMI_BOARD_NAME);
++	if (board_vendor && board_name) {
++		if (strcmp(board_vendor, "nVIDIA") == 0
++		 && strcmp(board_name, "FN68PT") == 0) {
++			/* On the Shuttle SN68PT, FAN_CTL2 is apparently not
++			   connected to a fan, but to something else. One user
++			   has reported instant system power-off when changing
++			   the PWM2 duty cycle, so we disable it.
++			   I use the board name string as the trigger in case
++			   the same board is ever used in other systems. */
++			pr_info("it87: Disabling pwm2 due to "
++				"hardware constraints\n");
++			sio_data->skip_pwm = (1 << 1);
++		}
++	}
++
+ exit:
+ 	superio_exit();
+ 	return err;
+@@ -1157,22 +1181,25 @@ static int __devinit it87_probe(struct platform_device *pdev)
+ 		if ((err = device_create_file(dev,
+ 		     &sensor_dev_attr_pwm1_enable.dev_attr))
+ 		 || (err = device_create_file(dev,
+-		     &sensor_dev_attr_pwm2_enable.dev_attr))
+-		 || (err = device_create_file(dev,
+ 		     &sensor_dev_attr_pwm3_enable.dev_attr))
+ 		 || (err = device_create_file(dev,
+ 		     &sensor_dev_attr_pwm1.dev_attr))
+ 		 || (err = device_create_file(dev,
+-		     &sensor_dev_attr_pwm2.dev_attr))
+-		 || (err = device_create_file(dev,
+ 		     &sensor_dev_attr_pwm3.dev_attr))
+ 		 || (err = device_create_file(dev,
+ 		     &dev_attr_pwm1_freq))
+ 		 || (err = device_create_file(dev,
+-		     &dev_attr_pwm2_freq))
+-		 || (err = device_create_file(dev,
+ 		     &dev_attr_pwm3_freq)))
+ 			goto ERROR4;
++		if (!(sio_data->skip_pwm & (1 << 1))) {
++			if ((err = device_create_file(dev,
++			     &sensor_dev_attr_pwm2_enable.dev_attr))
++			 || (err = device_create_file(dev,
++			     &sensor_dev_attr_pwm2.dev_attr))
++			 || (err = device_create_file(dev,
++			     &dev_attr_pwm2_freq)))
++				goto ERROR4;
++		}
+ 	}
+ 
+ 	if (data->type == it8712 || data->type == it8716
+diff --git a/drivers/media/video/au0828/au0828-cards.c b/drivers/media/video/au0828/au0828-cards.c
+index 898e123..4177bf6 100644
+--- a/drivers/media/video/au0828/au0828-cards.c
++++ b/drivers/media/video/au0828/au0828-cards.c
+@@ -83,6 +83,7 @@ static void hauppauge_eeprom(struct au0828_dev *dev, u8 *eeprom_data)
+ 	case 72221: /* WinTV-HVR950q (OEM, IR, ATSC/QAM and basic analog video */
+ 	case 72231: /* WinTV-HVR950q (OEM, IR, ATSC/QAM and basic analog video */
+ 	case 72241: /* WinTV-HVR950q (OEM, No IR, ATSC/QAM and basic analog video */
++	case 72251: /* WinTV-HVR950q (Retail, IR, ATSC/QAM and basic analog video */
+ 	case 72301: /* WinTV-HVR850 (Retail, IR, ATSC and basic analog video */
+ 	case 72500: /* WinTV-HVR950q (OEM, No IR, ATSC/QAM */
+ 		break;
+@@ -187,6 +188,8 @@ struct usb_device_id au0828_usb_id_table [] = {
+ 		.driver_info = AU0828_BOARD_HAUPPAUGE_HVR950Q },
+ 	{ USB_DEVICE(0x2040, 0x721b),
+ 		.driver_info = AU0828_BOARD_HAUPPAUGE_HVR950Q },
++	{ USB_DEVICE(0x2040, 0x721e),
++		.driver_info = AU0828_BOARD_HAUPPAUGE_HVR950Q },
+ 	{ USB_DEVICE(0x2040, 0x721f),
+ 		.driver_info = AU0828_BOARD_HAUPPAUGE_HVR950Q },
+ 	{ USB_DEVICE(0x2040, 0x7280),
+diff --git a/drivers/media/video/bt8xx/bttv-driver.c b/drivers/media/video/bt8xx/bttv-driver.c
+index 0165aac..7bcd328 100644
+--- a/drivers/media/video/bt8xx/bttv-driver.c
++++ b/drivers/media/video/bt8xx/bttv-driver.c
+@@ -3428,7 +3428,7 @@ static int radio_open(struct inode *inode, struct file *file)
+ 	dprintk("bttv: open minor=%d\n",minor);
+ 
+ 	for (i = 0; i < bttv_num; i++) {
+-		if (bttvs[i].radio_dev->minor == minor) {
++		if (bttvs[i].radio_dev && bttvs[i].radio_dev->minor == minor) {
+ 			btv = &bttvs[i];
+ 			break;
+ 		}
+diff --git a/drivers/media/video/tvaudio.c b/drivers/media/video/tvaudio.c
+index c77914d..0ce64e1 100644
+--- a/drivers/media/video/tvaudio.c
++++ b/drivers/media/video/tvaudio.c
+@@ -1805,7 +1805,7 @@ static int chip_command(struct i2c_client *client,
+ 		break;
+ 	case VIDIOC_S_FREQUENCY:
+ 		chip->mode = 0; /* automatic */
+-		if (desc->checkmode) {
++		if (desc->checkmode && desc->setmode) {
+ 			desc->setmode(chip,V4L2_TUNER_MODE_MONO);
+ 			if (chip->prevmode != V4L2_TUNER_MODE_MONO)
+ 				chip->prevmode = -1; /* reset previous mode */
+diff --git a/drivers/media/video/uvc/uvc_ctrl.c b/drivers/media/video/uvc/uvc_ctrl.c
+index f0ee46d..18c9f71 100644
+--- a/drivers/media/video/uvc/uvc_ctrl.c
++++ b/drivers/media/video/uvc/uvc_ctrl.c
+@@ -585,13 +585,18 @@ int uvc_query_v4l2_ctrl(struct uvc_video_device *video,
+ 	struct uvc_control_mapping *mapping;
+ 	struct uvc_menu_info *menu;
+ 	unsigned int i;
+-	__u8 data[8];
++	__u8 *data;
+ 	int ret;
+ 
+ 	ctrl = uvc_find_control(video, v4l2_ctrl->id, &mapping);
+ 	if (ctrl == NULL)
+ 		return -EINVAL;
+ 
++	data = kmalloc(ctrl->info->size, GFP_KERNEL);
++	if (data == NULL)
++		return -ENOMEM;
++
++	memset(v4l2_ctrl, 0, sizeof *v4l2_ctrl);
+ 	v4l2_ctrl->id = mapping->id;
+ 	v4l2_ctrl->type = mapping->v4l2_type;
+ 	strncpy(v4l2_ctrl->name, mapping->name, sizeof v4l2_ctrl->name);
+@@ -603,12 +608,13 @@ int uvc_query_v4l2_ctrl(struct uvc_video_device *video,
+ 	if (ctrl->info->flags & UVC_CONTROL_GET_DEF) {
+ 		if ((ret = uvc_query_ctrl(video->dev, GET_DEF, ctrl->entity->id,
+ 				video->dev->intfnum, ctrl->info->selector,
+-				&data, ctrl->info->size)) < 0)
+-			return ret;
++				data, ctrl->info->size)) < 0)
++			goto out;
+ 		v4l2_ctrl->default_value = uvc_get_le_value(data, mapping);
+ 	}
+ 
+-	if (mapping->v4l2_type == V4L2_CTRL_TYPE_MENU) {
++	switch (mapping->v4l2_type) {
++	case V4L2_CTRL_TYPE_MENU:
+ 		v4l2_ctrl->minimum = 0;
+ 		v4l2_ctrl->maximum = mapping->menu_count - 1;
+ 		v4l2_ctrl->step = 1;
+@@ -621,32 +627,46 @@ int uvc_query_v4l2_ctrl(struct uvc_video_device *video,
+ 			}
+ 		}
+ 
+-		return 0;
++		ret = 0;
++		goto out;
++
++	case V4L2_CTRL_TYPE_BOOLEAN:
++		v4l2_ctrl->minimum = 0;
++		v4l2_ctrl->maximum = 1;
++		v4l2_ctrl->step = 1;
++		ret = 0;
++		goto out;
++
++	default:
++		break;
+ 	}
+ 
+ 	if (ctrl->info->flags & UVC_CONTROL_GET_MIN) {
+ 		if ((ret = uvc_query_ctrl(video->dev, GET_MIN, ctrl->entity->id,
+ 				video->dev->intfnum, ctrl->info->selector,
+-				&data, ctrl->info->size)) < 0)
+-			return ret;
++				data, ctrl->info->size)) < 0)
++			goto out;
+ 		v4l2_ctrl->minimum = uvc_get_le_value(data, mapping);
+ 	}
+ 	if (ctrl->info->flags & UVC_CONTROL_GET_MAX) {
+ 		if ((ret = uvc_query_ctrl(video->dev, GET_MAX, ctrl->entity->id,
+ 				video->dev->intfnum, ctrl->info->selector,
+-				&data, ctrl->info->size)) < 0)
+-			return ret;
++				data, ctrl->info->size)) < 0)
++			goto out;
+ 		v4l2_ctrl->maximum = uvc_get_le_value(data, mapping);
+ 	}
+ 	if (ctrl->info->flags & UVC_CONTROL_GET_RES) {
+ 		if ((ret = uvc_query_ctrl(video->dev, GET_RES, ctrl->entity->id,
+ 				video->dev->intfnum, ctrl->info->selector,
+-				&data, ctrl->info->size)) < 0)
+-			return ret;
++				data, ctrl->info->size)) < 0)
++			goto out;
+ 		v4l2_ctrl->step = uvc_get_le_value(data, mapping);
+ 	}
+ 
+-	return 0;
++	ret = 0;
++out:
++	kfree(data);
++	return ret;
+ }
+ 
+ 
+diff --git a/drivers/media/video/uvc/uvc_video.c b/drivers/media/video/uvc/uvc_video.c
+index 817af2e..9a8a94a 100644
+--- a/drivers/media/video/uvc/uvc_video.c
++++ b/drivers/media/video/uvc/uvc_video.c
+@@ -90,17 +90,20 @@ static void uvc_fixup_buffer_size(struct uvc_video_device *video,
+ static int uvc_get_video_ctrl(struct uvc_video_device *video,
+ 	struct uvc_streaming_control *ctrl, int probe, __u8 query)
+ {
+-	__u8 data[34];
+-	__u8 size;
++	__u8 *data;
++	__u16 size;
+ 	int ret;
+ 
+ 	size = video->dev->uvc_version >= 0x0110 ? 34 : 26;
++	data = kmalloc(size, GFP_KERNEL);
++	if (data == NULL)
++		return -ENOMEM;
++
+ 	ret = __uvc_query_ctrl(video->dev, query, 0, video->streaming->intfnum,
+-		probe ? VS_PROBE_CONTROL : VS_COMMIT_CONTROL, &data, size,
++		probe ? VS_PROBE_CONTROL : VS_COMMIT_CONTROL, data, size,
+ 		UVC_CTRL_STREAMING_TIMEOUT);
+-
+ 	if (ret < 0)
+-		return ret;
++		goto out;
+ 
+ 	ctrl->bmHint = le16_to_cpup((__le16 *)&data[0]);
+ 	ctrl->bFormatIndex = data[2];
+@@ -136,17 +139,22 @@ static int uvc_get_video_ctrl(struct uvc_video_device *video,
+ 	 */
+ 	uvc_fixup_buffer_size(video, ctrl);
+ 
+-	return 0;
++out:
++	kfree(data);
++	return ret;
+ }
+ 
+ int uvc_set_video_ctrl(struct uvc_video_device *video,
+ 	struct uvc_streaming_control *ctrl, int probe)
+ {
+-	__u8 data[34];
+-	__u8 size;
++	__u8 *data;
++	__u16 size;
++	int ret;
+ 
+ 	size = video->dev->uvc_version >= 0x0110 ? 34 : 26;
+-	memset(data, 0, sizeof data);
++	data = kzalloc(size, GFP_KERNEL);
++	if (data == NULL)
++		return -ENOMEM;
+ 
+ 	*(__le16 *)&data[0] = cpu_to_le16(ctrl->bmHint);
+ 	data[2] = ctrl->bFormatIndex;
+@@ -174,10 +182,13 @@ int uvc_set_video_ctrl(struct uvc_video_device *video,
+ 		data[33] = ctrl->bMaxVersion;
+ 	}
+ 
+-	return __uvc_query_ctrl(video->dev, SET_CUR, 0,
++	ret = __uvc_query_ctrl(video->dev, SET_CUR, 0,
+ 		video->streaming->intfnum,
+-		probe ? VS_PROBE_CONTROL : VS_COMMIT_CONTROL, &data, size,
++		probe ? VS_PROBE_CONTROL : VS_COMMIT_CONTROL, data, size,
+ 		UVC_CTRL_STREAMING_TIMEOUT);
++
++	kfree(data);
++	return ret;
+ }
+ 
+ int uvc_probe_video(struct uvc_video_device *video,
+diff --git a/drivers/media/video/zoran_driver.c b/drivers/media/video/zoran_driver.c
+index 5394d7a..27b7072 100644
+--- a/drivers/media/video/zoran_driver.c
++++ b/drivers/media/video/zoran_driver.c
+@@ -134,7 +134,7 @@ const struct zoran_format zoran_formats[] = {
+ 	}, {
+ 		.name = "16-bit RGB BE",
+ 		ZFMT(-1,
+-		     V4L2_PIX_FMT_RGB565, V4L2_COLORSPACE_SRGB),
++		     V4L2_PIX_FMT_RGB565X, V4L2_COLORSPACE_SRGB),
+ 		.depth = 16,
+ 		.flags = ZORAN_FORMAT_CAPTURE |
+ 			 ZORAN_FORMAT_OVERLAY,
+diff --git a/drivers/net/wireless/b43legacy/xmit.c b/drivers/net/wireless/b43legacy/xmit.c
+index dcad249..1b71a9f 100644
+--- a/drivers/net/wireless/b43legacy/xmit.c
++++ b/drivers/net/wireless/b43legacy/xmit.c
+@@ -626,7 +626,7 @@ void b43legacy_handle_hwtxstatus(struct b43legacy_wldev *dev,
+ 	tmp = hw->count;
+ 	status.frame_count = (tmp >> 4);
+ 	status.rts_count = (tmp & 0x0F);
+-	tmp = hw->flags;
++	tmp = hw->flags << 1;
+ 	status.supp_reason = ((tmp & 0x1C) >> 2);
+ 	status.pm_indicated = !!(tmp & 0x80);
+ 	status.intermediate = !!(tmp & 0x40);
+diff --git a/drivers/pci/pci-acpi.c b/drivers/pci/pci-acpi.c
+index 9d6fc8e..c2dc92b 100644
+--- a/drivers/pci/pci-acpi.c
++++ b/drivers/pci/pci-acpi.c
+@@ -11,6 +11,7 @@
+ #include <linux/init.h>
+ #include <linux/pci.h>
+ #include <linux/module.h>
++#include <linux/pci-aspm.h>
+ #include <acpi/acpi.h>
+ #include <acpi/acnamesp.h>
+ #include <acpi/acresrc.h>
+@@ -394,6 +395,12 @@ static int __init acpi_pci_init(void)
+ 		printk(KERN_INFO"ACPI FADT declares the system doesn't support MSI, so disable it\n");
+ 		pci_no_msi();
+ 	}
++
++	if (acpi_gbl_FADT.boot_flags & BAF_PCIE_ASPM_CONTROL) {
++		printk(KERN_INFO"ACPI FADT declares the system doesn't support PCIe ASPM, so disable it\n");
++		pcie_no_aspm();
++	}
++
+ 	ret = register_acpi_bus_type(&acpi_pci_bus);
+ 	if (ret)
+ 		return 0;
+diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c
+index 9c71858..96c4750 100644
+--- a/drivers/pci/pci-sysfs.c
++++ b/drivers/pci/pci-sysfs.c
+@@ -16,6 +16,7 @@
+ 
+ 
+ #include <linux/kernel.h>
++#include <linux/sched.h>
+ #include <linux/pci.h>
+ #include <linux/stat.h>
+ #include <linux/topology.h>
+@@ -484,6 +485,21 @@ pci_mmap_legacy_mem(struct kobject *kobj, struct bin_attribute *attr,
+ #endif /* HAVE_PCI_LEGACY */
+ 
+ #ifdef HAVE_PCI_MMAP
++
++static int pci_mmap_fits(struct pci_dev *pdev, int resno, struct vm_area_struct *vma)
++{
++	unsigned long nr, start, size;
++
++	nr = (vma->vm_end - vma->vm_start) >> PAGE_SHIFT;
++	start = vma->vm_pgoff;
++	size = pci_resource_len(pdev, resno) >> PAGE_SHIFT;
++	if (start < size && size - start >= nr)
++		return 1;
++	printk(KERN_WARNING "WARNING: process \"%s\" tried to map 0x%08lx-0x%08lx on %s BAR %d (size 0x%08lx)\n",
++		current->comm, start, start+nr, pci_name(pdev), resno, size);
++	return 0;
++}
++
+ /**
+  * pci_mmap_resource - map a PCI resource into user memory space
+  * @kobj: kobject for mapping
+@@ -510,6 +526,9 @@ pci_mmap_resource(struct kobject *kobj, struct bin_attribute *attr,
+ 	if (i >= PCI_ROM_RESOURCE)
+ 		return -ENODEV;
+ 
++	if (!pci_mmap_fits(pdev, i, vma))
++		return -EINVAL;
++
+ 	/* pci_mmap_page_range() expects the same kind of entry as coming
+ 	 * from /proc/bus/pci/ which is a "user visible" value. If this is
+ 	 * different from the resource itself, arch will do necessary fixup.
+diff --git a/drivers/pci/pcie/aspm.c b/drivers/pci/pcie/aspm.c
+index f824955..7046052 100644
+--- a/drivers/pci/pcie/aspm.c
++++ b/drivers/pci/pcie/aspm.c
+@@ -510,6 +510,7 @@ static int pcie_aspm_sanity_check(struct pci_dev *pdev)
+ {
+ 	struct pci_dev *child_dev;
+ 	int child_pos;
++	u32 reg32;
+ 
+ 	/*
+ 	 * Some functions in a slot might not all be PCIE functions, very
+@@ -519,6 +520,18 @@ static int pcie_aspm_sanity_check(struct pci_dev *pdev)
+ 		child_pos = pci_find_capability(child_dev, PCI_CAP_ID_EXP);
+ 		if (!child_pos)
+ 			return -EINVAL;
++
++		/*
++		 * Disable ASPM for pre-1.1 PCIe device, we follow MS to use
++		 * RBER bit to determine if a function is 1.1 version device
++		 */
++		pci_read_config_dword(child_dev, child_pos + PCI_EXP_DEVCAP,
++			&reg32);
++		if (!(reg32 & PCI_EXP_DEVCAP_RBER)) {
++			printk("Pre-1.1 PCIe device detected, "
++				"disable ASPM for %s\n", pci_name(pdev));
++			return -EINVAL;
++		}
+ 	}
+ 	return 0;
+ }
+@@ -808,6 +821,11 @@ static int __init pcie_aspm_disable(char *str)
+ 
+ __setup("pcie_noaspm", pcie_aspm_disable);
+ 
++void pcie_no_aspm(void)
++{
++	aspm_disabled = 1;
++}
++
+ #ifdef CONFIG_ACPI
+ #include <acpi/acpi_bus.h>
+ #include <linux/pci-acpi.h>
+diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
+index 3706ce7..4f90250 100644
+--- a/drivers/pci/probe.c
++++ b/drivers/pci/probe.c
+@@ -1047,7 +1047,8 @@ int pci_scan_slot(struct pci_bus *bus, int devfn)
+ 		}
+ 	}
+ 
+-	if (bus->self)
++	/* only one slot has pcie device */
++	if (bus->self && nr)
+ 		pcie_aspm_init_link_state(bus->self);
+ 
+ 	return nr;
+diff --git a/drivers/video/console/fbcon.c b/drivers/video/console/fbcon.c
+index 97aff8d..e27f6bd 100644
+--- a/drivers/video/console/fbcon.c
++++ b/drivers/video/console/fbcon.c
+@@ -2990,8 +2990,8 @@ static void fbcon_set_all_vcs(struct fb_info *info)
+ 		p = &fb_display[vc->vc_num];
+ 		set_blitting_type(vc, info);
+ 		var_to_display(p, &info->var, info);
+-		cols = FBCON_SWAP(p->rotate, info->var.xres, info->var.yres);
+-		rows = FBCON_SWAP(p->rotate, info->var.yres, info->var.xres);
++		cols = FBCON_SWAP(ops->rotate, info->var.xres, info->var.yres);
++		rows = FBCON_SWAP(ops->rotate, info->var.yres, info->var.xres);
+ 		cols /= vc->vc_font.width;
+ 		rows /= vc->vc_font.height;
+ 		vc_resize(vc, cols, rows);
+diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h
+index 9cfcf32..646b04f 100644
+--- a/fs/cifs/cifsglob.h
++++ b/fs/cifs/cifsglob.h
+@@ -308,6 +308,7 @@ struct cifs_search_info {
+ 	__u32 resume_key;
+ 	char *ntwrk_buf_start;
+ 	char *srch_entries_start;
++	char *last_entry;
+ 	char *presume_name;
+ 	unsigned int resume_name_len;
+ 	bool endOfSearch:1;
+diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c
+index 4511b70..0f7286c 100644
+--- a/fs/cifs/cifssmb.c
++++ b/fs/cifs/cifssmb.c
+@@ -3638,6 +3638,8 @@ findFirstRetry:
+ 					le16_to_cpu(parms->SearchCount);
+ 			psrch_inf->index_of_last_entry = 2 /* skip . and .. */ +
+ 				psrch_inf->entries_in_buffer;
++			psrch_inf->last_entry = psrch_inf->srch_entries_start +
++					le16_to_cpu(parms->LastNameOffset);
+ 			*pnetfid = parms->SearchHandle;
+ 		} else {
+ 			cifs_buf_release(pSMB);
+@@ -3753,6 +3755,8 @@ int CIFSFindNext(const int xid, struct cifsTconInfo *tcon,
+ 						le16_to_cpu(parms->SearchCount);
+ 			psrch_inf->index_of_last_entry +=
+ 				psrch_inf->entries_in_buffer;
++			psrch_inf->last_entry = psrch_inf->srch_entries_start +
++					le16_to_cpu(parms->LastNameOffset);
+ /*  cFYI(1,("fnxt2 entries in buf %d index_of_last %d",
+ 	    psrch_inf->entries_in_buffer, psrch_inf->index_of_last_entry)); */
+ 
+diff --git a/fs/cifs/readdir.c b/fs/cifs/readdir.c
+index 83f3069..85ea3c6 100644
+--- a/fs/cifs/readdir.c
++++ b/fs/cifs/readdir.c
+@@ -640,6 +640,70 @@ static int is_dir_changed(struct file *file)
+ 
+ }
+ 
++static int cifs_save_resume_key(const char *current_entry,
++	struct cifsFileInfo *cifsFile)
++{
++	int rc = 0;
++	unsigned int len = 0;
++	__u16 level;
++	char *filename;
++
++	if ((cifsFile == NULL) || (current_entry == NULL))
++		return -EINVAL;
++
++	level = cifsFile->srch_inf.info_level;
++
++	if (level == SMB_FIND_FILE_UNIX) {
++		FILE_UNIX_INFO *pFindData = (FILE_UNIX_INFO *)current_entry;
++
++		filename = &pFindData->FileName[0];
++		if (cifsFile->srch_inf.unicode) {
++			len = cifs_unicode_bytelen(filename);
++		} else {
++			/* BB should we make this strnlen of PATH_MAX? */
++			len = strnlen(filename, PATH_MAX);
++		}
++		cifsFile->srch_inf.resume_key = pFindData->ResumeKey;
++	} else if (level == SMB_FIND_FILE_DIRECTORY_INFO) {
++		FILE_DIRECTORY_INFO *pFindData =
++			(FILE_DIRECTORY_INFO *)current_entry;
++		filename = &pFindData->FileName[0];
++		len = le32_to_cpu(pFindData->FileNameLength);
++		cifsFile->srch_inf.resume_key = pFindData->FileIndex;
++	} else if (level == SMB_FIND_FILE_FULL_DIRECTORY_INFO) {
++		FILE_FULL_DIRECTORY_INFO *pFindData =
++			(FILE_FULL_DIRECTORY_INFO *)current_entry;
++		filename = &pFindData->FileName[0];
++		len = le32_to_cpu(pFindData->FileNameLength);
++		cifsFile->srch_inf.resume_key = pFindData->FileIndex;
++	} else if (level == SMB_FIND_FILE_ID_FULL_DIR_INFO) {
++		SEARCH_ID_FULL_DIR_INFO *pFindData =
++			(SEARCH_ID_FULL_DIR_INFO *)current_entry;
++		filename = &pFindData->FileName[0];
++		len = le32_to_cpu(pFindData->FileNameLength);
++		cifsFile->srch_inf.resume_key = pFindData->FileIndex;
++	} else if (level == SMB_FIND_FILE_BOTH_DIRECTORY_INFO) {
++		FILE_BOTH_DIRECTORY_INFO *pFindData =
++			(FILE_BOTH_DIRECTORY_INFO *)current_entry;
++		filename = &pFindData->FileName[0];
++		len = le32_to_cpu(pFindData->FileNameLength);
++		cifsFile->srch_inf.resume_key = pFindData->FileIndex;
++	} else if (level == SMB_FIND_FILE_INFO_STANDARD) {
++		FIND_FILE_STANDARD_INFO *pFindData =
++			(FIND_FILE_STANDARD_INFO *)current_entry;
++		filename = &pFindData->FileName[0];
++		/* one byte length, no name conversion */
++		len = (unsigned int)pFindData->FileNameLength;
++		cifsFile->srch_inf.resume_key = pFindData->ResumeKey;
++	} else {
++		cFYI(1, ("Unknown findfirst level %d", level));
++		return -EINVAL;
++	}
++	cifsFile->srch_inf.resume_name_len = len;
++	cifsFile->srch_inf.presume_name = filename;
++	return rc;
++}
++
+ /* find the corresponding entry in the search */
+ /* Note that the SMB server returns search entries for . and .. which
+    complicates logic here if we choose to parse for them and we do not
+@@ -702,6 +766,7 @@ static int find_cifs_entry(const int xid, struct cifsTconInfo *pTcon,
+ 	while ((index_to_find >= cifsFile->srch_inf.index_of_last_entry) &&
+ 	      (rc == 0) && !cifsFile->srch_inf.endOfSearch) {
+ 		cFYI(1, ("calling findnext2"));
++		cifs_save_resume_key(cifsFile->srch_inf.last_entry, cifsFile);
+ 		rc = CIFSFindNext(xid, pTcon, cifsFile->netfid,
+ 				  &cifsFile->srch_inf);
+ 		if (rc)
+@@ -918,69 +983,6 @@ static int cifs_filldir(char *pfindEntry, struct file *file,
+ 	return rc;
+ }
+ 
+-static int cifs_save_resume_key(const char *current_entry,
+-	struct cifsFileInfo *cifsFile)
+-{
+-	int rc = 0;
+-	unsigned int len = 0;
+-	__u16 level;
+-	char *filename;
+-
+-	if ((cifsFile == NULL) || (current_entry == NULL))
+-		return -EINVAL;
+-
+-	level = cifsFile->srch_inf.info_level;
+-
+-	if (level == SMB_FIND_FILE_UNIX) {
+-		FILE_UNIX_INFO *pFindData = (FILE_UNIX_INFO *)current_entry;
+-
+-		filename = &pFindData->FileName[0];
+-		if (cifsFile->srch_inf.unicode) {
+-			len = cifs_unicode_bytelen(filename);
+-		} else {
+-			/* BB should we make this strnlen of PATH_MAX? */
+-			len = strnlen(filename, PATH_MAX);
+-		}
+-		cifsFile->srch_inf.resume_key = pFindData->ResumeKey;
+-	} else if (level == SMB_FIND_FILE_DIRECTORY_INFO) {
+-		FILE_DIRECTORY_INFO *pFindData =
+-			(FILE_DIRECTORY_INFO *)current_entry;
+-		filename = &pFindData->FileName[0];
+-		len = le32_to_cpu(pFindData->FileNameLength);
+-		cifsFile->srch_inf.resume_key = pFindData->FileIndex;
+-	} else if (level == SMB_FIND_FILE_FULL_DIRECTORY_INFO) {
+-		FILE_FULL_DIRECTORY_INFO *pFindData =
+-			(FILE_FULL_DIRECTORY_INFO *)current_entry;
+-		filename = &pFindData->FileName[0];
+-		len = le32_to_cpu(pFindData->FileNameLength);
+-		cifsFile->srch_inf.resume_key = pFindData->FileIndex;
+-	} else if (level == SMB_FIND_FILE_ID_FULL_DIR_INFO) {
+-		SEARCH_ID_FULL_DIR_INFO *pFindData =
+-			(SEARCH_ID_FULL_DIR_INFO *)current_entry;
+-		filename = &pFindData->FileName[0];
+-		len = le32_to_cpu(pFindData->FileNameLength);
+-		cifsFile->srch_inf.resume_key = pFindData->FileIndex;
+-	} else if (level == SMB_FIND_FILE_BOTH_DIRECTORY_INFO) {
+-		FILE_BOTH_DIRECTORY_INFO *pFindData =
+-			(FILE_BOTH_DIRECTORY_INFO *)current_entry;
+-		filename = &pFindData->FileName[0];
+-		len = le32_to_cpu(pFindData->FileNameLength);
+-		cifsFile->srch_inf.resume_key = pFindData->FileIndex;
+-	} else if (level == SMB_FIND_FILE_INFO_STANDARD) {
+-		FIND_FILE_STANDARD_INFO *pFindData =
+-			(FIND_FILE_STANDARD_INFO *)current_entry;
+-		filename = &pFindData->FileName[0];
+-		/* one byte length, no name conversion */
+-		len = (unsigned int)pFindData->FileNameLength;
+-		cifsFile->srch_inf.resume_key = pFindData->ResumeKey;
+-	} else {
+-		cFYI(1, ("Unknown findfirst level %d", level));
+-		return -EINVAL;
+-	}
+-	cifsFile->srch_inf.resume_name_len = len;
+-	cifsFile->srch_inf.presume_name = filename;
+-	return rc;
+-}
+ 
+ int cifs_readdir(struct file *file, void *direntry, filldir_t filldir)
+ {
+diff --git a/fs/splice.c b/fs/splice.c
+index aa5f6f6..df75dcc 100644
+--- a/fs/splice.c
++++ b/fs/splice.c
+@@ -889,6 +889,9 @@ static long do_splice_from(struct pipe_inode_info *pipe, struct file *out,
+ 	if (unlikely(!(out->f_mode & FMODE_WRITE)))
+ 		return -EBADF;
+ 
++	if (unlikely(out->f_flags & O_APPEND))
++		return -EINVAL;
++
+ 	ret = rw_verify_area(WRITE, out, ppos, len);
+ 	if (unlikely(ret < 0))
+ 		return ret;
+diff --git a/include/acpi/actbl.h b/include/acpi/actbl.h
+index 1ebbe88..13a3d9a 100644
+--- a/include/acpi/actbl.h
++++ b/include/acpi/actbl.h
+@@ -277,6 +277,7 @@ enum acpi_prefered_pm_profiles {
+ #define BAF_LEGACY_DEVICES              0x0001
+ #define BAF_8042_KEYBOARD_CONTROLLER    0x0002
+ #define BAF_MSI_NOT_SUPPORTED           0x0008
++#define BAF_PCIE_ASPM_CONTROL           0x0010
+ 
+ #define FADT2_REVISION_ID               3
+ #define FADT2_MINUS_REVISION_ID         2
+diff --git a/include/linux/ata.h b/include/linux/ata.h
+index 1c622e2..636589b 100644
+--- a/include/linux/ata.h
++++ b/include/linux/ata.h
+@@ -682,7 +682,7 @@ static inline int ata_ok(u8 status)
+ static inline int lba_28_ok(u64 block, u32 n_block)
+ {
+ 	/* check the ending block number */
+-	return ((block + n_block - 1) < ((u64)1 << 28)) && (n_block <= 256);
++	return ((block + n_block) < ((u64)1 << 28)) && (n_block <= 256);
+ }
+ 
+ static inline int lba_48_ok(u64 block, u32 n_block)
+diff --git a/include/linux/pci-aspm.h b/include/linux/pci-aspm.h
+index a1a1e61..91ba0b3 100644
+--- a/include/linux/pci-aspm.h
++++ b/include/linux/pci-aspm.h
+@@ -27,6 +27,7 @@ extern void pcie_aspm_init_link_state(struct pci_dev *pdev);
+ extern void pcie_aspm_exit_link_state(struct pci_dev *pdev);
+ extern void pcie_aspm_pm_state_change(struct pci_dev *pdev);
+ extern void pci_disable_link_state(struct pci_dev *pdev, int state);
++extern void pcie_no_aspm(void);
+ #else
+ static inline void pcie_aspm_init_link_state(struct pci_dev *pdev)
+ {
+@@ -40,6 +41,10 @@ static inline void pcie_aspm_pm_state_change(struct pci_dev *pdev)
+ static inline void pci_disable_link_state(struct pci_dev *pdev, int state)
+ {
+ }
++
++static inline void pcie_no_aspm(void)
++{
++}
+ #endif
+ 
+ #ifdef CONFIG_PCIEASPM_DEBUG /* this depends on CONFIG_PCIEASPM */
+diff --git a/include/linux/pci_regs.h b/include/linux/pci_regs.h
+index c0c1223..81045aa 100644
+--- a/include/linux/pci_regs.h
++++ b/include/linux/pci_regs.h
+@@ -373,6 +373,7 @@
+ #define  PCI_EXP_DEVCAP_ATN_BUT	0x1000	/* Attention Button Present */
+ #define  PCI_EXP_DEVCAP_ATN_IND	0x2000	/* Attention Indicator Present */
+ #define  PCI_EXP_DEVCAP_PWR_IND	0x4000	/* Power Indicator Present */
++#define  PCI_EXP_DEVCAP_RBER	0x8000	/* Role-Based Error Reporting */
+ #define  PCI_EXP_DEVCAP_PWR_VAL	0x3fc0000 /* Slot Power Limit Value */
+ #define  PCI_EXP_DEVCAP_PWR_SCL	0xc000000 /* Slot Power Limit Scale */
+ #define PCI_EXP_DEVCTL		8	/* Device Control */
+diff --git a/kernel/module.c b/kernel/module.c
+index 5f80478..f12c92c 100644
+--- a/kernel/module.c
++++ b/kernel/module.c
+@@ -1143,7 +1143,7 @@ static void free_notes_attrs(struct module_notes_attrs *notes_attrs,
+ 		while (i-- > 0)
+ 			sysfs_remove_bin_file(notes_attrs->dir,
+ 					      &notes_attrs->attrs[i]);
+-		kobject_del(notes_attrs->dir);
++		kobject_put(notes_attrs->dir);
+ 	}
+ 	kfree(notes_attrs);
+ }
+diff --git a/kernel/sched_rt.c b/kernel/sched_rt.c
+index 0f3c191..957e238 100644
+--- a/kernel/sched_rt.c
++++ b/kernel/sched_rt.c
+@@ -96,12 +96,12 @@ static void dequeue_rt_entity(struct sched_rt_entity *rt_se);
+ 
+ static void sched_rt_rq_enqueue(struct rt_rq *rt_rq)
+ {
++	struct task_struct *curr = rq_of_rt_rq(rt_rq)->curr;
+ 	struct sched_rt_entity *rt_se = rt_rq->rt_se;
+ 
+-	if (rt_se && !on_rt_rq(rt_se) && rt_rq->rt_nr_running) {
+-		struct task_struct *curr = rq_of_rt_rq(rt_rq)->curr;
+-
+-		enqueue_rt_entity(rt_se);
++	if (rt_rq->rt_nr_running) {
++		if (rt_se && !on_rt_rq(rt_se))
++			enqueue_rt_entity(rt_se);
+ 		if (rt_rq->highest_prio < curr->prio)
+ 			resched_task(curr);
+ 	}

Modified: dists/sid/linux-2.6/debian/patches/series/10
==============================================================================
--- dists/sid/linux-2.6/debian/patches/series/10	(original)
+++ dists/sid/linux-2.6/debian/patches/series/10	Wed Oct 29 11:31:26 2008
@@ -3,3 +3,7 @@
 + bugfix/all/drivers-char-agp-intel-correct-gm4x-stolen.patch
 + bugfix/all/ext3-add-support-for-non-native-signed-unsigned-htr.patch
 + bugfix/all/ext4-add-support-for-non-native-signed-unsigned-htr.patch
+- bugfix/x86/i915-restrict-DRM_I915_HWS_ADDR.patch
+- bugfix/all/dont-allow-splice-to-files-opened-with-O_APPEND.patch
+- bugfix/all/libata-LBA28-LBA48-off-by-one.patch
++ bugfix/all/stable/2.6.26.7.patch



More information about the Kernel-svn-changes mailing list