Linux 2.6.26.7 - Kernel

This is a discussion on Linux 2.6.26.7 - Kernel ; We (the -stable team) are announcing the release of the 2.6.26.7 kernel. It contains a wide range of bugfixes, and all users of the 2.6.26 kernel series are strongly encouraged to upgrade. Actually, scratch that, you all should upgrade to ...

+ Reply to Thread
Results 1 to 2 of 2

Thread: Linux 2.6.26.7

  1. Linux 2.6.26.7

    We (the -stable team) are announcing the release of the 2.6.26.7
    kernel.

    It contains a wide range of bugfixes, and all users of the 2.6.26 kernel
    series are strongly encouraged to upgrade.

    Actually, scratch that, you all should upgrade to the 2.6.27 kernel
    series as soon as possible, as there will probably only be one more
    2.6.26 kernel release, so starting to migrate now would be a very good
    idea.

    I'll also be replying to this message with a copy of the patch between
    2.6.26.6 and 2.6.26.7

    The updated 2.6.26.y git tree can be found at:
    git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-2.6.26.y.git
    and can be browsed at the normal kernel.org git web browser:
    http://git.kernel.org/?p=linux/kerne....git;a=summary

    thanks,

    greg k-h

    ------------

    Documentation/video4linux/CARDLIST.au0828 | 2
    Makefile | 2
    arch/x86/kernel/alternative.c | 2
    arch/x86/kernel/io_apic_32.c | 3
    arch/x86/kernel/process_64.c | 4
    arch/x86/mm/ioremap.c | 2
    drivers/acpi/video.c | 14 ++-
    drivers/ata/libata-eh.c | 24 +----
    drivers/char/drm/i915_dma.c | 2
    drivers/char/tty_io.c | 2
    drivers/hwmon/it87.c | 39 +++++++--
    drivers/media/video/au0828/au0828-cards.c | 3
    drivers/media/video/bt8xx/bttv-driver.c | 2
    drivers/media/video/tvaudio.c | 2
    drivers/media/video/uvc/uvc_ctrl.c | 44 +++++++---
    drivers/media/video/uvc/uvc_video.c | 33 +++++--
    drivers/media/video/zoran_driver.c | 2
    drivers/net/wireless/b43legacy/xmit.c | 2
    drivers/pci/pci-acpi.c | 7 +
    drivers/pci/pci-sysfs.c | 19 ++++
    drivers/pci/pcie/aspm.c | 18 ++++
    drivers/pci/probe.c | 3
    drivers/video/console/fbcon.c | 4
    fs/cifs/cifsglob.h | 1
    fs/cifs/cifssmb.c | 4
    fs/cifs/readdir.c | 128 +++++++++++++++---------------
    fs/splice.c | 3
    include/acpi/actbl.h | 1
    include/linux/ata.h | 2
    include/linux/pci-aspm.h | 5 +
    include/linux/pci_regs.h | 1
    kernel/module.c | 2
    kernel/sched_rt.c | 8 -
    33 files changed, 259 insertions(+), 131 deletions(-)

    Alan Cox (2):
    x86, early_ioremap: fix fencepost error
    tty: Termios locking - sort out real_tty confusions and lock reads

    Alexey Dobriyan (1):
    modules: fix module "notes" kobject leak

    Arjan van de Ven (1):
    security: avoid calling a NULL function pointer in drivers/video/tvaudio.c

    Dario Faggioli (1):
    sched_rt.c: resch needed in rt_rq_enqueue() for the root rt_rq

    David Rientjes (1):
    x86: avoid dereferencing beyond stack + THREAD_SIZE

    Greg Kroah-Hartman (1):
    Linux 2.6.26.7

    Jean Delvare (3):
    V4L: bttv: Prevent NULL pointer dereference in radio_open
    V4L: zr36067: Fix RGBR pixel format
    hwmon: (it87) Prevent power-off on Shuttle SN68PT

    Larry Finger (1):
    b43legacy: Fix failure in rate-adjustment mechanism

    Laurent Pinchart (2):
    V4L/DVB (8498): uvcvideo: Return sensible min and max values when querying a boolean control.
    V4L/DVB (8617): uvcvideo: don't use stack-based buffers for USB transfers.

    Linus Torvalds (2):
    Don't allow splice() to files opened with O_APPEND
    Check mapped ranges on sysfs resource files

    Matthias Hopf (1):
    drm/i915: fix ioremap of a user address for non-root (CVE-2008-3831)

    Michael Krufky (1):
    DVB: au0828: add support for another USB id for Hauppauge HVR950Q

    Oleg Nesterov (1):
    fbcon_set_all_vcs: fix kernel crash when switching the rotated consoles

    Ralph Loader (1):
    V4L/DVB (9053): fix buffer overflow in uvc-video

    Shaohua Li (2):
    PCI: disable ASPM per ACPI FADT setting
    PCI: disable ASPM on pre-1.1 PCIe devices

    Stefan Bader (1):
    x86: Reserve FIRST_DEVICE_VECTOR in used_vectors bitmap.

    Steve French (1):
    CIFS: make sure we have the right resume info before calling CIFSFindNext

    Taisuke Yamada (1):
    libata: LBA28/LBA48 off-by-one bug in ata.h

    Tejun Heo (2):
    libata: always do follow-up SRST if hardreset returned -EAGAIN
    libata: fix EH action overwriting in ata_eh_reset()

    Thomas Gleixner (1):
    x86: improve UP kernel when CPU-hotplug and SMP is enabled

    Zhao Yakui (1):
    ACPI: Ignore _BQC object when registering backlight device

    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

  2. Re: Linux 2.6.26.7

    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
    --- a/Makefile
    +++ b/Makefile
    @@ -1,7 +1,7 @@
    VERSION = 2
    PATCHLEVEL = 6
    SUBLEVEL = 26
    -EXTRAVERSION = .6
    +EXTRAVERSION = .7
    NAME = Rotary Wombat

    # *DOCUMENTATION*
    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
    #include
    #include
    +#include
    +#include
    #include

    #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
    #include
    #include
    +#include
    #include
    #include
    #include
    @@ -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
    +#include
    #include
    #include
    #include
    @@ -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
    #include
    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);
    }
    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

+ Reply to Thread