In message <[EMAIL PROTECTED]>,Chaskiel M Grundman writes:
>I don't know. I don't really have a guess as to what the problem is. I'd
>probably start by reintroducing the debugging code into
>osi_linux_free_inode_pages. Perhaps also dump the old/new inode pointer
>values and dp->d_count when the root changes so we know if it is the new or
>old root that is the leftover inode.

i did all that initially when i wrote the code.  but after looking at
this with some fresh eyes i see that i forgot to dput() the reference
i took from d_find_alias().  the following seems to work now without
resetting d_count.

better?

Index: src/afs/afs_daemons.c
===================================================================
RCS file: /cvs/openafs/src/afs/afs_daemons.c,v
retrieving revision 1.33
diff -u -u -r1.33 afs_daemons.c
--- src/afs/afs_daemons.c       3 Apr 2005 18:13:30 -0000       1.33
+++ src/afs/afs_daemons.c       7 Sep 2005 13:00:50 -0000
@@ -309,8 +309,56 @@
                 * count to zero and fs checkv is executed when the current
                 * directory is /afs.
                 */
+
+#ifdef AFS_LINUX20_ENV
+               {
+                       struct vrequest treq;
+                       struct vattr vattr;
+                       cred_t *credp;
+                       struct dentry *dp;
+                       struct vcache *vcp;
+
+                       afs_rootFid.Fid.Volume = volid;
+                       afs_rootFid.Fid.Vnode = 1;
+                       afs_rootFid.Fid.Unique = 1;
+
+                       credp = crref();
+                       if (afs_InitReq(&treq, credp))
+                           goto out;
+                       vcp = afs_GetVCache(&afs_rootFid, &treq, NULL, NULL);
+                       if (!vcp)
+                           goto out;
+                       afs_getattr(vcp, &vattr, credp);
+                       afs_fill_inode(AFSTOV(vcp), &vattr);
+
+                       dp = d_find_alias(AFSTOV(afs_globalVp));
+
+#if defined(AFS_LINUX24_ENV)
+                       spin_lock(&dcache_lock);
+#if defined(AFS_LINUX26_ENV)
+                       spin_lock(&dp->d_lock);
+#endif
+#endif
+                       list_del_init(&dp->d_alias);
+                       list_add(&dp->d_alias, &(AFSTOV(vcp)->i_dentry));
+                       dp->d_inode = AFSTOV(vcp);
+#if defined(AFS_LINUX24_ENV)
+#if defined(AFS_LINUX26_ENV)
+                       spin_unlock(&dp->d_lock);
+#endif
+                       spin_unlock(&dcache_lock);
+#endif
+                       dput(dp);
+
+                       AFS_FAST_RELE(afs_globalVp);
+                       afs_globalVp = vcp;
+out:
+                       crfree(credp);
+               }
+#else
                AFS_FAST_RELE(afs_globalVp);
                afs_globalVp = 0;
+#endif
            }
            afs_rootFid.Fid.Volume = volid;
            afs_rootFid.Fid.Vnode = 1;
_______________________________________________
OpenAFS-devel mailing list
[email protected]
https://lists.openafs.org/mailman/listinfo/openafs-devel

Reply via email to