]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
linux-root-fix-reval-20050907
authorChas Williams <chas@cmf.nrl.navy.mil>
Wed, 7 Sep 2005 18:38:56 +0000 (18:38 +0000)
committerDerrick Brashear <shadow@dementia.org>
Wed, 7 Sep 2005 18:38:56 +0000 (18:38 +0000)
FIXES 21390

revalidate the root vnode correctly so if we become replicated we don't lose

src/afs/afs_daemons.c

index dcb3d46cd93390809bb7151f7f8950f6b06a602c..fc1ad7329084d956704bce2a56517274af097a02 100644 (file)
@@ -310,7 +310,50 @@ afs_CheckRootVolume(void)
                 * directory is /afs.
                 */
 #ifdef AFS_LINUX20_ENV
-               printk("afs_CheckVolume():  afs_root changed.\n");
+               {
+                   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;