Updates to creepy, bug fixes mostly. Reference: /n/patches.lsub.org/patch/creepyupd Date: Tue Apr 24 21:12:32 CES 2012 Signed-off-by: nemo@lsub.org --- /sys/src/cmd/creepy/9p.c Wed Apr 18 10:42:16 2012 +++ /sys/src/cmd/creepy/9p.c Tue Apr 17 13:41:15 2012 @@ -651,6 +651,8 @@ rpc->r.ename = err; rerrstr(err, sizeof err); }else{ + if(fs->halt != 0) + error("file system halted"); fcalls[rpc->t.type](rpc); quiescent(Yes); noerror(); @@ -684,6 +686,9 @@ calltime[rpc->t.type] += nsec() - rpc->t0; ncalls[rpc->t.type]++; xqunlock(&cli->wlk); + + if(fs->halt == Halted) /* this is for testing */ + threadexitsall(nil); /* halt terminates all processes */ if(fahead != nil){ if(rpc->r.type == Rread) --- /sys/src/cmd/creepy/attr.c Wed Mar 28 16:54:19 2012 +++ /sys/src/cmd/creepy/attr.c Tue Apr 24 16:15:10 2012 @@ -463,5 +463,14 @@ mode >>= 3; if(f->d.uid == uid && (mode&bits) == bits) return; + + /* + * The process owner and elf can always access the console + * to configure the file system. + */ + if(f == fs->cons) + if(uid == usrid("elf") || uid == usrid(getuser())) + return; + error("permission denied"); } --- /sys/src/cmd/creepy/cfg.c Wed Apr 18 10:42:16 2012 +++ /sys/src/cmd/creepy/cfg.c Tue Apr 17 13:29:39 2012 @@ -539,7 +539,7 @@ static void chalt(int, char**) { - fs->halt = 1; + fs->halt = Halting; fssync(); } --- /sys/src/cmd/creepy/check.c Thu Mar 29 11:08:22 2012 +++ /sys/src/cmd/creepy/check.c Tue Apr 17 13:54:11 2012 @@ -199,6 +199,8 @@ { if(dbcountref(b->addr) != 0) /* already counted; prune */ return -1; + if(fsmemfree() < Mminfree) + fslru(); return 0; } @@ -261,6 +263,9 @@ int i; long nfails; + if(fsmemfree() < Mminfree) + fslru(); + nfails = 0; isfile(f); if((f->addr&Fakeaddr) == 0 && f->addr >= fs->limit){ @@ -428,6 +433,7 @@ } return nfails; } + /* * Failed checks are reported but not fixed (but for leaked blocks). * The user is expected to format the partition and restore contents from venti. @@ -440,22 +446,26 @@ xqlock(&fs->fzlk); xrwlock(&fs->quiescence, Wr); + fs->check = 1; nfails = 0; if(catcherror()){ xrwunlock(&fs->quiescence, Wr); xqunlock(&fs->fzlk); warn("check: %r"); nfails++; + fs->check = 0; return nfails; } - warn("check..."); - + warn("mem check..."); nfails += mleaks(); nfails += fscheckrefs(); + + warn("disk check..."); if(nfails == 0) nfails += dleaks(); + fs->check = 0; xrwunlock(&fs->quiescence, Wr); xqunlock(&fs->fzlk); noerror(); --- /sys/src/cmd/creepy/dk.h Wed Apr 11 18:37:50 2012 +++ /sys/src/cmd/creepy/dk.h Tue Apr 24 21:07:59 2012 @@ -107,6 +107,9 @@ Pre = 0, Post, + Halting = 1, + Halted, + /* mtime is ns in creepy, but s in 9p */ NSPERSEC = 1000000000ULL, }; @@ -468,6 +471,7 @@ QLock fzlk; /* freeze, melt, check, write */ RWLock quiescence; /* any activity rlocks() this */ + QLock lrulk; /* fslru */ QLock policy; /* fspolicy */ uvlong atime; /* updated on each request */ @@ -475,6 +479,7 @@ int profile; /* measure times for rpcs */ int halt; /* user wants to halt */ + int check; /* checking in progress */ int worm; /* operate in worm mode */ int mode; /* Rd | Wr */ }; --- /sys/src/cmd/creepy/fid.c Thu Mar 29 22:48:17 2012 +++ /sys/src/cmd/creepy/fid.c Tue Apr 24 16:10:35 2012 @@ -696,7 +696,7 @@ if((fmode&DMEXCL) != 0 && f->mf->open) if(f != fs->cons || amode != AWRITE) /* ok to write cons */ error("exclusive use file already open"); - if((mode&OTRUNC) != 0&& f != fs->cons && f != fs->stats){ + if((mode&OTRUNC) != 0 && f != fs->cons && f != fs->stats){ wstatint(f, "length", 0); if(f->d.mode&DMUSERS){ f->d.mode = 0664|DMUSERS; --- /sys/src/cmd/creepy/fsys.c Wed Apr 18 10:42:16 2012 +++ /sys/src/cmd/creepy/fsys.c Tue Apr 24 21:06:36 2012 @@ -589,12 +589,10 @@ if(fs->profile) fsoptime[Write] += fstime(nsec()) - t0; fs->wtime = fstime(nsec()); - xqunlock(&fs->fzlk); dZprint("fs written (2*%ld refs %ld data)\n", nr, nb); - if(fs->halt){ - warn("halted. exiting."); - threadexitsall(nil); - } + if(fs->halt) + fs->halt = Halted; + xqunlock(&fs->fzlk); } static void @@ -646,8 +644,9 @@ void fssync(void) { - if(fsfreeze()) - fswrite(); + while(fsfreeze() == nil) + sleep(1); + fswrite(); } static int @@ -762,7 +761,8 @@ errinit(Errstack); for(;;){ sleep(Syncival*1000); - fspolicy(Post); + if(fs->halt == 0 && fs->check == 0) + fspolicy(Post); } } @@ -965,6 +965,13 @@ int x; long target, tot, n, ign; + xqlock(&fs->lrulk); + if(catcherror()){ + xqunlock(&fs->lrulk); + warn("fslru: %r"); + return -1; + } + x = setdebug(); dZprint("fslru: low on memory %ulld free %d min\n", fsmemfree(), Mminfree); tot = ign = 0; @@ -1026,6 +1033,8 @@ dZprint("fslru: %uld out %uld ignored %ulld free %d min %d max\n", tot, ign, fsmemfree(), Mminfree, Mmaxfree); rlsedebug(x); + noerror(); + xqunlock(&fs->lrulk); return tot; } @@ -1037,7 +1046,7 @@ if(1){ warn("file system full"); - fsdump(0, Mem); + if(0)fsdump(0, Mem); fatal("aborting"); } return 1; @@ -1139,69 +1148,49 @@ /* * Policy for memory and and disk block reclaiming. - * Called from the sync proc from time to time and also AFTER each RPC. + * Called from the sync proc from time to time and also before and + * after each rpc. */ void fspolicy(int when) { - int lomem, lodisk, hidirty, longago; + int longago; - switch(when){ - case Pre: + if(when == Pre){ + if(fsmemfree() < Mzerofree){ + dZprint("fspolicy: pre: low mem %ulld\n", fsmemfree()); + fslru(); + } if(fsmemfree() > Mzerofree && fsdiskfree() > Dzerofree) return; - qlock(&fs->policy); - break; - case Post: - if(!canqlock(&fs->policy)) - return; - break; + dZprint("fspolicy: pre: low on mem or disk\n"); } - if(catcherror()){ - qunlock(&fs->policy); - warn("fspolicy: %r"); - return; - } - - lomem = fsmemfree() < Mminfree; - lodisk = fsdiskfree() < Dminfree; - hidirty = fsdirtypcent() > Mmaxdirtypcent; - longago = (fstime(nsec()) - fs->wtime)/NSPERSEC > Syncival; - - /* Ideal sequence for [lomem lodisk hidirty] might be: - * 111: lru sync reclaim+sync lru - * 110: lru reclaim+sync - * 101: lru sync lru - * 100: lru - * 011: reclaim+sync - * 010: reclaim+sync - * 001: sync - * 000: - - * Plus: if we are still low on memory, after lru, try - * doing a sync to move blocks to the clean list, ie. fake "hidirty". - */ - if(lomem || lodisk || hidirty || longago) - dZprint("fspolicy: lomem=%d (%ulld) lodisk=%d (%ulld)" - " hidirty=%d (%d%%) longago=%d\n", - lomem, fsmemfree(), lodisk, fsdiskfree(), - hidirty, fsdirtypcent(), longago); - if(lomem){ + if(fsmemfree() < Mminfree){ + dZprint("fspolicy: low mem %ulld\n", fsmemfree()); fslru(); - lomem = fsmemfree() < Mminfree; - if(lomem) - hidirty++; } - if(lodisk) + + if(fsdiskfree() < Dminfree){ + dZprint("fspolicy: low disk %ulld\n", fsdiskfree()); fsreclaim(); + } - if(lodisk || hidirty || (longago && fs->dirty.n != 0)) + if(!xcanqlock(&fs->policy)) /* another is doing it */ + return; + if(catcherror()){ + xqunlock(&fs->policy); + return; + } + longago = (fstime(nsec()) - fs->wtime)/NSPERSEC > Syncival; + if(fs->dirty.n == 0) + longago = 0; + if(fsdirtypcent() > Mmaxdirtypcent || longago){ + dZprint("fspolicy: dirties %d%% %s\n", + fsdirtypcent(), longago ? "long ago" : ""); fssync(); - if(lomem && hidirty) - fslru(); - - noerror(); - qunlock(&fs->policy); + } + xqunlock(&fs->policy); } uvlong --- /sys/src/cmd/creepy/ix.c Wed Apr 18 10:42:16 2012 +++ /sys/src/cmd/creepy/ix.c Tue Apr 17 13:35:47 2012 @@ -530,6 +530,8 @@ if(rpc0->fid != nil && (rpc0->fid->cflags&OCERR) != 0) rpc0->fid->cflags |= OCEND; }else{ + if(fs->halt != 0) + error("file system halted"); ixcalls[rpc->xt.type](rpc); quiescent(Yes); noerror();