21 Nov, 2008

2 commits

  • Fix a regression reported by Max Kellermann whereby kernel profiling
    showed that his clients were spending 45% of their time in
    rpcauth_lookup_credcache.

    It turns out that although his processes had identical uid/gid/groups,
    generic_match() was failing to detect this, because the task->group_info
    pointers were not shared. This again lead to the creation of a huge number
    of identical credentials at the RPC layer.

    The regression is fixed by comparing the contents of task->group_info
    if the actual pointers are not identical.

    Signed-off-by: Trond Myklebust
    Signed-off-by: Linus Torvalds

    Trond Myklebust
     
  • * git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6: (23 commits)
    net: fix tiny output corruption of /proc/net/snmp6
    atl2: don't request irq on resume if netif running
    ipv6: use seq_release_private for ip6mr.c /proc entries
    pkt_sched: fix missing check for packet overrun in qdisc_dump_stab()
    smc911x: Fix printf format typo in smc911x driver.
    asix: Fix asix-based cards connecting to 10/100Mbs LAN.
    mv643xx_eth: fix recycle check bound
    mv643xx_eth: fix the order of mdiobus_{unregister, free}() calls
    sh: sh_eth: Update to change of mii_bus
    TPROXY: supply a struct flowi->flags argument in inet_sk_rebuild_header()
    TPROXY: fill struct flowi->flags in udp_sendmsg()
    net: ipg.c fix bracing on endian swapping
    phylib: Fix auto-negotiation restart avoidance
    net: jme.c rxdesc.flags is __le16, other missing endian swaps
    phylib: fix phy name example in documentation
    net: Do not fire linkwatch events until the device is registered.
    phonet: fix compilation with gcc-3.4
    ixgbe: fix compilation with gcc-3.4
    pktgen: fix multiple queue warning
    net: fix ip_mr_init() error path
    ...

    Linus Torvalds
     

20 Nov, 2008

