diff --git a/sys/src/cmd/hjfs/check.c b/sys/src/cmd/hjfs/check.c new file mode 100644 index 000000000..edb11b75e --- /dev/null +++ b/sys/src/cmd/hjfs/check.c @@ -0,0 +1,70 @@ +#include +#include +#include +#include "dat.h" +#include "fns.h" + +extern Fs *fsmain; + +static void +checkdir(FLoc *l, Buf *b) +{ + Buf *c; + Dentry *d; + uvlong i, r; + + d = getdent(l, b); + for(i = 0; i < d->size; i++){ + if(getblk(fsmain, l, b, i, &r, GBREAD) <= 0) { + dprint("hjfs: directory %s in block %ulld at index %d has a bad block reference at %ulld\n", d->name, l->blk, l->deind, i); + continue; + } + c = getbuf(fsmain->d, r, TDENTRY, 0); + if(c == nil) { + dprint("hjfs: directory %s in block %ulld at index %d has a block %ulld that is not a directory entry\n", d->name, l->blk, l->deind, i); + continue; + } + } +} + +static void +checkfile(FLoc*, Buf*) +{} + +int +checkblk(uvlong blk) +{ + Dentry *d; + Buf *b; + FLoc l; + int i, type; + + b = getbuf(fsmain->d, blk, TDONTCARE, 0); + if(b == nil) + return -1; + switch(type = b->type){ + case TRAW: + break; + case TSUPERBLOCK: + dprint("hjfs: checkblk: should not have found superblock at %ulld\n", blk); + break; + case TDENTRY: + l.blk = blk; + for(i = 0; i < DEPERBLK; i++){ + d = &b->de[i]; + l.deind = i; + l.Qid = d->Qid; + if((d->type & QTDIR) != 0) + checkdir(&l, b); + else + checkfile(&l, b); + } + break; + case TINDIR: + break; + case TREF: + break; + } + putbuf(b); + return type; +} diff --git a/sys/src/cmd/hjfs/cons.c b/sys/src/cmd/hjfs/cons.c index bfe6bf938..e2bff60ba 100644 --- a/sys/src/cmd/hjfs/cons.c +++ b/sys/src/cmd/hjfs/cons.c @@ -103,6 +103,38 @@ cmdchatty(int, char **) return 0; } +int +cmdcheck(int, char**) +{ + uvlong fblk, fend, blk; + int j; + Buf *b, *sb; + + wlock(fsmain); + sb = getbuf(fsmain->d, SUPERBLK, TSUPERBLOCK, 0); + if(sb == nil){ + wunlock(fsmain); + return -1; + } + fblk = sb->sb.fstart; + fend = sb->sb.fend; + putbuf(sb); + + for(blk = 0; fblk < fend; fblk++){ + b = getbuf(fsmain->d, fblk, TREF, 0); + if(b == nil){ + blk += REFPERBLK; + continue; + } + for(j = 0; j < REFPERBLK; j++, blk++) + if(b->refs[j] == 0) + checkblk(blk); + putbuf(b); + } + wunlock(fsmain); + return 1; +} + int cmddisallow(int, char **) { diff --git a/sys/src/cmd/hjfs/fns.h b/sys/src/cmd/hjfs/fns.h index 0a2cb8667..788440993 100644 --- a/sys/src/cmd/hjfs/fns.h +++ b/sys/src/cmd/hjfs/fns.h @@ -54,3 +54,4 @@ int ingroup(Fs *, short, short, int); void workerinit(void); void writeusers(Fs *); void readusers(Fs *); +int checkblk(uvlong); diff --git a/sys/src/cmd/hjfs/fs1.c b/sys/src/cmd/hjfs/fs1.c index e01c84fb4..f543f8810 100644 --- a/sys/src/cmd/hjfs/fs1.c +++ b/sys/src/cmd/hjfs/fs1.c @@ -211,7 +211,7 @@ writeusers(Fs *fs) error: if(ch != nil) chanclunk(ch); - dprint("writeusers: %r\n"); + dprint("hjfs: writeusers: %r\n"); } void diff --git a/sys/src/cmd/hjfs/mkfile b/sys/src/cmd/hjfs/mkfile index b7064affc..ab13b8619 100644 --- a/sys/src/cmd/hjfs/mkfile +++ b/sys/src/cmd/hjfs/mkfile @@ -13,6 +13,7 @@ OFILES=\ 9p.$O\ dump.$O\ cons.$O\ + check.$O\ HFILES=\ dat.h\