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    [from the cache]
©2003-2011 Jasper Spaans