11 commits

  • Because "name" is static, it can be occasionally be filled with
    somewhat garbage if two processes read /proc/net/snmp6.

    Also, remove useless casts and "-1" -- snprintf() correctly terminates it's
    output.

    Signed-off-by: Alexey Dobriyan
    Signed-off-by: David S. Miller

    Alexey Dobriyan
     
  • In ip6mr.c, /proc entries /proc/net/ip6_mr_cache and /proc/net/ip6_mr_vif
    are opened with seq_open_private(), thus seq_release_private() should be
    used to release them.
    Should fix a small memory leak.

    Signed-off-by: Benjamin Thery
    Signed-off-by: David S. Miller

    Benjamin Thery
     
  • nla_nest_start() might return NULL, causing a NULL pointer dereference.

    Signed-off-by: Patrick McHardy
    Signed-off-by: David S. Miller

    Patrick McHardy
     
  • David S. Miller
     
  • inet_sk_rebuild_header() does a new route lookup if the dst_entry
    associated with a socket becomes stale. However inet_sk_rebuild_header()
    didn't use struct flowi->flags, causing the route lookup to
    fail for foreign-bound IP_TRANSPARENT sockets, causing an error
    state to be set for the sockets in question.

    Signed-off-by: Balazs Scheidler
    Signed-off-by: David S. Miller

    Balazs Scheidler
     
  • udp_sendmsg() didn't fill struct flowi->flags, which means that
    the route lookup would fail for non-local IPs even if the
    IP_TRANSPARENT sockopt was set.

    This prevents sendto() to work properly for UDP sockets, whereas
    bind(foreign-ip) + connect() + send() worked fine.

    Signed-off-by: Balazs Scheidler
    Signed-off-by: David S. Miller

    Balazs Scheidler
     
  • Introduce a new accept4() system call. The addition of this system call
    matches analogous changes in 2.6.27 (dup3(), evenfd2(), signalfd4(),
    inotify_init1(), epoll_create1(), pipe2()) which added new system calls
    that differed from analogous traditional system calls in adding a flags
    argument that can be used to access additional functionality.

    The accept4() system call is exactly the same as accept(), except that
    it adds a flags bit-mask argument. Two flags are initially implemented.
    (Most of the new system calls in 2.6.27 also had both of these flags.)

    SOCK_CLOEXEC causes the close-on-exec (FD_CLOEXEC) flag to be enabled
    for the new file descriptor returned by accept4(). This is a useful
    security feature to avoid leaking information in a multithreaded
    program where one thread is doing an accept() at the same time as
    another thread is doing a fork() plus exec(). More details here:
    http://udrepper.livejournal.com/20407.html "Secure File Descriptor Handling",
    Ulrich Drepper).

    The other flag is SOCK_NONBLOCK, which causes the O_NONBLOCK flag
    to be enabled on the new open file description created by accept4().
    (This flag is merely a convenience, saving the use of additional calls
    fcntl(F_GETFL) and fcntl (F_SETFL) to achieve the same result.

    Here's a test program. Works on x86-32. Should work on x86-64, but
    I (mtk) don't have a system to hand to test with.

    It tests accept4() with each of the four possible combinations of
    SOCK_CLOEXEC and SOCK_NONBLOCK set/clear in 'flags', and verifies
    that the appropriate flags are set on the file descriptor/open file
    description returned by accept4().

    I tested Ulrich's patch in this thread by applying against 2.6.28-rc2,
    and it passes according to my test program.

    /* test_accept4.c

    Copyright (C) 2008, Linux Foundation, written by Michael Kerrisk

    Licensed under the GNU GPLv2 or later.
    */
    #define _GNU_SOURCE
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include

    #define PORT_NUM 33333

    #define die(msg) do { perror(msg); exit(EXIT_FAILURE); } while (0)

    /**********************************************************************/

    /* The following is what we need until glibc gets a wrapper for
    accept4() */

    /* Flags for socket(), socketpair(), accept4() */
    #ifndef SOCK_CLOEXEC
    #define SOCK_CLOEXEC O_CLOEXEC
    #endif
    #ifndef SOCK_NONBLOCK
    #define SOCK_NONBLOCK O_NONBLOCK
    #endif

    #ifdef __x86_64__
    #define SYS_accept4 288
    #elif __i386__
    #define USE_SOCKETCALL 1
    #define SYS_ACCEPT4 18
    #else
    #error "Sorry -- don't know the syscall # on this architecture"
    #endif

    static int
    accept4(int fd, struct sockaddr *sockaddr, socklen_t *addrlen, int flags)
    {
    printf("Calling accept4(): flags = %x", flags);
    if (flags != 0) {
    printf(" (");
    if (flags & SOCK_CLOEXEC)
    printf("SOCK_CLOEXEC");
    if ((flags & SOCK_CLOEXEC) && (flags & SOCK_NONBLOCK))
    printf(" ");
    if (flags & SOCK_NONBLOCK)
    printf("SOCK_NONBLOCK");
    printf(")");
    }
    printf("\n");

    #if USE_SOCKETCALL
    long args[6];

    args[0] = fd;
    args[1] = (long) sockaddr;
    args[2] = (long) addrlen;
    args[3] = flags;

    return syscall(SYS_socketcall, SYS_ACCEPT4, args);
    #else
    return syscall(SYS_accept4, fd, sockaddr, addrlen, flags);
    #endif
    }

    /**********************************************************************/

    static int
    do_test(int lfd, struct sockaddr_in *conn_addr,
    int closeonexec_flag, int nonblock_flag)
    {
    int connfd, acceptfd;
    int fdf, flf, fdf_pass, flf_pass;
    struct sockaddr_in claddr;
    socklen_t addrlen;

    printf("=======================================\n");

    connfd = socket(AF_INET, SOCK_STREAM, 0);
    if (connfd == -1)
    die("socket");
    if (connect(connfd, (struct sockaddr *) conn_addr,
    sizeof(struct sockaddr_in)) == -1)
    die("connect");

    addrlen = sizeof(struct sockaddr_in);
    acceptfd = accept4(lfd, (struct sockaddr *) &claddr, &addrlen,
    closeonexec_flag | nonblock_flag);
    if (acceptfd == -1) {
    perror("accept4()");
    close(connfd);
    return 0;
    }

    fdf = fcntl(acceptfd, F_GETFD);
    if (fdf == -1)
    die("fcntl:F_GETFD");
    fdf_pass = ((fdf & FD_CLOEXEC) != 0) ==
    ((closeonexec_flag & SOCK_CLOEXEC) != 0);
    printf("Close-on-exec flag is %sset (%s); ",
    (fdf & FD_CLOEXEC) ? "" : "not ",
    fdf_pass ? "OK" : "failed");

    flf = fcntl(acceptfd, F_GETFL);
    if (flf == -1)
    die("fcntl:F_GETFD");
    flf_pass = ((flf & O_NONBLOCK) != 0) ==
    ((nonblock_flag & SOCK_NONBLOCK) !=0);
    printf("nonblock flag is %sset (%s)\n",
    (flf & O_NONBLOCK) ? "" : "not ",
    flf_pass ? "OK" : "failed");

    close(acceptfd);
    close(connfd);

    printf("Test result: %s\n", (fdf_pass && flf_pass) ? "PASS" : "FAIL");
    return fdf_pass && flf_pass;
    }

    static int
    create_listening_socket(int port_num)
    {
    struct sockaddr_in svaddr;
    int lfd;
    int optval;

    memset(&svaddr, 0, sizeof(struct sockaddr_in));
    svaddr.sin_family = AF_INET;
    svaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    svaddr.sin_port = htons(port_num);

    lfd = socket(AF_INET, SOCK_STREAM, 0);
    if (lfd == -1)
    die("socket");

    optval = 1;
    if (setsockopt(lfd, SOL_SOCKET, SO_REUSEADDR, &optval,
    sizeof(optval)) == -1)
    die("setsockopt");

    if (bind(lfd, (struct sockaddr *) &svaddr,
    sizeof(struct sockaddr_in)) == -1)
    die("bind");

    if (listen(lfd, 5) == -1)
    die("listen");

    return lfd;
    }

    int
    main(int argc, char *argv[])
    {
    struct sockaddr_in conn_addr;
    int lfd;
    int port_num;
    int passed;

    passed = 1;

    port_num = (argc > 1) ? atoi(argv[1]) : PORT_NUM;

    memset(&conn_addr, 0, sizeof(struct sockaddr_in));
    conn_addr.sin_family = AF_INET;
    conn_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
    conn_addr.sin_port = htons(port_num);

    lfd = create_listening_socket(port_num);

    if (!do_test(lfd, &conn_addr, 0, 0))
    passed = 0;
    if (!do_test(lfd, &conn_addr, SOCK_CLOEXEC, 0))
    passed = 0;
    if (!do_test(lfd, &conn_addr, 0, SOCK_NONBLOCK))
    passed = 0;
    if (!do_test(lfd, &conn_addr, SOCK_CLOEXEC, SOCK_NONBLOCK))
    passed = 0;

    close(lfd);

    exit(passed ? EXIT_SUCCESS : EXIT_FAILURE);
    }

    [mtk.manpages@gmail.com: rewrote changelog, updated test program]
    Signed-off-by: Ulrich Drepper
    Tested-by: Michael Kerrisk
    Acked-by: Michael Kerrisk
    Cc:
    Cc:
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Ulrich Drepper
     
  • Several device drivers try to do things like netif_carrier_off()
    before register_netdev() is invoked. This is bogus, but too many
    drivers do this to fix them all up in one go.

    Reported-by: Folkert van Heusden
    Signed-off-by: David S. Miller

    David S. Miller
     
  • CC [M] net/phonet/af_phonet.o
    net/phonet/af_phonet.c: In function `pn_socket_create':
    net/phonet/af_phonet.c:38: sorry, unimplemented: inlining failed in call to 'phonet_proto_put': function body not available
    net/phonet/af_phonet.c:99: sorry, unimplemented: called from here
    make[3]: *** [net/phonet/af_phonet.o] Error 1

    Signed-off-by: Alexey Dobriyan
    Signed-off-by: David S. Miller

    Alexey Dobriyan
     
  • As number of TX queues in unrelated to number of CPU's we remove this test
    and just make sure nxtq never gets exceeded.

    Signed-off-by: Robert Olsson
    Signed-off-by: David S. Miller

    Robert Olsson
     
  • Similarly to IPv6 ip6_mr_init() (fixed last week), the order of cleanup
    operations in the error/exit section of ip_mr_init() is completely
    inversed. It should be the other way around.
    Also a del_timer() is missing in the error path.

    I should have guessed last week that this same error existed in ipmr.c
    too, as ip6mr.c is largely inspired by ipmr.c.

    Signed-off-by: Benjamin Thery
    Signed-off-by: David S. Miller

    Benjamin Thery
     

19 Nov, 2008

1 commit

  • Before ieee80211_notify_mac() was added, it was presented with the
    use case of using it to tell mac80211 that the association may
    have been lost because the firmware crashed/reset.

    Since then, it has also been used by iwlwifi to (slightly) speed
    up re-association after resume, a workaround around the fact that
    mac80211 has no suspend/resume handling yet. It is also not used
    by any other drivers, so clearly it cannot be necessary for "good
    enough" suspend/resume.

    Unfortunately, the callback suffers from a severe problem: It only
    works for station mode. If suspend/resume happens while in IBSS or
    any other mode (but station), then the callback is pointless.

    Recently, it has created a number of locking issues, first because
    it required rtnl locking rather than RCU due to calling sleeping
    functions within the critical section, and now because it's called
    by iwlwifi from the mac80211 workqueue that may not use the rtnl
    because it is flushed under rtnl.
    (cf. http://bugzilla.kernel.org/show_bug.cgi?id=12046)

    I think, therefore, that we should take a step back, remove it
    entirely for now and add the small feature it provided properly.
    For suspend and resume we will need to introduce new hooks, and for
    the case where the firmware was reset the driver will probably
    simply just pretend it has done a suspend/resume cycle to get
    mac80211 to reprogram the hardware completely, not just try to
    connect to the current AP again in station mode. When doing so, we
    will need to take into account locking issues and possibly defer
    to schedule_work from within mac80211 for the resume operation,
    while the suspend operation must be done directly.

    Proper suspend/resume should also not necessarily try to reconnect
    to the current AP, the time spent in suspend may have been short
    enough to not be disconnected from the AP, mac80211 will detect
    that the AP went out of range quickly if it did, and if the
    association is lost then the AP will disassoc as soon as a data
    frame is sent. We might also take into account WWOL then, and
    have mac80211 program the hardware into such a mode where it is
    available and requested.

    Signed-off-by: Johannes Berg
    Signed-off-by: John W. Linville

    Johannes Berg
     

17 Nov, 2008

2 commits


15 Nov, 2008

1 commit

  • This is the next page of the scm recursion story (the commit
    f8d570a4 net: Fix recursive descent in __scm_destroy()).

    In function scm_fp_dup(), the INIT_LIST_HEAD(&fpl->list) of newly
    created fpl is done *before* the subsequent memcpy from the old
    structure and thus the freshly initialized list is overwritten.

    But that's OK, since this initialization is not required at all,
    since the fpl->list is list_add-ed at the destruction time in any
    case (and is unused in other code), so I propose to drop both
    initializations, rather than moving it after the memcpy.

    Please, correct me if I miss something significant.

    Signed-off-by: Pavel Emelyanov
    Signed-off-by: David S. Miller

    Pavel Emelyanov
     

14 Nov, 2008

1 commit

  • fix this warning:

    net/bluetooth/af_bluetooth.c:60: warning: ‘bt_key_strings’ defined but not used
    net/bluetooth/af_bluetooth.c:71: warning: ‘bt_slock_key_strings’ defined but not used

    this is a lockdep macro problem in the !LOCKDEP case.

    We cannot convert it to an inline because the macro works on multiple types,
    but we can mark the parameter used.

    [ also clean up a misaligned tab in sock_lock_init_class_and_name() ]

    [ also remove #ifdefs from around af_family_clock_key strings - which
    were certainly added to get rid of the ugly build warnings. ]

    Signed-off-by: Ingo Molnar
    Signed-off-by: David S. Miller

    Ingo Molnar
     

13 Nov, 2008

5 commits

  • Make 9p's RDMA option depend on INET since it uses Infiniband rdma_*
    functions and that code depends on INET. Otherwise 9p can try to
    use symbols which don't exist.

    ERROR: "rdma_destroy_id" [net/9p/9pnet_rdma.ko] undefined!
    ERROR: "rdma_connect" [net/9p/9pnet_rdma.ko] undefined!
    ERROR: "rdma_create_id" [net/9p/9pnet_rdma.ko] undefined!
    ERROR: "rdma_create_qp" [net/9p/9pnet_rdma.ko] undefined!
    ERROR: "rdma_resolve_route" [net/9p/9pnet_rdma.ko] undefined!
    ERROR: "rdma_disconnect" [net/9p/9pnet_rdma.ko] undefined!
    ERROR: "rdma_resolve_addr" [net/9p/9pnet_rdma.ko] undefined!

    I used an if/endif block so that the menu items would remain
    presented together.

    Also correct an article adjective.

    Signed-off-by: Randy Dunlap
    Signed-off-by: David S. Miller

    Randy Dunlap
     
  • Failure to pass netns_ok check is SILENT, except some MIB counter is
    incremented somewhere.

    And adding "netns_ok = 1" (after long head-scratching session) is
    usually the last step in making some protocol netns-ready...

    Signed-off-by: Alexey Dobriyan
    Signed-off-by: David S. Miller

    Alexey Dobriyan
     
  • This patch fixes two bugs:

    1. setsockopt() of anything but a Type 2 routing header should return
    EINVAL instead of EPERM. Noticed by Shan Wei
    (shanwei@cn.fujitsu.com).

    2. setsockopt()/sendmsg() of a Type 2 routing header with invalid
    length or segments should return EINVAL. These values are statically
    fixed in RFC 3775, unlike the variable Type 0 was.

    Signed-off-by: Brian Haley
    Signed-off-by: David S. Miller

    Brian Haley
     
  • David S. Miller
     
  • The ieee80211_notify_mac() function uses ieee80211_sta_req_auth() which
    in turn calls ieee80211_set_disassoc() which calls a few functions that
    need to be able to sleep, so ieee80211_notify_mac() cannot use RCU
    locking for the interface list and must use rtnl locking instead.

    Signed-off-by: Johannes Berg
    Signed-off-by: John W. Linville

    Johannes Berg
     

12 Nov, 2008

3 commits

  • In __sock_recv_timestamp() the additional SCM_TIMESTAMP[NS] is used. This
    has the same value as SO_TIMESTAMP[NS], so this is a purely cosmetic change.

    Signed-off-by: Patrick Ohly
    Signed-off-by: David S. Miller

    Patrick Ohly
     
  • This patch fixes a minor bug in tcp_htcp.c which has been
    highlighted by Lachlan Andrew and Lawrence Stewart. Currently, the
    time since the last congestion event, which is stored in variable
    last_cong, is reset whenever there is a state change into
    TCP_CA_Open. This includes transitions of the type
    TCP_CA_Open->TCP_CA_Disorder->TCP_CA_Open which are not associated
    with backoff of cwnd. The patch changes last_cong to be updated
    only on transitions into TCP_CA_Open that occur after experiencing
    the congestion-related states TCP_CA_Loss, TCP_CA_Recovery,
    TCP_CA_CWR.

    Signed-off-by: Doug Leith
    Signed-off-by: David S. Miller

    Doug Leith
     
  • * git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6:
    dsa: fix master interface allmulti/promisc handling
    dsa: fix skb->pkt_type when mac address of slave interface differs
    net: fix setting of skb->tail in skb_recycle_check()
    net: fix /proc/net/snmp as memory corruptor
    mac80211: fix a buffer overrun in station debug code
    netfilter: payload_len is be16, add size of struct rather than size of pointer
    ipv6: fix ip6_mr_init error path
    [4/4] dca: fixup initialization dependency
    [3/4] I/OAT: fix async_tx.callback checking
    [2/4] I/OAT: fix dma_pin_iovec_pages() error handling
    [1/4] I/OAT: fix channel resources free for not allocated channels
    ssb: Fix DMA-API compilation for non-PCI systems
    SSB: hide empty sub menu
    vlan: Fix typos in proc output string
    [netdrvr] usb/hso: Cleanup rfkill error handling
    sfc: Correct address of gPXE boot configuration in EEPROM
    el3_common_init() should be __devinit, not __init
    hso: rfkill type should be WWAN
    mlx4_en: Start port error flow bug fix
    af_key: mark policy as dead before destroying

    Linus Torvalds
     

11 Nov, 2008

8 commits

  • Before commit b6c40d68ff6498b7f63ddf97cf0aa818d748dee7 ("net: only
    invoke dev->change_rx_flags when device is UP"), the dsa driver could
    sort-of get away with only fiddling with the master interface's
    allmulti/promisc counts in ->change_rx_flags() and not touching them
    in ->open() or ->stop(). After this commit (note that it was merged
    almost simultaneously with the dsa patches, which is why this wasn't
    caught initially), the breakage that was already there became more
    apparent.

    Since it makes no sense to keep the master interface's allmulti or
    promisc count pinned for a slave interface that is down, copy the vlan
    driver's sync logic (which does exactly what we want) over to dsa to
    fix this.

    Bug report from Dirk Teurlings and Peter van Valderen
    .

    Signed-off-by: Lennert Buytenhek
    Tested-by: Dirk Teurlings
    Tested-by: Peter van Valderen
    Signed-off-by: David S. Miller

    Lennert Buytenhek
     
  • When a dsa slave interface has a mac address that differs from that
    of the master interface, eth_type_trans() won't explicitly set
    skb->pkt_type back to PACKET_HOST -- we need to do this ourselves
    before calling eth_type_trans().

    Signed-off-by: Lennert Buytenhek
    Signed-off-by: David S. Miller

    Lennert Buytenhek
     
  • Since skb_reset_tail_pointer() reads skb->data, we need to set
    skb->data before calling skb_reset_tail_pointer(). This was causing
    spurious skb_over_panic()s from skb_put() being called on a recycled
    skb that had its skb->tail set to beyond where it should have been.

    Bug report from Peter van Valderen .

    Signed-off-by: Lennert Buytenhek
    Signed-off-by: David S. Miller

    Lennert Buytenhek
     
  • icmpmsg_put() can happily corrupt kernel memory, using a static
    table and forgetting to reset an array index in a loop.

    Remove the static array since its not safe without proper locking.

    Signed-off-by: Alexey Dobriyan
    Signed-off-by: Eric Dumazet
    Signed-off-by: David S. Miller

    Eric Dumazet
     
  • net/mac80211/debugfs_sta.c
    The trailing zero was written to state[4], it's out of bounds.

    Signed-off-by: Jianjun Kong
    Signed-off-by: David S. Miller

    Jianjun Kong
     
  • payload_len is a be16 value, not cpu_endian, also the size of a ponter
    to a struct ipv6hdr was being added, not the size of the struct itself.

    Signed-off-by: Harvey Harrison
    Signed-off-by: David S. Miller

    Harvey Harrison
     
  • The order of cleanup operations in the error/exit section of ip6_mr_init()
    is completely inversed. It should be the other way around.
    Also a del_timer() is missing in the error path.

    Signed-off-by: Benjamin Thery
    Signed-off-by: David S. Miller

    Benjamin Thery
     
  • Signed-off-by: Ferenc Wagner
    Signed-off-by: David S. Miller

    Ferenc Wagner
     

10 Nov, 2008

1 commit

  • Previously I assumed that the receive queues of candidates don't
    change during the GC. This is only half true, nothing can be received
    from the queues (see comment in unix_gc()), but buffers could be added
    through the other half of the socket pair, which may still have file
    descriptors referring to it.

    This can result in inc_inflight_move_tail() erronously increasing the
    "inflight" counter for a unix socket for which dec_inflight() wasn't
    previously called. This in turn can trigger the "BUG_ON(total_refs <
    inflight_refs)" in a later garbage collection run.

    Fix this by only manipulating the "inflight" counter for sockets which
    are candidates themselves. Duplicating the file references in
    unix_attach_fds() is also needed to prevent a socket becoming a
    candidate for GC while the skb that contains it is not yet queued.

    Reported-by: Andrea Bittau
    Signed-off-by: Miklos Szeredi
    CC: stable@kernel.org
    Signed-off-by: Linus Torvalds

    Miklos Szeredi
     

07 Nov, 2008

5 commits

  • xfrm_policy_destroy() will oops if not dead policy is passed to it.
    On error path in pfkey_compile_policy() exactly this happens.

    Oopsable for CAP_NET_ADMIN owners.

    Signed-off-by: Alexey Dobriyan
    Signed-off-by: David S. Miller

    Alexey Dobriyan
     
  • * git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6:
    net: Fix recursive descent in __scm_destroy().
    iwl3945: fix deadlock on suspend
    iwl3945: do not send scan command if channel count zero
    iwl3945: clear scanning bits upon failure
    ath5k: correct handling of rx status fields
    zd1211rw: Add 2 device IDs
    Fix logic error in rfkill_check_duplicity
    iwlagn: avoid sleep in softirq context
    iwlwifi: clear scanning bits upon failure
    Revert "ath5k: honor FIF_BCN_PRBRESP_PROMISC in STA mode"
    tcp: Fix recvmsg MSG_PEEK influence of blocking behavior.
    netfilter: netns ct: walk netns list under RTNL
    ipv6: fix run pending DAD when interface becomes ready
    net/9p: fix printk format warnings
    net: fix packet socket delivery in rx irq handler
    xfrm: Have af-specific init_tempsel() initialize family field of temporary selector

    Linus Torvalds
     
  • David S. Miller
     
  • * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ericvh/v9fs:
    net/9p: fix printk format warnings
    unsigned fid->fid cannot be negative
    9p: rdma: remove duplicated #include
    p9: Fix leak of waitqueue in request allocation path
    9p: Remove unneeded free of fcall for Flush
    9p: Make all client spin locks IRQ safe
    9p: rdma: Set trans prior to requesting async connection ops

    Linus Torvalds
     
  • __scm_destroy() walks the list of file descriptors in the scm_fp_list
    pointed to by the scm_cookie argument.

    Those, in turn, can close sockets and invoke __scm_destroy() again.

    There is nothing which limits how deeply this can occur.

    The idea for how to fix this is from Linus. Basically, we do all of
    the fput()s at the top level by collecting all of the scm_fp_list
    objects hit by an fput(). Inside of the initial __scm_destroy() we
    keep running the list until it is empty.

    Signed-off-by: David S. Miller

    David S. Miller