lkml.org 
[lkml]   [2003]   [Jun]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    SubjectRe: Linux 2.5.71
    From
    On Sat, Jun 14, 2003 at 09:00:55PM -0500, Florin Iucha wrote:
    > On Sat, Jun 14, 2003 at 06:58:26PM -0700, Linus Torvalds wrote:
    > > Ok, that does look like the list poisoning. The poisoning uses 0x00100100
    > > as the poison value, and that's the address that oopsed for you:
    > [snip]
    > > Florin, does it work for you if you remove the poisoning in
    > > <linux/list.h>? (Just search for "POISON" and remove those lines).
    > >
    > > Trond, any ideas?
    >
    > I am compiling now 2.5.71 with Tron's patch
    > (http://bugme.osdl.org/attachment.cgi?id=414&action=view). If that
    > does not fix it I will try without the poison.

    Trond's patch fixes the problem. The box has been up an running for
    three hours under normal usage (web, mail, nfs share browsing) it even
    rebooted without problem.

    florin

    diff -u --recursive --new-file linux-2.5.71/net/sunrpc/rpc_pipe.c linux-2.5.71-fix_rpcpipe/net/sunrpc/rpc_pipe.c
    --- linux-2.5.71/net/sunrpc/rpc_pipe.c 2003-06-11 19:24:29.000000000 -0700
    +++ linux-2.5.71-fix_rpcpipe/net/sunrpc/rpc_pipe.c 2003-06-14 16:58:21.000000000 -0700
    @@ -472,30 +472,37 @@
    rpc_depopulate(struct dentry *parent)
    {
    struct inode *dir = parent->d_inode;
    - HLIST_HEAD(head);
    struct list_head *pos, *next;
    - struct dentry *dentry;
    + struct dentry *dentry, *dvec[10];
    + int n = 0;

    down(&dir->i_sem);
    +repeat:
    spin_lock(&dcache_lock);
    list_for_each_safe(pos, next, &parent->d_subdirs) {
    dentry = list_entry(pos, struct dentry, d_child);
    + spin_lock(&dentry->d_lock);
    if (!d_unhashed(dentry)) {
    dget_locked(dentry);
    __d_drop(dentry);
    - hlist_add_head(&dentry->d_hash, &head);
    - }
    + spin_unlock(&dentry->d_lock);
    + dvec[n++] = dentry;
    + if (n == ARRAY_SIZE(dvec))
    + break;
    + } else
    + spin_unlock(&dentry->d_lock);
    }
    spin_unlock(&dcache_lock);
    - while (!hlist_empty(&head)) {
    - dentry = list_entry(head.first, struct dentry, d_hash);
    - /* Private list, so no dcache_lock needed and use __d_drop */
    - __d_drop(dentry);
    - if (dentry->d_inode) {
    - rpc_inode_setowner(dentry->d_inode, NULL);
    - simple_unlink(dir, dentry);
    - }
    - dput(dentry);
    + if (n) {
    + do {
    + dentry = dvec[--n];
    + if (dentry->d_inode) {
    + rpc_inode_setowner(dentry->d_inode, NULL);
    + simple_unlink(dir, dentry);
    + }
    + dput(dentry);
    + } while (n);
    + goto repeat;
    }
    up(&dir->i_sem);
    }
    --

    "NT is to UNIX what a doughnut is to a particle accelerator."
    [unhandled content-type:application/pgp-signature]
    \
     
     \ /
      Last update: 2005-03-22 13:36    [W:0.023 / U:0.704 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site