aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/vac/file.c
diff options
context:
space:
mode:
authorrsc <devnull@localhost>2005-07-24 20:15:44 +0000
committerrsc <devnull@localhost>2005-07-24 20:15:44 +0000
commit23fb2edb22703ad10aae02295e654b3de68617c5 (patch)
tree68033bae1131e4028eb4a78d4cc028bd2c77839d /src/cmd/vac/file.c
parent7ba8aa0c7083415ad69c2f8e591425f3c6ebf952 (diff)
downloadplan9port-23fb2edb22703ad10aae02295e654b3de68617c5.tar.gz
plan9port-23fb2edb22703ad10aae02295e654b3de68617c5.tar.bz2
plan9port-23fb2edb22703ad10aae02295e654b3de68617c5.zip
venti updates
Diffstat (limited to 'src/cmd/vac/file.c')
-rw-r--r--src/cmd/vac/file.c29
1 files changed, 26 insertions, 3 deletions
diff --git a/src/cmd/vac/file.c b/src/cmd/vac/file.c
index bb0bb03d..10c632c9 100644
--- a/src/cmd/vac/file.c
+++ b/src/cmd/vac/file.c
@@ -4,6 +4,8 @@
#include "fns.h"
#include "error.h"
+#define debug 0
+
/*
* locking order is upwards. A thread can hold the lock for a VacFile
* and then acquire the lock of its parent
@@ -122,12 +124,16 @@ Err:
VacFile*
_vacfileroot(VacFs *fs, VtFile *r)
{
+ int redirected;
+ char err[ERRMAX];
VtBlock *b;
VtFile *r0, *r1, *r2;
MetaBlock mb;
MetaEntry me;
VacFile *root, *mr;
+ redirected = 0;
+Top:
b = nil;
root = nil;
mr = nil;
@@ -137,14 +143,31 @@ _vacfileroot(VacFs *fs, VtFile *r)
if(vtfilelock(r, -1) < 0)
return nil;
r0 = vtfileopen(r, 0, fs->mode);
+ if(debug)
+ fprint(2, "r0 %p\n", r0);
if(r0 == nil)
goto Err;
+ r2 = vtfileopen(r, 2, fs->mode);
+ if(debug)
+ fprint(2, "r2 %p\n", r2);
+ if(r2 == nil){
+ /*
+ * some vac files (e.g., from fossil)
+ * have an extra layer of indirection.
+ */
+ rerrstr(err, sizeof err);
+ if(!redirected && strstr(err, "not active")){
+ vtfileunlock(r);
+ r = r0;
+ goto Top;
+ }
+ goto Err;
+ }
r1 = vtfileopen(r, 1, fs->mode);
+ if(debug)
+ fprint(2, "r1 %p\n", r1);
if(r1 == nil)
goto Err;
- r2 = vtfileopen(r, 2, fs->mode);
- if(r2 == nil)
- goto Err;
mr = filealloc(fs);
mr->msource = r2;