Clean up various flush-related code. [rsc] --rw-rw-r-- M 771144 rsc sys 33422 Feb 11 09:14 sys/src/cmd/fossil/9fsys.c /n/sourcesdump/2006/0211/plan9/sys/src/cmd/fossil/9fsys.c:464,470 - /n/sourcesdump/2006/0212/plan9/sys/src/cmd/fossil/9fsys.c:464,471 fsysSync(Fsys* fsys, int argc, char* argv[]) { char *usage = "usage: [fsys name] sync"; - + int n; + ARGBEGIN{ default: return cliError(usage); /n/sourcesdump/2006/0211/plan9/sys/src/cmd/fossil/9fsys.c:472,478 - /n/sourcesdump/2006/0212/plan9/sys/src/cmd/fossil/9fsys.c:473,481 if(argc > 0) return cliError(usage); + n = cacheDirty(fsys->fs->cache); fsSync(fsys->fs); + consPrint("\t%s sync: wrote %d blocks\n", fsys->name, n); return 1; } [rsc] --rw-rw-r-- M 771144 rsc sys 43883 Feb 11 09:13 sys/src/cmd/fossil/cache.c [diffs elided - too long] [diff -c /n/sourcesdump/2006/0211/plan9/sys/src/cmd/fossil/cache.c /n/sourcesdump/2006/0212/plan9/sys/src/cmd/fossil/cache.c] [rsc] --rw-rw-r-- M 771144 rsc sys 29983 Feb 11 09:14 sys/src/cmd/fossil/file.c /n/sourcesdump/2006/0211/plan9/sys/src/cmd/fossil/file.c:894,900 - /n/sourcesdump/2006/0212/plan9/sys/src/cmd/fossil/file.c:894,900 f->dir.qidSpace = 1; f->dir.qidOffset = offset; f->dir.qidMax = max; - ret = fileMetaFlush2(f, nil); + ret = fileMetaFlush2(f, nil)>=0; fileMetaUnlock(f); fileUnlock(f); return ret; /n/sourcesdump/2006/0211/plan9/sys/src/cmd/fossil/file.c:965,986 - /n/sourcesdump/2006/0212/plan9/sys/src/cmd/fossil/file.c:965,986 return 1; } - void + int fileMetaFlush(File *f, int rec) { File **kids, *p; int nkids; - int i; + int i, rv; fileMetaLock(f); - fileMetaFlush2(f, nil); + rv = fileMetaFlush2(f, nil); fileMetaUnlock(f); if(!rec || !fileIsDir(f)) - return; + return rv; if(!fileLock(f)) - return; + return rv; nkids = 0; for(p=f->down; p; p=p->next) nkids++; /n/sourcesdump/2006/0211/plan9/sys/src/cmd/fossil/file.c:993,1002 - /n/sourcesdump/2006/0212/plan9/sys/src/cmd/fossil/file.c:993,1003 fileUnlock(f); for(i=0; idirty) - return 1; + return 0; if(oelem == nil) oelem = f->dir.elem; /n/sourcesdump/2006/0211/plan9/sys/src/cmd/fossil/file.c:1021,1027 - /n/sourcesdump/2006/0212/plan9/sys/src/cmd/fossil/file.c:1022,1028 fp = f->up; if(!sourceLock(fp->msource, -1)) - return 0; + return -1; /* can happen if source is clri'ed out from under us */ if(f->boff == NilBlock) goto Err1; /n/sourcesdump/2006/0211/plan9/sys/src/cmd/fossil/file.c:1090,1096 - /n/sourcesdump/2006/0212/plan9/sys/src/cmd/fossil/file.c:1091,1097 blockPut(b); Err1: sourceUnlock(fp->msource); - return 0; + return -1; } static int [rsc] --rw-rw-r-- M 771144 rsc sys 3228 Feb 11 09:14 sys/src/cmd/fossil/fns.h /n/sourcesdump/2006/0211/plan9/sys/src/cmd/fossil/fns.h:25,30 - /n/sourcesdump/2006/0212/plan9/sys/src/cmd/fossil/fns.h:25,31 Block* cacheAllocBlock(Cache*, int, u32int, u32int, u32int); void cacheFlush(Cache*, int); u32int cacheLocalSize(Cache*, int); + int cacheDirty(Cache*); int readLabel(Cache*, Label*, u32int addr); Block* blockCopy(Block*, u32int, u32int, u32int); [rsc] --rw-rw-r-- M 771144 rsc sys 4365 Feb 11 09:14 sys/src/cmd/fossil/fossil-acid /n/sourcesdump/2006/0211/plan9/sys/src/cmd/fossil/fossil-acid:66,77 - /n/sourcesdump/2006/0212/plan9/sys/src/cmd/fossil/fossil-acid:66,78 // try to say something intelligent about why a process is stuck. _pauses = { - "open", - "pread", - "pwrite", - "sleep", - "vtSleep", - "vtLock", + open, + pread, + pwrite, + sleep, + vtSleep, + vtLock, + vtRLock, }; defn deadlocklist(l) /n/sourcesdump/2006/0211/plan9/sys/src/cmd/fossil/fossil-acid:93,99 - /n/sourcesdump/2006/0212/plan9/sys/src/cmd/fossil/fossil-acid:94,102 stallframe = 0; stallname = ""; fossilframe = 0; + frame = {0}; while stk do { + lastframe = frame; frame = head stk; name = fmt(frame[0], 'a'); if !stallframe && match(name, _pauses) >= 0 then { /n/sourcesdump/2006/0211/plan9/sys/src/cmd/fossil/fossil-acid:106,111 - /n/sourcesdump/2006/0212/plan9/sys/src/cmd/fossil/fossil-acid:109,121 pfl(frame[1]); } if !fossilframe && regexp("^/sys/src/cmd/fossil/.*", pcfile(frame[0])) then { + if !stallframe then { + stallframe = lastframe; + stallname = fmt(lastframe[0], 'a'); + print("\tunexpected stall: ", stallname, "\n"); + if match(stallname, _pauses) >= 0 then + print("\t\t but it matches!\n"); + } fossilframe = frame; print("\t", fmt(frame[0], 'a'), "("); params(frame[2]); /n/sourcesdump/2006/0211/plan9/sys/src/cmd/fossil/fossil-acid:117,123 - /n/sourcesdump/2006/0212/plan9/sys/src/cmd/fossil/fossil-acid:127,133 print("\twaiting to lock block b=(Block)", *cacheLocalLookup:b\X, "\n"); if name == cacheLocal && stallname == vtSleep then print("\tsleeping on block b=(Block)", *cacheLocal:b\X, "\n"); - if name == blockFlush && stallname == vtSleep then + if name == blockWrite && stallname == vtSleep then print("\tsleeping on block b=(Block)", *blockFlush:b\X, "\n"); } stk = tail stk; /n/sourcesdump/2006/0211/plan9/sys/src/cmd/fossil/fossil-acid:127,134 - /n/sourcesdump/2006/0212/plan9/sys/src/cmd/fossil/fossil-acid:137,148 vtrendez(*vtSleep:q); if stallname == vtLock then vtlock(*vtLock:p); - if !stallframe || !fossilframe then - print("\tconfused\n"); + if !stallframe || !fossilframe then { + print("\tconfused:"); + if !stallframe then print(" stallframe?"); + if !fossilframe then print(" fossilframe?"); + print("\n"); + } print("\n"); } [rsc] --rw-rw-r-- M 771144 rsc sys 21572 Feb 11 09:14 sys/src/cmd/fossil/fs.c /n/sourcesdump/2006/0211/plan9/sys/src/cmd/fossil/fs.c:782,793 - /n/sourcesdump/2006/0212/plan9/sys/src/cmd/fossil/fs.c:782,795 static void fsMetaFlush(void *a) { + int rv; Fs *fs = a; vtRLock(fs->elk); - fileMetaFlush(fs->file, 1); + rv = fileMetaFlush(fs->file, 1); vtRUnlock(fs->elk); - cacheFlush(fs->cache, 0); + if(rv > 0) + cacheFlush(fs->cache, 0); } static int [rsc] --rw-rw-r-- M 771144 rsc sys 1581 Feb 11 09:14 sys/src/cmd/fossil/fs.h /n/sourcesdump/2006/0211/plan9/sys/src/cmd/fossil/fs.h:49,55 - /n/sourcesdump/2006/0212/plan9/sys/src/cmd/fossil/fs.h:49,55 File *fileIncRef(File*); int fileDecRef(File*); int fileIsRoot(File*); - void fileMetaFlush(File*, int); + int fileMetaFlush(File*, int); int fileSetQidSpace(File*, u64int, u64int); int fileTruncate(File*, char*); int fileIsRoFs(File*); [rsc] --rw-rw-r-- M 771144 rsc sys 2640 Feb 11 09:14 sys/src/cmd/fossil/mkfile /n/sourcesdump/2006/0211/plan9/sys/src/cmd/fossil/mkfile:61,80 - /n/sourcesdump/2006/0212/plan9/sys/src/cmd/fossil/mkfile:61,102 slay 8.flfmt | rc slay 8.fossil | rc unmount /n/fossil || status='' - {syscall seek 1 64000000 0; echo} >>/tmp/fossil + 9fs emelieother + bind -c /n/emelieother/rsc/tmp /tmp + {syscall seek 1 6400000000 0; echo} >>/tmp/fossil 8.flfmt -y /tmp/fossil 8.conf -w /tmp/fossil flproto - 8.fossil -f /tmp/fossil && mount -c /srv/test.fossil /n/fossil + 8.fossil -f /tmp/fossil + cat /srv/test.fscons & + echo fsys main >>/srv/test.fscons + mount /srv/test.fossil /n/fossil + cd /n/fossil/tmp + dd -bs 1048576 -count 256 -if /dev/zero -of a + rm a + echo sync >>/srv/test.fscons + echo sync >>/srv/test.fscons + echo sync >>/srv/test.fscons + sleep 1 + echo sync >>/srv/test.fscons + sleep 1 + echo sync >>/srv/test.fscons + sleep 1 + echo sync >>/srv/test.fscons + echo check >>/srv/test.fscons + echo check >>/srv/test.fscons + echo check >>/srv/test.fscons + + # cp /env/timezone /n/fossil/tmp # cp /lib/words /n/fossil/tmp - dircp /sys/src/cmd/aux /n/fossil/tmp - chmod +t /n/fossil/tmp/lis - echo SHOULD NOT SEE THIS >>/n/fossil/tmp/lis - echo snap -a >>/srv/test.fscons - sleep 2 - mount /srv/test.fossil /n/dump main/archive - cat /n/dump/*/*/tmp/lis - + # dircp /n/sources/plan9/sys/src/cmd/aux /n/fossil/tmp + # >/n/fossil/tmp/lis + # chmod +t /n/fossil/tmp/lis + # echo SHOULD NOT SEE THIS >>/n/fossil/tmp/lis + # echo snap >>/srv/test.fscons + # sleep 2 + # mount /srv/test.fossil /n/dump main/archive + # cat /n/dump/*/*/tmp/lis # @{cd /n/fossil/tmp && time tar xTf /sys/src/cmd/fossil/test.tar} # unmount /n/fossil # rm /srv/fossil