[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
Mon, 05 Sep 2005 21:08:55 -0400


In message <431C64B7.10103@ribosome.natur.cuni.cz>,=?ISO-8859-2?Q?Martin_MOKREJ=A9?= writes:
>Yes, it doesn't crash anymore:

good.  could you please try this patch?  this should be right way to fix
the problem.  we lookup the new root volume and stick it in the dentry.
then, we can drop the dentry's reference on the the old root inode and
put the new inode into the global reference to the root inode.

if anything fails, we just leave things alone.

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 01:04:48 -0000
@@ -309,8 +309,55 @@
 		 * 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
+
+			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;