7 #define WMAGIC "kfs wren device\n"
9 typedef struct Wren Wren;
29 for(i = 0; i < maxwren; i++)
30 if(devcmp(dev, wrens[i].dev) == 0)
32 panic("can't find wren for %D", dev);
45 wrens = ialloc(MAXWREN * sizeof *wrens);
47 fd = open(wrenfile, ORDWR);
49 panic("can't open %s", wrenfile);
50 if((d = dirfstat(fd)) == nil)
51 panic("can't stat %s\n", wrenfile);
53 i = read(fd, buf, sizeof buf);
55 panic("can't read %s", wrenfile);
58 if(strncmp(buf+256, WMAGIC, strlen(WMAGIC)) == 0){
59 RBUFSIZE = atol(buf+256+strlen(WMAGIC));
61 fprint(2, "kfs: bad buffersize(%d): assuming 1k blocks\n", RBUFSIZE);
81 panic("kfs: bad buffersize(%d): restart a multiple of 512\n", RBUFSIZE);
82 if(RBUFSIZE > sizeof(buf))
83 panic("kfs: bad buffersize(%d): must be at most %d\n", RBUFSIZE, sizeof(buf));
85 print("kfs: reaming the file system using %d byte blocks\n", RBUFSIZE);
88 memset(buf, 0, sizeof buf);
89 sprint(buf+256, "%s%d\n", WMAGIC, RBUFSIZE);
91 i = seek(fd, 0, 0) < 0 || write(fd, buf, RBUFSIZE) != RBUFSIZE;
94 panic("can't ream disk");
98 wrentag(char *p, int tag, long qpath)
102 t = (Tag*)(p+BUFSIZE);
103 return t->tag != tag || (qpath&~QPDIR) != t->path;
107 wrencheck(Device dev)
109 char buf[MAXBUFSIZE];
113 if(RBUFSIZE > sizeof(buf))
114 panic("kfs: bad buffersize(%d): must be at most %d\n", RBUFSIZE, sizeof(buf));
116 if(wrenread(dev, wrensuper(dev), buf) || wrentag(buf, Tsuper, QPSUPER)
117 || wrenread(dev, wrenroot(dev), buf) || wrentag(buf, Tdir, QPROOT))
119 if(((Dentry *)buf)[0].mode & DALLOC)
127 return wren(dev)->size / RBUFSIZE;
131 wrensuper(Device dev)
145 wrenread(Device dev, long addr, void *b)
153 i = seek(fd, (vlong)addr*RBUFSIZE, 0) == -1 || read(fd, b, RBUFSIZE) != RBUFSIZE;
156 print("wrenread failed: %r\n");
161 wrenwrite(Device dev, long addr, void *b)
169 i = seek(fd, (vlong)addr*RBUFSIZE, 0) == -1 || write(fd, b, RBUFSIZE) != RBUFSIZE;
172 print("wrenwrite failed: %r\n");