28 Mar, 2011

24 commits

  • Greg Kroah-Hartman
     
  • commit dd65c736d1b5312c80c88a64bf521db4959eded5 upstream.

    The dcdbas driver can do an I/O write to cause a SMI to occur. The SMI handler
    looks at certain registers and memory locations, so the SMI needs to happen
    immediately. On some systems I/O writes are posted, though, causing the SMI to
    happen well after the "outb" occurred, which causes random failures. Following
    the "outb" with an "inb" forces the write to go through even if it is posted.

    Signed-off-by: Stuart Hayes
    Acked-by: Doug Warzecha
    Cc: Chuck Ebbert
    Signed-off-by: Jiri Kosina
    Signed-off-by: Greg Kroah-Hartman

    Stuart Hayes
     
  • commit 24ff6663ccfdaf088dfa7acae489cb11ed4f43c4 upstream.

    While trying to track down some NFS problems with BTRFS, I kept noticing I was
    getting -EACCESS for no apparent reason. Eric Paris and printk() helped me
    figure out that it was SELinux that was giving me grief, with the following
    denial

    type=AVC msg=audit(1290013638.413:95): avc: denied { 0x800000 } for pid=1772
    comm="nfsd" name="" dev=sda1 ino=256 scontext=system_u:system_r:kernel_t:s0
    tcontext=system_u:object_r:unlabeled_t:s0 tclass=file

    Turns out this is because in d_obtain_alias if we can't find an alias we create
    one and do all the normal instantiation stuff, but we don't do the
    security_d_instantiate.

    Usually we are protected from getting a hashed dentry that hasn't yet run
    security_d_instantiate() by the parent's i_mutex, but obviously this isn't an
    option there, so in order to deal with the case that a second thread comes in
    and finds our new dentry before we get to run security_d_instantiate(), we go
    ahead and call it if we find a dentry already. Eric assures me that this is ok
    as the code checks to see if the dentry has been initialized already so calling
    security_d_instantiate() against the same dentry multiple times is ok. With
    this patch I'm no longer getting errant -EACCESS values.

    Signed-off-by: Josef Bacik
    Signed-off-by: Al Viro
    Cc: Chuck Ebbert
    Signed-off-by: Greg Kroah-Hartman

    Josef Bacik
     
  • commit 246408dcd5dfeef2df437ccb0ef4d6ee87805f58 upstream.

    If we call xs_close(), we're in one of two situations:
    - Autoclose, which means we don't expect to resend a request
    - bind+connect failed, which probably means the port is in use

    Signed-off-by: Trond Myklebust
    Signed-off-by: Greg Kroah-Hartman

    Trond Myklebust
     
  • commit 8c3c283e6bf463ab498d6e7823aff6c4762314b6 upstream.

    A virtualized display device is usually viewed with the vncviewer
    application, either by 'xm vnc domU' or with vncviewer localhost:port.
    vncviewer and the RFB protocol provides absolute coordinates to the
    virtual display. These coordinates are either passed through to a PV
    guest or converted to relative coordinates for a HVM guest.

    A PV guest receives these coordinates and passes them to the kernels
    evdev driver. There it can be picked up by applications such as the
    xorg-input drivers. Using absolute coordinates avoids issues such as
    guest mouse pointer not tracking host mouse pointer due to wrong mouse
    acceleration settings in the guests X display.

    Advertise either absolute or relative coordinates to the input system
    and the evdev driver, depending on what dom0 provides. The xorg-input
    driver prefers relative coordinates even if a devices provides both.

    Signed-off-by: Olaf Hering
    Signed-off-by: Stefano Stabellini
    Signed-off-by: Dmitry Torokhov
    Signed-off-by: Greg Kroah-Hartman

    Olaf Hering
     
  • commit 7e7797e7f6f7bfab73fca02c65e40eaa5bb9000c upstream.

    Fix potential null-pointer exception on disconnect introduced by commit
    11ea859d64b69a747d6b060b9ed1520eab1161fe (USB: additional power savings
    for cdc-acm devices that support remote wakeup).

    Only access acm->dev after making sure it is non-null in control urb
    completion handler.

    Signed-off-by: Johan Hovold
    Signed-off-by: Greg Kroah-Hartman

    Johan Hovold
     
  • commit 15e5bee33ffc11d0e5c6f819a65e7881c5c407be upstream.

    Must check return value of tty_port_tty_get.

    Signed-off-by: Johan Hovold
    Signed-off-by: Greg Kroah-Hartman

    Johan Hovold
     
  • commit 23b80550e2aa61d0ba3af98b831b9195be0db9ee upstream.

    Prevent read urbs from being resubmitted from tasklet after port close.

    The receive tasklet was not disabled on port close, which could lead to
    corruption of receive lists on consecutive port open. In particular,
    read urbs could be re-submitted before port open, added to free list in
    open, and then added a second time to the free list in the completion
    handler.

    cdc-acm.c: Entering acm_tty_open.
    cdc-acm.c: acm_control_msg: rq: 0x22 val: 0x3 len: 0x0 result: 0
    cdc-acm.c: Entering acm_rx_tasklet
    cdc-acm.c: acm_rx_tasklet: sending urb 0xf50da280, rcv 0xf57fbc24, buf 0xf57fbd64
    cdc-acm.c: set line: 115200 0 0 8
    cdc-acm.c: acm_control_msg: rq: 0x20 val: 0x0 len: 0x7 result: 7
    cdc-acm.c: acm_tty_close
    cdc-acm.c: acm_port_down
    cdc-acm.c: acm_control_msg: rq: 0x22 val: 0x0 len: 0x0 result: 0
    cdc-acm.c: acm_ctrl_irq - urb shutting down with status: -2
    cdc-acm.c: acm_rx_tasklet: sending urb 0xf50da300, rcv 0xf57fbc10, buf 0xf57fbd50
    cdc-acm.c: Entering acm_read_bulk with status -2
    cdc_acm 4-1:1.1: Aborting, acm not ready
    cdc-acm.c: Entering acm_read_bulk with status -2
    cdc_acm 4-1:1.1: Aborting, acm not ready
    cdc-acm.c: acm_rx_tasklet: sending urb 0xf50da380, rcv 0xf57fbbfc, buf 0xf57fbd3c
    cdc-acm.c: acm_rx_tasklet: sending urb 0xf50da400, rcv 0xf57fbbe8, buf 0xf57fbd28
    cdc-acm.c: acm_rx_tasklet: sending urb 0xf50da480, rcv 0xf57fbbd4, buf 0xf57fbd14
    cdc-acm.c: acm_rx_tasklet: sending urb 0xf50da900, rcv 0xf57fbbc0, buf 0xf57fbd00
    cdc-acm.c: acm_rx_tasklet: sending urb 0xf50da980, rcv 0xf57fbbac, buf 0xf57fbcec
    cdc-acm.c: acm_rx_tasklet: sending urb 0xf50daa00, rcv 0xf57fbb98, buf 0xf57fbcd8
    cdc-acm.c: acm_rx_tasklet: sending urb 0xf50daa80, rcv 0xf57fbb84, buf 0xf57fbcc4
    cdc-acm.c: acm_rx_tasklet: sending urb 0xf50dab00, rcv 0xf57fbb70, buf 0xf57fbcb0
    cdc-acm.c: acm_rx_tasklet: sending urb 0xf50dab80, rcv 0xf57fbb5c, buf 0xf57fbc9c
    cdc-acm.c: acm_rx_tasklet: sending urb 0xf50dac00, rcv 0xf57fbb48, buf 0xf57fbc88
    cdc-acm.c: acm_rx_tasklet: sending urb 0xf50dac80, rcv 0xf57fbb34, buf 0xf57fbc74
    cdc-acm.c: acm_rx_tasklet: sending urb 0xf50dad00, rcv 0xf57fbb20, buf 0xf57fbc60
    cdc-acm.c: acm_rx_tasklet: sending urb 0xf50dad80, rcv 0xf57fbb0c, buf 0xf57fbc4c
    cdc-acm.c: acm_rx_tasklet: sending urb 0xf50da880, rcv 0xf57fbaf8, buf 0xf57fbc38
    cdc-acm.c: Entering acm_tty_open.
    cdc-acm.c: acm_control_msg: rq: 0x22 val: 0x3 len: 0x0 result: 0
    cdc-acm.c: Entering acm_rx_tasklet
    cdc-acm.c: acm_rx_tasklet: sending urb 0xf50da280, rcv 0xf57fbc24, buf 0xf57fbd64
    cdc-acm.c: Entering acm_tty_write to write 3 bytes,
    cdc-acm.c: Get 3 bytes...
    cdc-acm.c: acm_write_start susp_count: 0
    cdc-acm.c: Entering acm_read_bulk with status 0
    ------------[ cut here ]------------
    WARNING: at /home/johan/src/linux/linux-2.6/lib/list_debug.c:57 list_del+0x10c/0x120()
    Hardware name: Vostro 1520
    list_del corruption. next->prev should be f57fbc10, but was f57fbaf8
    Modules linked in: cdc_acm
    Pid: 3, comm: ksoftirqd/0 Not tainted 2.6.37+ #39
    Call Trace:
    [] warn_slowpath_common+0x72/0xa0
    [] ? list_del+0x10c/0x120
    [] ? list_del+0x10c/0x120
    [] warn_slowpath_fmt+0x33/0x40
    [] list_del+0x10c/0x120
    [] acm_rx_tasklet+0xef/0x3e0 [cdc_acm]
    [] ? net_rps_action_and_irq_enable+0x6d/0x80
    [] tasklet_action+0xe6/0x140
    [] __do_softirq+0xaf/0x210
    [] ? __do_softirq+0x0/0x210
    [] ? run_ksoftirqd+0x8a/0x1c0
    [] ? run_ksoftirqd+0x0/0x1c0
    [] ? kthread+0x74/0x80
    [] ? kthread+0x0/0x80
    [] ? kernel_thread_helper+0x6/0x10
    ---[ end trace efd9a11434f0082e ]---
    ------------[ cut here ]------------
    WARNING: at /home/johan/src/linux/linux-2.6/lib/list_debug.c:57 list_del+0x10c/0x120()
    Hardware name: Vostro 1520
    list_del corruption. next->prev should be f57fbd50, but was f57fbdb0
    Modules linked in: cdc_acm
    Pid: 3, comm: ksoftirqd/0 Tainted: G W 2.6.37+ #39
    Call Trace:
    [] warn_slowpath_common+0x72/0xa0
    [] ? list_del+0x10c/0x120
    [] ? list_del+0x10c/0x120
    [] warn_slowpath_fmt+0x33/0x40
    [] list_del+0x10c/0x120
    [] acm_rx_tasklet+0x106/0x3e0 [cdc_acm]
    [] ? net_rps_action_and_irq_enable+0x6d/0x80
    [] tasklet_action+0xe6/0x140
    [] __do_softirq+0xaf/0x210
    [] ? __do_softirq+0x0/0x210
    [] ? run_ksoftirqd+0x8a/0x1c0
    [] ? run_ksoftirqd+0x0/0x1c0
    [] ? kthread+0x74/0x80
    [] ? kthread+0x0/0x80
    [] ? kernel_thread_helper+0x6/0x10
    ---[ end trace efd9a11434f0082f ]---
    cdc-acm.c: acm_rx_tasklet: sending urb 0xf50da300, rcv 0xf57fbc10, buf 0xf57fbd50
    cdc-acm.c: disconnected from network
    cdc-acm.c: acm_rx_tasklet: sending urb 0xf50da380, rcv 0xf57fbbfc, buf 0xf57fbd3c
    cdc-acm.c: Entering acm_rx_tasklet
    ------------[ cut here ]------------
    WARNING: at /home/johan/src/linux/linux-2.6/lib/list_debug.c:48 list_del+0xd5/0x120()
    Hardware name: Vostro 1520
    list_del corruption, next is LIST_POISON1 (00100100)
    Modules linked in: cdc_acm
    Pid: 3, comm: ksoftirqd/0 Tainted: G W 2.6.37+ #39
    Call Trace:
    [] warn_slowpath_common+0x72/0xa0
    [] ? list_del+0xd5/0x120
    [] ? list_del+0xd5/0x120
    [] warn_slowpath_fmt+0x33/0x40
    [] list_del+0xd5/0x120
    [] acm_rx_tasklet+0x2dc/0x3e0 [cdc_acm]
    [] ? trace_hardirqs_on+0xb/0x10
    [] ? tasklet_action+0x60/0x140
    [] tasklet_action+0xe6/0x140
    [] __do_softirq+0xaf/0x210
    [] ? __do_softirq+0x0/0x210
    [] ? run_ksoftirqd+0x8a/0x1c0
    [] ? run_ksoftirqd+0x0/0x1c0
    [] ? kthread+0x74/0x80
    [] ? kthread+0x0/0x80
    [] ? kernel_thread_helper+0x6/0x10
    ---[ end trace efd9a11434f00830 ]---
    BUG: unable to handle kernel paging request at 00200200
    IP: [] list_del+0x1d/0x120
    *pde = 00000000
    Oops: 0000 [#1] PREEMPT SMP
    last sysfs file: /sys/devices/pci0000:00/0000:00:1a.1/usb4/4-1/4-1:1.0/tty/ttyACM0/uevent
    Modules linked in: cdc_acm
    Pid: 3, comm: ksoftirqd/0 Tainted: G W 2.6.37+ #39 0T816J/Vostro 1520
    EIP: 0060:[] EFLAGS: 00010046 CPU: 0
    EIP is at list_del+0x1d/0x120
    EAX: f57fbd3c EBX: f57fb800 ECX: ffff8000 EDX: 00200200
    ESI: f57fbe90 EDI: f57fbd3c EBP: f600bf54 ESP: f600bf3c
    DS: 007b ES: 007b FS: 00d8 GS: 0000 SS: 0068
    Process ksoftirqd/0 (pid: 3, ti=f600a000 task=f60791c0 task.ti=f6082000)
    Stack:
    c1527e84 00000030 c1527e54 00100100 f57fb800 f57fbd3c f600bf98 f8051fac
    f8053104 f8052b94 f600bf6c c106dbab f600bf80 00000286 f60791c0 c1042b30
    f57fbda8 f57f5800 f57fbdb0 f57fbd80 f57fbe7c c1656b04 00000000 f600bfb0
    Call Trace:
    [] ? acm_rx_tasklet+0x2dc/0x3e0 [cdc_acm]
    [] ? trace_hardirqs_on+0xb/0x10
    [] ? tasklet_action+0x60/0x140
    [] ? tasklet_action+0xe6/0x140
    [] ? __do_softirq+0xaf/0x210
    [] ? __do_softirq+0x0/0x210

    [] ? run_ksoftirqd+0x8a/0x1c0
    [] ? run_ksoftirqd+0x0/0x1c0
    [] ? kthread+0x74/0x80
    [] ? kthread+0x0/0x80
    [] ? kernel_thread_helper+0x6/0x10
    Code: ff 48 14 e9 57 ff ff ff 90 90 90 90 90 90 55 89 e5 83 ec 18 81 38 00 01 10 00 0f 84 9c 00 00 00 8b 50 04 81 fa 00 02 20 00 74 33 12 39 d0 75 5c 8b 10 8b 4a 04 39 c8 0f 85 b5 00 00 00 8b 48
    EIP: [] list_del+0x1d/0x120 SS:ESP 0068:f600bf3c
    CR2: 0000000000200200
    ---[ end trace efd9a11434f00831 ]---
    Kernel panic - not syncing: Fatal exception in interrupt
    Pid: 3, comm: ksoftirqd/0 Tainted: G D W 2.6.37+ #39
    Call Trace:
    [] ? printk+0x1d/0x24
    [] panic+0x66/0x15c
    [] oops_end+0x8f/0x90
    [] no_context+0xc6/0x160
    [] __bad_area_nosemaphore+0x98/0x140
    [] ? release_console_sem+0x1d8/0x210
    [] bad_area_nosemaphore+0x17/0x20
    [] do_page_fault+0x279/0x420
    [] ? show_trace+0x1f/0x30
    [] ? printk+0x1d/0x24
    [] ? do_page_fault+0x0/0x420
    [] error_code+0x5f/0x64
    [] ? select_task_rq_fair+0x37b/0x6a0
    [] ? do_page_fault+0x0/0x420
    [] ? list_del+0x1d/0x120
    [] acm_rx_tasklet+0x2dc/0x3e0 [cdc_acm]
    [] ? trace_hardirqs_on+0xb/0x10
    [] ? tasklet_action+0x60/0x140
    [] tasklet_action+0xe6/0x140
    [] __do_softirq+0xaf/0x210
    [] ? __do_softirq+0x0/0x210
    [] ? run_ksoftirqd+0x8a/0x1c0
    [] ? run_ksoftirqd+0x0/0x1c0
    [] ? kthread+0x74/0x80
    [] ? kthread+0x0/0x80
    [] ? kernel_thread_helper+0x6/0x10
    panic occurred, switching back to text console
    ------------[ cut here ]------------

    Signed-off-by: Johan Hovold
    Signed-off-by: Greg Kroah-Hartman

    Johan Hovold
     
  • commit adaa3c6342b249548ea830fe8e02aa5b45be8688 upstream.

    My testprog do a lot of bitbang - after hours i got following warning and my machine lockups:
    WARNING: at /build/buildd/linux-2.6.38/lib/kref.c:34
    After debugging uss720 driver i discovered that the completion callback was called before
    usb_submit_urb returns. The callback frees the request structure that is krefed on return by
    usb_submit_urb.

    Signed-off-by: Peter Holik
    Acked-by: Thomas Sailer
    Signed-off-by: Greg Kroah-Hartman

    Peter Holik
     
  • commit b5a3b3d985493c173925907adfebf3edab236fe7 upstream.

    This patch (as1453) fixes a long-standing bug in the ehci-hcd driver.

    There is no need to set the Halt bit in the overlay region for an
    unlinked or blocked QH. Contrary to what the comment says, setting
    the Halt bit does not cause the QH to be patched later; that decision
    (made in qh_refresh()) depends only on whether the QH is currently
    pointing to a valid qTD. Likewise, setting the Halt bit does not
    prevent completions from activating the QH while it is "stopped"; they
    are prevented by the fact that qh_completions() temporarily changes
    qh->qh_state to QH_STATE_COMPLETING.

    On the other hand, there are circumstances in which the QH will be
    reactivated _without_ being patched; this happens after an URB beyond
    the head of the queue is unlinked. Setting the Halt bit will then
    cause the hardware to see the QH with both the Active and Halt bits
    set, an invalid combination that will prevent the queue from
    advancing and may even crash some controllers.

    Apparently the only reason this hasn't been reported before is that
    unlinking URBs from the middle of a running queue is quite uncommon.
    However Test 17, recently added to the usbtest driver, does exactly
    this, and it confirms the presence of the bug.

    In short, there is no reason to set the Halt bit for an unlinked or
    blocked QH, and there is a very good reason not to set it. Therefore
    the code that sets it is removed.

    Signed-off-by: Alan Stern
    Tested-by: Andiry Xu
    CC: David Brownell
    Signed-off-by: Greg Kroah-Hartman

    Alan Stern
     
  • commit 38a66824d96de8aeeb915e6f46f0d3fe55828eb1 upstream.

    The scheme used to index format in uvc_fixup_video_ctrl() is not robust:
    format index is based on descriptor ordering, which does not necessarily
    match bFormatIndex ordering. Searching for first matching format will
    prevent uvc_fixup_video_ctrl() from using the wrong format/frame to make
    adjustments.

    Signed-off-by: Stephan Lachowsky
    Signed-off-by: Mauro Carvalho Chehab
    Signed-off-by: Greg Kroah-Hartman

    Stephan Lachowsky
     
  • commit 5a02ab7c3c4580f94d13c683721039855b67cda6 upstream.

    We must not use dummy for index.
    After the first index, READ32(dummy) will change dummy!!!!

    Signed-off-by: Mi Jinlong
    [bfields@redhat.com: Trond points out READ_BUF alone is sufficient.]
    Signed-off-by: J. Bruce Fields
    Signed-off-by: Greg Kroah-Hartman

    Mi Jinlong
     
  • commit 5ece3cafbd88d4da5c734e1810c4a2e6474b57b2 upstream.

    The members of nfsd4_op_flags, (ALLOWED_WITHOUT_FH | ALLOWED_ON_ABSENT_FS)
    equals to ALLOWED_AS_FIRST_OP, maybe that's not what we want.

    OP_PUTROOTFH with op_flags = ALLOWED_WITHOUT_FH | ALLOWED_ON_ABSENT_FS,
    can't appears as the first operation with out SEQUENCE ops.

    This patch modify the wrong value of ALLOWED_WITHOUT_FH etc which
    was introduced by f9bb94c4.

    Reviewed-by: Benny Halevy
    Signed-off-by: Mi Jinlong
    Signed-off-by: J. Bruce Fields
    Signed-off-by: Greg Kroah-Hartman

    Mi Jinlong
     
  • commit d6244bc0ed0c52a795e6f4dcab3886daf3e74fac upstream.

    Use mask 0x10 for "soft cursor" detection on in function tile_cursor.
    (Tile Blitting Operation in framebuffer console).

    The old mask 0x01 for vc_cursor_type detects CUR_NONE, CUR_LOWER_THIRD
    and every second mode value as "software cursor". This hides the cursor
    for these modes (cursor.mode = 0). But, only CUR_NONE or "software cursor"
    should hide the cursor.
    See also 0x10 in functions add_softcursor, bit_cursor and cw_cursor.

    Signed-off-by: Henry Nestler
    Signed-off-by: Paul Mundt
    Signed-off-by: Greg Kroah-Hartman

    Henry Nestler
     
  • commit 5883f57ca0008ffc93e09cbb9847a1928e50c6f3 upstream.

    While mm->start_stack was protected from cross-uid viewing (commit
    f83ce3e6b02d5 ("proc: avoid information leaks to non-privileged
    processes")), the start_code and end_code values were not. This would
    allow the text location of a PIE binary to leak, defeating ASLR.

    Note that the value "1" is used instead of "0" for a protected value since
    "ps", "killall", and likely other readers of /proc/pid/stat, take
    start_code of "0" to mean a kernel thread and will misbehave. Thanks to
    Brad Spengler for pointing this out.

    Addresses CVE-2011-0726

    Signed-off-by: Kees Cook
    Cc: Alexey Dobriyan
    Cc: David Howells
    Cc: Eugene Teo
    Cc: Martin Schwidefsky
    Cc: Brad Spengler
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds
    Signed-off-by: Greg Kroah-Hartman

    Kees Cook
     
  • commit 0db0c01b53a1a421513f91573241aabafb87802a upstream.

    The current code fails to print the "[heap]" marking if the heap is split
    into multiple mappings.

    Fix the check so that the marking is displayed in all possible cases:
    1. vma matches exactly the heap
    2. the heap vma is merged e.g. with bss
    3. the heap vma is splitted e.g. due to locked pages

    Test cases. In all cases, the process should have mapping(s) with
    [heap] marking:

    (1) vma matches exactly the heap

    #include
    #include
    #include

    int main (void)
    {
    if (sbrk(4096) != (void *)-1) {
    printf("check /proc/%d/maps\n", (int)getpid());
    while (1)
    sleep(1);
    }
    return 0;
    }

    # ./test1
    check /proc/553/maps
    [1] + Stopped ./test1
    # cat /proc/553/maps | head -4
    00008000-00009000 r-xp 00000000 01:00 3113640 /test1
    00010000-00011000 rw-p 00000000 01:00 3113640 /test1
    00011000-00012000 rw-p 00000000 00:00 0 [heap]
    4006f000-40070000 rw-p 00000000 00:00 0

    (2) the heap vma is merged

    #include
    #include
    #include

    char foo[4096] = "foo";
    char bar[4096];

    int main (void)
    {
    if (sbrk(4096) != (void *)-1) {
    printf("check /proc/%d/maps\n", (int)getpid());
    while (1)
    sleep(1);
    }
    return 0;
    }

    # ./test2
    check /proc/556/maps
    [2] + Stopped ./test2
    # cat /proc/556/maps | head -4
    00008000-00009000 r-xp 00000000 01:00 3116312 /test2
    00010000-00012000 rw-p 00000000 01:00 3116312 /test2
    00012000-00014000 rw-p 00000000 00:00 0 [heap]
    4004a000-4004b000 rw-p 00000000 00:00 0

    (3) the heap vma is splitted (this fails without the patch)

    #include
    #include
    #include
    #include

    int main (void)
    {
    if ((sbrk(4096) != (void *)-1) && !mlockall(MCL_FUTURE) &&
    (sbrk(4096) != (void *)-1)) {
    printf("check /proc/%d/maps\n", (int)getpid());
    while (1)
    sleep(1);
    }
    return 0;
    }

    # ./test3
    check /proc/559/maps
    [1] + Stopped ./test3
    # cat /proc/559/maps|head -4
    00008000-00009000 r-xp 00000000 01:00 3119108 /test3
    00010000-00011000 rw-p 00000000 01:00 3119108 /test3
    00011000-00012000 rw-p 00000000 00:00 0 [heap]
    00012000-00013000 rw-p 00000000 00:00 0 [heap]

    It looks like the bug has been there forever, and since it only results in
    some information missing from a procfile, it does not fulfil the -stable
    "critical issue" criteria.

    Signed-off-by: Aaro Koskinen
    Reviewed-by: KOSAKI Motohiro
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds
    Signed-off-by: Greg Kroah-Hartman

    Aaro Koskinen
     
  • commit ce654b37f87980d95f339080e4c3bdb2370bdf22 upstream.

    Orphan cleanup is currently executed even if the file system has some
    number of unknown ROCOMPAT features, which deletes inodes and frees
    blocks, which could be very bad for some RO_COMPAT features.

    This patch skips the orphan cleanup if it contains readonly compatible
    features not known by this ext3 implementation, which would prevent
    the fs from being mounted (or remounted) readwrite.

    Signed-off-by: Amir Goldstein
    Signed-off-by: Jan Kara
    Signed-off-by: Greg Kroah-Hartman

    Amir Goldstein
     
  • commit da48524eb20662618854bb3df2db01fc65f3070c upstream.

    Userland should be able to trust the pid and uid of the sender of a
    signal if the si_code is SI_TKILL.

    Unfortunately, the kernel has historically allowed sigqueueinfo() to
    send any si_code at all (as long as it was negative - to distinguish it
    from kernel-generated signals like SIGILL etc), so it could spoof a
    SI_TKILL with incorrect siginfo values.

    Happily, it looks like glibc has always set si_code to the appropriate
    SI_QUEUE, so there are probably no actual user code that ever uses
    anything but the appropriate SI_QUEUE flag.

    So just tighten the check for si_code (we used to allow any negative
    value), and add a (one-time) warning in case there are binaries out
    there that might depend on using other si_code values.

    Signed-off-by: Julien Tinnes
    Acked-by: Oleg Nesterov
    Signed-off-by: Linus Torvalds
    Signed-off-by: Greg Kroah-Hartman

    Julien Tinnes
     
  • commit 447c5dd7338638f526e9bcf7dcf69b4da5835c7d upstream.

    A successful write() to the "reset" sysfs attribute should return the
    number of bytes written, not 0. Otherwise userspace (bash) retries the
    write over and over again.

    Acked-by: Michael S. Tsirkin
    Acked-by: Greg Kroah-Hartman
    Signed-off-by: Michal Schmidt
    Signed-off-by: Jesse Barnes
    Signed-off-by: Greg Kroah-Hartman

    Michal Schmidt
     
  • commit e5f15b45ddf3afa2bbbb10c7ea34fb32b6de0a0e upstream.

    Now cleanup_highmap actually is in two steps: one is early in head64.c
    and only clears above _end; a second one is in init_memory_mapping() and
    tries to clean from _brk_end to _end.
    It should check if those boundaries are PMD_SIZE aligned but currently
    does not.
    Also init_memory_mapping() is called several times for numa or memory
    hotplug, so we really should not handle initial kernel mappings there.

    This patch moves cleanup_highmap() down after _brk_end is settled so
    we can do everything in one step.
    Also we honor max_pfn_mapped in the implementation of cleanup_highmap.

    Signed-off-by: Yinghai Lu
    Signed-off-by: Stefano Stabellini
    LKML-Reference:
    Signed-off-by: H. Peter Anvin
    Signed-off-by: Greg Kroah-Hartman

    Yinghai Lu
     
  • commit 14988a4d350ce3b41ecad4f63c4f44c56f5ae34d upstream.

    Do not set max_pfn_mapped to the end of the initial memory mappings,
    that also contain pages that don't belong in pfn space (like the mfn
    list).

    Set max_pfn_mapped to the last real pfn mapped in the initial memory
    mappings that is the pfn backing _end.

    Signed-off-by: Stefano Stabellini
    Acked-by: Konrad Rzeszutek Wilk
    LKML-Reference:
    Signed-off-by: H. Peter Anvin
    Signed-off-by: Greg Kroah-Hartman

    Stefano Stabellini
     
  • commit 47e9037ac16637cd7f12b8790ea7ce6680e42168 upstream.

    If a device doesn't support power management (pm_cap == 0) but it is
    acpi_pci_power_manageable() because there is a _PS0 method declared for
    it and _EJ0 is also declared for the slot then nobody is going to set
    current_state = PCI_D0 for this device. This is what I think it is
    happening:

    pci_enable_device
    |
    __pci_enable_device_flags
    /* here we do not set current_state because !pm_cap */
    |
    do_pci_enable_device
    |
    pci_set_power_state
    |
    __pci_start_power_transition
    |
    pci_platform_power_transition
    /* platform_pci_power_manageable() calls acpi_pci_power_manageable that
    * returns true */
    |
    platform_pci_set_power_state
    /* acpi_pci_set_power_state gets called and does nothing because the
    * acpi device has _EJ0, see the comment "If the ACPI device has _EJ0,
    * ignore the device" */

    at this point if we refer to the commit message that introduced the
    comment above (10b3dcae0f275e2546e55303d64ddbb58cec7599), it is up to
    the hotplug driver to set the state to D0.
    However AFAICT the pci hotplug driver never does, in fact
    drivers/pci/hotplug/acpiphp_glue.c:register_slot sets the slot flags to
    (SLOT_ENABLED | SLOT_POWEREDON) but it does not set the pci device
    current state to PCI_D0.

    So my proposed fix is also to set current_state = PCI_D0 in
    register_slot.
    Comments are very welcome.

    Signed-off-by: Stefano Stabellini
    Signed-off-by: Jesse Barnes
    Signed-off-by: Greg Kroah-Hartman

    Stefano Stabellini
     
  • commit bee4c36a5cf5c9f63ce1d7372aa62045fbd16d47 upstream.

    Up to 2.6.22, you could use remap_file_pages(2) on a tmpfs file or a
    shared mapping of /dev/zero or a shared anonymous mapping. In 2.6.23 we
    disabled it by default, but set VM_CAN_NONLINEAR to enable it on safe
    mappings. We made sure to set it in shmem_mmap() for tmpfs files, but
    missed it in shmem_zero_setup() for the others. Fix that at last.

    Reported-by: Kenny Simpson
    Signed-off-by: Hugh Dickins
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds
    Signed-off-by: Greg Kroah-Hartman

    Hugh Dickins
     
  • commit e91f90bb0bb10be9cc8efd09a3cf4ecffcad0db1 upstream.

    The test program below will hang because io_getevents() uses
    add_wait_queue_exclusive(), which means the wake_up() in io_destroy() only
    wakes up one of the threads. Fix this by using wake_up_all() in the aio
    code paths where we want to make sure no one gets stuck.

    // t.c -- compile with gcc -lpthread -laio t.c

    #include
    #include
    #include
    #include

    static const int nthr = 2;

    void *getev(void *ctx)
    {
    struct io_event ev;
    io_getevents(ctx, 1, 1, &ev, NULL);
    printf("io_getevents returned\n");
    return NULL;
    }

    int main(int argc, char *argv[])
    {
    io_context_t ctx = 0;
    pthread_t thread[nthr];
    int i;

    io_setup(1024, &ctx);

    for (i = 0; i < nthr; ++i)
    pthread_create(&thread[i], NULL, getev, ctx);

    sleep(1);

    io_destroy(ctx);

    for (i = 0; i < nthr; ++i)
    pthread_join(thread[i], NULL);

    return 0;
    }

    Signed-off-by: Roland Dreier
    Reviewed-by: Jeff Moyer
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds
    Signed-off-by: Greg Kroah-Hartman

    Roland Dreier
     

24 Mar, 2011

16 commits

  • Greg Kroah-Hartman
     
  • This reverts commit 6f197b73304b3bd3d5a43b931383a5331d6b2987, which was
    originally commit a0f7d0f7fc02465bb9758501f611f63381792996 upstream.

    This breaks the build, thanks to Jiri Slaby for pointing this out.

    Reported-by: Jiri Slaby
    Cc: Frederic Weisbecker
    Signed-off-by: Greg Kroah-Hartman

    Greg Kroah-Hartman
     
  • Greg Kroah-Hartman
     
  • commit ccd32e735de7a941906e093f8dca924bb05c5794 upstream.

    An integer overflow occurs in the calculation of RHlinear when the
    relative humidity is greater than around 30%. The consequence is a subtle
    (but noticeable) error in the resulting humidity measurement.

    Signed-off-by: Vivien Didelot
    Signed-off-by: Jean Delvare
    Cc: Jonathan Cameron
    Signed-off-by: Greg Kroah-Hartman

    Vivien Didelot
     
  • commit 371c394af27ab7d1e58a66bc19d9f1f3ac1f67b4 upstream.

    The latest binutils (2.21.0.20110302/Ubuntu) breaks the build
    yet another time, under CONFIG_XEN=y due to a .size directive that
    refers to a slightly differently named (hence, to the now very
    strict and unforgiving assembler, non-existent) symbol.

    [ mingo:

    This unnecessary build breakage caused by new binutils
    version 2.21 gets escallated back several kernel releases spanning
    several years of Linux history, affecting over 130,000 upstream
    kernel commits (!), on CONFIG_XEN=y 64-bit kernels (i.e. essentially
    affecting all major Linux distro kernel configs).

    Git annotate tells us that this slight debug symbol code mismatch
    bug has been introduced in 2008 in commit 3d75e1b8:

    3d75e1b8 (Jeremy Fitzhardinge 2008-07-08 15:06:49 -0700 1231) ENTRY(xen_do_hypervisor_callback) # do_hypervisor_callback(struct *pt_regs)

    The 'bug' is just a slight assymetry in ENTRY()/END()
    debug-symbols sequences, with lots of assembly code between the
    ENTRY() and the END():

    ENTRY(xen_do_hypervisor_callback) # do_hypervisor_callback(struct *pt_regs)
    ...
    END(do_hypervisor_callback)

    Human reviewers almost never catch such small mismatches, and binutils
    never even warned about it either.

    This new binutils version thus breaks the Xen build on all upstream kernels
    since v2.6.27, out of the blue.

    This makes a straightforward Git bisection of all 64-bit Xen-enabled kernels
    impossible on such binutils, for a bisection window of over hundred
    thousand historic commits. (!)

    This is a major fail on the side of binutils and binutils needs to turn
    this show-stopper build failure into a warning ASAP. ]

    Signed-off-by: Alexander van Heukelum
    Cc: Jeremy Fitzhardinge
    Cc: Jan Beulich
    Cc: H.J. Lu
    Cc: Linus Torvalds
    Cc: Andrew Morton
    Cc: "H. Peter Anvin"
    Cc: Kees Cook
    LKML-Reference:
    Signed-off-by: Ingo Molnar
    Signed-off-by: Greg Kroah-Hartman

    Alexander van Heukelum
     
  • commit bd2b64a12bf55bec0d1b949e3dca3f8863409646 upstream.

    When trying to flash a machine via the update_flash command, Anton received the
    following error:

    Restarting system.
    FLASH: kernel bug...flash list header addr above 4GB

    The code in question has a comment that the flash list should be in
    the kernel data and therefore under 4GB:

    /* NOTE: the "first" block list is a global var with no data
    * blocks in the kernel data segment. We do this because
    * we want to ensure this block_list addr is under 4GB.
    */

    Unfortunately the Kconfig option is marked tristate which means the variable
    may not be in the kernel data and could be above 4GB.

    Instead of relying on the data segment being below 4GB, use the static
    data buffer allocated by the kernel for use by rtas. Since we don't
    use the header struct directly anymore, convert it to a simple pointer.

    Reported-By: Anton Blanchard
    Signed-Off-By: Milton Miller
    Tested-By: Anton Blanchard
    Signed-off-by: Benjamin Herrenschmidt
    Signed-off-by: Kamalesh Babulal
    Signed-off-by: Greg Kroah-Hartman

    Milton Miller
     
  • commit 60adec6226bbcf061d4c2d10944fced209d1847d upstream.

    When we are crashing, the crashing/primary CPU IPIs the secondaries to
    turn off IRQs, go into real mode and wait in kexec_wait. While this
    is happening, the primary tears down all the MMU maps. Unfortunately
    the primary doesn't check to make sure the secondaries have entered
    real mode before doing this.

    On PHYP machines, the secondaries can take a long time shutting down
    the IRQ controller as RTAS calls are need. These RTAS calls need to
    be serialised which resilts in the secondaries contending in
    lock_rtas() and hence taking a long time to shut down.

    We've hit this on large POWER7 machines, where some secondaries are
    still waiting in lock_rtas(), when the primary tears down the HPTEs.

    This patch makes sure all secondaries are in real mode before the
    primary tears down the MMU. It uses the new kexec_state entry in the
    paca. It times out if the secondaries don't reach real mode after
    10sec.

    Signed-off-by: Michael Neuling
    Signed-off-by: Benjamin Herrenschmidt
    Signed-off-by: Kamalesh Babulal
    cc: Anton Blanchard
    Signed-off-by: Greg Kroah-Hartman

    Michael Neuling
     
  • commit 1fc711f7ffb01089efc58042cfdbac8573d1b59a upstream.

    In kexec_prepare_cpus, the primary CPU IPIs the secondary CPUs to
    kexec_smp_down(). kexec_smp_down() calls kexec_smp_wait() which sets
    the hw_cpu_id() to -1. The primary does this while leaving IRQs on
    which means the primary can take a timer interrupt which can lead to
    the IPIing one of the secondary CPUs (say, for a scheduler re-balance)
    but since the secondary CPU now has a hw_cpu_id = -1, we IPI CPU
    -1... Kaboom!

    We are hitting this case regularly on POWER7 machines.

    There is also a second race, where the primary will tear down the MMU
    mappings before knowing the secondaries have entered real mode.

    Also, the secondaries are clearing out any pending IPIs before
    guaranteeing that no more will be received.

    This changes kexec_prepare_cpus() so that we turn off IRQs in the
    primary CPU much earlier. It adds a paca flag to say that the
    secondaries have entered the kexec_smp_down() IPI and turned off IRQs,
    rather than overloading hw_cpu_id with -1. This new paca flag is
    again used to in indicate when the secondaries has entered real mode.

    It also ensures that all CPUs have their IRQs off before we clear out
    any pending IPI requests (in kexec_cpu_down()) to ensure there are no
    trailing IPIs left unacknowledged.

    Signed-off-by: Michael Neuling
    Signed-off-by: Greg Kroah-Hartman
    Signed-off-by: Kamalesh Babulal
    cc: Anton Blanchard
    Signed-off-by: Benjamin Herrenschmidt

    Michael Neuling
     
  • commit 0aab3995485b8a994bf29a995a008c9ea4a28054 upstream.

    During redetection of a SDIO card, a request for a new card RCA
    was submitted to the card, but was then overwritten by the old RCA.
    This caused the card to be deselected instead of selected when using
    the incorrect RCA. This bug's been present since the "oldcard"
    handling was introduced in 2.6.32.

    Signed-off-by: Stefan Nilsson XK
    Reviewed-by: Ulf Hansson
    Reviewed-by: Pawel Wieczorkiewicz
    Signed-off-by: Linus Walleij
    Signed-off-by: Chris Ball
    Signed-off-by: Greg Kroah-Hartman

    Stefan Nilsson XK
     
  • commit 6ced9e6b3901af4ab6ac0a11231402c888286ea6 upstream.

    The struct i2c_board_info member holding the name is "type", not
    "name".

    Signed-off-by: Roman Fietze
    Signed-off-by: Jean Delvare
    Signed-off-by: Greg Kroah-Hartman

    Roman Fietze
     
  • commit 9804c9eaeacfe78651052c5ddff31099f60ef78c upstream.

    The CHECK_IRQ_PER_CPU is wrong, it should be checking
    irq_to_desc(irq)->status not just irq.

    Signed-off-by: Thomas Gleixner
    Signed-off-by: James Bottomley
    Signed-off-by: Greg Kroah-Hartman

    Thomas Gleixner
     
  • commit 723aae25d5cdb09962901d36d526b44d4be1051c upstream.

    Mike Galbraith reported finding a lockup ("perma-spin bug") where the
    cpumask passed to smp_call_function_many was cleared by other cpu(s)
    while a cpu was preparing its call_data block, resulting in no cpu to
    clear the last ref and unlock the block.

    Having cpus clear their bit asynchronously could be useful on a mask of
    cpus that might have a translation context, or cpus that need a push to
    complete an rcu window.

    Instead of adding a BUG_ON and requiring yet another cpumask copy, just
    detect the race and handle it.

    Note: arch_send_call_function_ipi_mask must still handle an empty
    cpumask because the data block is globally visible before the that arch
    callback is made. And (obviously) there are no guarantees to which cpus
    are notified if the mask is changed during the call; only cpus that were
    online and had their mask bit set during the whole call are guaranteed
    to be called.

    Reported-by: Mike Galbraith
    Reported-by: Jan Beulich
    Acked-by: Jan Beulich
    Signed-off-by: Milton Miller
    Signed-off-by: Linus Torvalds
    Signed-off-by: Greg Kroah-Hartman

    Milton Miller
     
  • commit bc10f96757bd6ab3721510df8defa8f21c32f974 upstream.

    Remove the call to tty_ldisc_flush() from the RESULT_NO_CARRIER
    branch of isdn_tty_modem_result(), as already proposed in commit
    00409bb045887ec5e7b9e351bc080c38ab6bfd33.
    This avoids a "sleeping function called from invalid context" BUG
    when the hardware driver calls the statcallb() callback with
    command==ISDN_STAT_DHUP in atomic context, which in turn calls
    isdn_tty_modem_result(RESULT_NO_CARRIER, ~), and from there,
    tty_ldisc_flush() which may sleep.

    Signed-off-by: Tilman Schmidt
    Signed-off-by: David S. Miller
    Signed-off-by: Greg Kroah-Hartman

    Tilman Schmidt
     
  • commit 4981d01eada5354d81c8929d5b2836829ba3df7b upstream.

    According to intel CPU manual, every time PGD entry is changed in i386 PAE
    mode, we need do a full TLB flush. Current code follows this and there is
    comment for this too in the code.

    But current code misses the multi-threaded case. A changed page table
    might be used by several CPUs, every such CPU should flush TLB. Usually
    this isn't a problem, because we prepopulate all PGD entries at process
    fork. But when the process does munmap and follows new mmap, this issue
    will be triggered.

    When it happens, some CPUs keep doing page faults:

    http://marc.info/?l=linux-kernel&m=129915020508238&w=2

    Reported-by: Yasunori Goto
    Tested-by: Yasunori Goto
    Reviewed-by: Rik van Riel
    Signed-off-by: Shaohua Li
    Cc: Mallick Asit K
    Cc: Linus Torvalds
    Cc: Andrew Morton
    Cc: linux-mm
    LKML-Reference:
    Signed-off-by: Ingo Molnar
    Signed-off-by: Greg Kroah-Hartman

    Shaohua Li
     
  • commit 45a5791920ae643eafc02e2eedef1a58e341b736 upstream.

    Paul McKenney's review pointed out two problems with the barriers in the
    2.6.38 update to the smp call function many code.

    First, a barrier that would force the func and info members of data to
    be visible before their consumption in the interrupt handler was
    missing. This can be solved by adding a smp_wmb between setting the
    func and info members and setting setting the cpumask; this will pair
    with the existing and required smp_rmb ordering the cpumask read before
    the read of refs. This placement avoids the need a second smp_rmb in
    the interrupt handler which would be executed on each of the N cpus
    executing the call request. (I was thinking this barrier was present
    but was not).

    Second, the previous write to refs (establishing the zero that we the
    interrupt handler was testing from all cpus) was performed by a third
    party cpu. This would invoke transitivity which, as a recient or
    concurrent addition to memory-barriers.txt now explicitly states, would
    require a full smp_mb().

    However, we know the cpumask will only be set by one cpu (the data
    owner) and any preivous iteration of the mask would have cleared by the
    reading cpu. By redundantly writing refs to 0 on the owning cpu before
    the smp_wmb, the write to refs will follow the same path as the writes
    that set the cpumask, which in turn allows us to keep the barrier in the
    interrupt handler a smp_rmb instead of promoting it to a smp_mb (which
    will be be executed by N cpus for each of the possible M elements on the
    list).

    I moved and expanded the comment about our (ab)use of the rcu list
    primitives for the concurrent walk earlier into this function. I
    considered moving the first two paragraphs to the queue list head and
    lock, but felt it would have been too disconected from the code.

    Cc: Paul McKinney
    Signed-off-by: Milton Miller
    Signed-off-by: Linus Torvalds
    Signed-off-by: Greg Kroah-Hartman

    Milton Miller
     
  • commit e6cd1e07a185d5f9b0aa75e020df02d3c1c44940 upstream.

    Peter pointed out there was nothing preventing the list_del_rcu in
    smp_call_function_interrupt from running before the list_add_rcu in
    smp_call_function_many.

    Fix this by not setting refs until we have gotten the lock for the list.
    Take advantage of the wmb in list_add_rcu to save an explicit additional
    one.

    I tried to force this race with a udelay before the lock & list_add and
    by mixing all 64 online cpus with just 3 random cpus in the mask, but
    was unsuccessful. Still, inspection shows a valid race, and the fix is
    a extension of the existing protection window in the current code.

    Reported-by: Peter Zijlstra
    Signed-off-by: Milton Miller
    Signed-off-by: Linus Torvalds
    Signed-off-by: Greg Kroah-Hartman

    Milton Miller