I ran some tests today, and it seemed (but not conclusive) that the
problem only occurs when the client is a multi-CPU SMP machine. Looking
at kernel source code, I noticed what I thought were oddities.

Do you think the following "patch" against 2.6.8-16sarge7 code would be
useful? I have not yet tested whether this works at all, or whether it
improves anything.

Thanks,

Paul Szabo   [EMAIL PROTECTED]   http://www.maths.usyd.edu.au/u/psz/
School of Mathematics and Statistics   University of Sydney    Australia


--- fs/nfs/dir.c.bak    2004-08-14 15:36:58.000000000 +1000
+++ fs/nfs/dir.c        2007-07-20 13:17:33.387030060 +1000
@@ -681,14 +681,15 @@
  */
 static void nfs_dentry_iput(struct dentry *dentry, struct inode *inode)
 {
+       /* PSz 20 Jul 07  Do not we need lock_kernel() for nfs_renew_times()? */
+       lock_kernel();
        if (dentry->d_flags & DCACHE_NFSFS_RENAMED) {
-               lock_kernel();
                inode->i_nlink--;
                nfs_complete_unlink(dentry);
-               unlock_kernel();
        }
        /* When creating a negative dentry, we want to renew d_time */
        nfs_renew_times(dentry);
+       unlock_kernel();
        iput(inode);
 }
 
@@ -832,9 +833,12 @@
                }
        }
 no_entry:
+       /* PSz 20 Jul 07  Do not we need lock_kernel() for d_add() and 
nfs_renew_times()? */
+       lock_kernel();
        d_add(dentry, inode);
        nfs_renew_times(dentry);
        nfs_set_verifier(dentry, nfs_save_change_attribute(dir));
+       unlock_kernel();
 out:
        BUG_ON(error > 0);
        return ERR_PTR(error);
@@ -882,8 +886,12 @@
        unlock_kernel();
 out:
        dput(parent);
-       if (!ret)
+       if (!ret) {
+               /* PSz 20 Jul 07  Do not we need lock_kernel() for d_drop()? */
+               lock_kernel();
                d_drop(dentry);
+               unlock_kernel();
+       }
        return ret;
 no_open:
        dput(parent);
@@ -990,6 +998,7 @@
        }
        inode = nfs_fhget(dentry->d_sb, fhandle, fattr);
        if (inode) {
+/* PSz 20 Jul 07  The whole nfs_instantiate() is only ever called within 
lock_kernel() */
                d_instantiate(dentry, inode);
                nfs_renew_times(dentry);
                nfs_set_verifier(dentry, 
nfs_save_change_attribute(dentry->d_parent->d_inode));
@@ -1200,6 +1209,7 @@
                                dir, &qsilly);
        nfs_end_data_update(dir);
        if (!error) {
+/* PSz 20 Jul 07  The whole nfs_sillyrename() is only ever called within 
lock_kernel() */
                nfs_renew_times(dentry);
                nfs_set_verifier(dentry, nfs_save_change_attribute(dir));
                d_move(dentry, sdentry);


-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

Reply via email to