]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
ubik-recovery-swap-in-new-fd-20080428
authorDerrick Brashear <shadow@dementia.org>
Mon, 28 Apr 2008 22:48:00 +0000 (22:48 +0000)
committerDerrick Brashear <shadow@dementia.org>
Mon, 28 Apr 2008 22:48:00 +0000 (22:48 +0000)
LICENSE IPL10

when recovery is done, forcibly invalidate the old fd

src/ubik/phys.c
src/ubik/recovery.c
src/ubik/remote.c
src/ubik/ubik.c
src/ubik/ubik.p.h

index 403afb583927f00c383ed51ca9241214e2bd8233..04fd0b18fc23de29f12c052fd87b0708ceb465a0 100644 (file)
@@ -137,7 +137,7 @@ uphys_close(register int afd)
        return EBADF;
     tfd = fdcache;
     for (i = 0; i < MAXFDCACHE; i++, tfd++) {
-       if (tfd->fd == afd) {
+       if (tfd->fd == afd && tfd->fileID != -10000) {
            tfd->refCount--;
            return 0;
        }
@@ -289,3 +289,20 @@ uphys_sync(register struct ubik_dbase *adbase, afs_int32 afile)
     uphys_close(fd);
     return code;
 }
+
+void
+uphys_invalidate(register struct ubik_dbase *adbase, afs_int32 afid)
+{
+    register int i;
+    register struct fdcache *tfd;
+
+    /* scan file descr cache */
+    for (tfd = fdcache, i = 0; i < MAXFDCACHE; i++, tfd++) {
+       if (afid == tfd->fileID) {
+           tfd->fileID = -10000;
+           if (tfd->fd >= 0 && tfd->refCount == 0)
+               close(tfd->fd);
+           return;
+       }
+    }
+}
index b0ba2fbc62e96b051df0e3e3f5e4130a156b5d50..eecef90cdaa6e976b314bc48da2da2ac1e7a37df 100644 (file)
@@ -662,6 +662,8 @@ urecovery_Interact(void *dummy)
 #endif
                if (!code) 
                    code = rename(pbuffer, tbuffer);
+               if (!code) 
+                   code = (*ubik_dbase->open) (ubik_dbase, 0);
                if (!code)
 #endif
                /* after data is good, sync disk with correct label */
index 1ec21998688d8575664ddad546144e6c7c52b5d7..06965ae96aada6c915fb32099edb11c65805bea4 100644 (file)
@@ -615,6 +615,8 @@ SDISK_SendFile(rxcall, file, length, avers)
 #endif
     if (!code) 
        code = rename(pbuffer, tbuffer);
+    if (!code) 
+       code = (*ubik_dbase->open) (ubik_dbase, 0);
     if (!code)
 #endif
     code = (*ubik_dbase->setlabel) (dbase, file, avers);
index 843abb7f8db272ebf697df2b64f66b32d2d30c9a..68b127fd9e1970df92ff7bcc624a1d6933adbf21 100644 (file)
@@ -220,7 +220,7 @@ ubik_ServerInitCommon(afs_int32 myHost, short myPort,
     tdb->read = uphys_read;
     tdb->write = uphys_write;
     tdb->truncate = uphys_truncate;
-    tdb->open = 0;             /* this function isn't used any more */
+    tdb->open = uphys_invalidate;      /* this function isn't used any more */
     tdb->sync = uphys_sync;
     tdb->stat = uphys_stat;
     tdb->getlabel = uphys_getlabel;
index 905819b52e776592a4c3bc4cc51fbf42913d5fe7..6cb8cde6386273370ca1400967cd952afd88bf9c 100644 (file)
@@ -311,7 +311,8 @@ extern int uphys_getlabel(register struct ubik_dbase *adbase, afs_int32 afile,
 extern int uphys_setlabel(register struct ubik_dbase *adbase, afs_int32 afile,
                          struct ubik_version *aversion);
 extern int uphys_sync(register struct ubik_dbase *adbase, afs_int32 afile);
-
+extern void uphys_invalidate(register struct ubik_dbase *adbase, 
+                            afs_int32 afid);
 
 /* recovery.c */
 extern int urecovery_ResetState(void);