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

when recovery is done, forcibly invalidate the old fd

(cherry picked from commit 888bc28b1886e994d430ddc61657e60a910208a6)

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

index 69153a7bf96fdcf1cb69037a82c9ba712aff4a14..5d6269073890b19ea44d82b2540a24cc5897570e 100644 (file)
@@ -130,7 +130,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;
        }
@@ -282,3 +282,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 b59586d25da3dcd68d8962ec840240432fb4d939..20ba9f24e33ecd3138e7f17bb4fb1574db0b635d 100644 (file)
@@ -648,6 +648,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 041a5b3088dc7b15bf4917dddf5ac01e8f9bfbe4..7fc21ed5d86a499f2b758d4ae91adeb5502d39c5 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 155b2e7b80dde6be1e194f8a1ae10d7da4fb1d7e..62b8c349f3c06e873cc297de81b2131820fc3c93 100644 (file)
@@ -208,7 +208,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 a6febe1dd0650e5dfd21c67d6f28a87aeea52a4b..547babc4f056f632f1488ff2b986c7b7507abf87 100644 (file)
@@ -303,7 +303,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);