[OpenAFS-devel] kernel BUG at /scratch/openafs/src/libafs/MODLOAD-2.6.13-MP/rx_kcommon.c:131!

chas williams - CONTRACTOR chas@cmf.nrl.navy.mil
Tue, 06 Sep 2005 18:47:35 -0400


In message <431E13CF.3070706@ribosome.natur.cuni.cz>,=?windows-1252?Q?Martin_MO
KREJ=8A?= writes:
>Hmm, in my case I also use cvs HEAD, use newer 2.6.13 kernel but also use your
> patch Troy
>for the better cache statistics. Cannot say if that is related, probably not.
>Definitely, I could mount the /afs and it gave me the top-level mountpoints at
> least.
>I saw it for the first time and have no clue what's that actually.

please try this version.  i forgot to reset d_count for the dentry (its
a new inode so it has no dentry references).  the error message looks
similar to troy's but i dont believe its the same problem (not exactly the
same but possible related to d_count on a dentry whose parent changes).

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	6 Sep 2005 22:42:26 -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
+			atomic_set(&dp->d_count, 1);
+			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
+
+			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;