![]() | |||||||||||||
Messages in this thread Patch in this message |
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 [from the cache] ©2003-2008 | |||||||||||||