Re: Linux 2.5.71

From: Florin Iucha (florin@iucha.net)
Date: Sat Jun 14 2003 - 23:55:19 EST


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."


- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Sun Jun 15 2003 - 22:00:41 EST