History

some work done (still not working)

Matthew Veety committed 10 years agomaster

Commit f11183d1 parent 109f16c5 files · +137 −30Browse files

Unified · Split

5 files
  1. blockalloc.h +2 −2
  2. disk.c +3 −6
  3. mkfile +8 −2
  4. ream.c +25 −20
  5. tests/ream-test.c +99 −0
blockalloc.h+2−2
@@ -92,5 +92,5 @@ u64int dread(Disk*,void*,u64int,u64int); · 91 unmodified lines
9292 u64int dwrite(Disk*,void*,u64int,u64int);
9393
9494 /* ream.c */
95−int ream(int,u64int);
96−int ream1(int,u64int,u64int,u64int,u64int);
95+int ream(int,u64int,int);
96+int ream1(int,u64int,u64int,u64int,u64int,int);
disk.c+3−6
@@ -89,10 +89,10 @@ closedisk(Disk* d) · 88 unmodified lines
8989 }
9090
9191 int
92−fd2disk(int fd, Disk* d, uchar opts)
92+fd2disk(int fd, Disk *bf, uchar opts)
9393 {
9494 Fn *f = infn("fd2disk");
95− Disk *bf = malloc(sizeof(Disk));
95+ bf = malloc(sizeof(Disk));
9696 Metablock *m = malloc(sizeof(Metablock));
9797 bf->fd = fd;
9898 bf->size = (u64int)seek(bf->fd,0,2);
@@ -112,20 +112,17 @@ fd2disk(int fd, Disk* d, uchar opts) · 13 unmodified lines
112112 bf->blocks_cached = 1;
113113 if(loadbptrs(bf) == 0){
114114 if(disksyncer(bf) == 0){
115− d = bf;
116115 outfn(f);
117116 return 0;
118117 }
119118 action(f,"syncer did not start (rfork error)");
120− free(d->ptrs);
119+ free(bf->ptrs);
121120 bf->blocks_cached = 0;
122− d = bf;
123121 outfn(f);
124122 return -3;
125123 }
126124 action(f,"failure to enable caching");
127125 }
128− d = bf;
129126 outfn(f);
130127 return 0;
131128 }
mkfile+8−2
@@ -27,10 +27,12 @@ UPDATE=\ · 26 unmodified lines
2727
2828 CLEANFILES=\
2929 ftrace-test \
30+ ream-test \
3031 tests.log \
3132
3233 TESTS=\
3334 ftrace-test \
35+ ream-test \
3436
3537 all:V: $LIB
3638
@@ -38,12 +40,16 @@ ftrace-test: · 1 unmodified line
3840 $CC tests/ftrace-test.c
3941 $LD -o ftrace-test ftrace-test.$O
4042
43+ream-test:
44+ $CC tests/ream-test.c
45+ $LD -o ream-test ream-test.$O
46+
4147 installheaders:
4248 for(i in $HFILES){
4349 cp $i /sys/include
4450 }
4551
46−run-tests:EVQ: ftrace-test
52+run-tests:EVQ: ftrace-test ream-test
4753 echo 'running tests...'
4854 {
4955 echo -n 'tests started at '
@@ -55,7 +61,7 @@ run-tests:EVQ: ftrace-test · 5 unmodified lines
5561 echo '-----------------------------------------------------'
5662 }
5763 echo 'tests done.'
58− } > tests.log
64+ } > tests.log
5965
6066 </sys/src/cmd/mksyslib
6167
ream.c+25−20
@@ -3,7 +3,7 @@ · 2 unmodified lines
33 #include <blockalloc.h>
44
55 int
6−ream(int fd, u64int blocksize)
6+ream(int fd, u64int blocksize, int fmtblocks)
77 {
88 Fn *f = infn("ream");
99 u64int disksize = seek(fd,0,2); seek(fd,0,0);
@@ -12,15 +12,15 @@ ream(int fd, u64int blocksize) · 2 unmodified lines
1212 u64int ptrmaplen = (bmapsize/blocksize)*sizeof(BlockptrODF);
1313 u64int bmapstart = ptrmaplen+sizeof(BlockptrODF);
1414 u64int totalblocks = bmapsize/blocksize;
15− int retval = ream1(fd,blocksize,ptrmapstart,bmapstart,totalblocks);
15+ int retval = ream1(fd,blocksize,ptrmapstart,bmapstart,totalblocks,fmtblocks);
1616 action(f,smprint("retval = %d",retval));
1717 if(retval == 0){
18− action(f,smprint("disksize = %d bytes",disksize));
19− action(f,smprint("ptrmapstart = %x",ptrmapstart));
20− action(f,smprint("ptrmaplen = %d bytes",ptrmaplen));
21− action(f,smprint("bmapstart = %x",bmapstart));
22− action(f,smprint("bmapsize = %d bytes",bmapsize));
23− action(f,smprint("totalblocks = %d of %d byte blocks",totalblocks,blocksize));
18+ action(f,smprint("disksize = %ulld bytes",disksize));
19+ action(f,smprint("ptrmapstart = %ullx",ptrmapstart));
20+ action(f,smprint("ptrmaplen = %ulld bytes",ptrmaplen));
21+ action(f,smprint("bmapstart = %ullx",bmapstart));
22+ action(f,smprint("bmapsize = %ulld bytes",bmapsize));
23+ action(f,smprint("totalblocks = %ulld of %ulld byte blocks",totalblocks,blocksize));
2424 } else {
2525 switch(retval){
2626 case -1:
@@ -39,10 +39,11 @@ ream(int fd, u64int blocksize) · 12 unmodified lines
3939 }
4040
4141 int
42−ream1(int fd, u64int blocksize, u64int ptrmapstart, u64int bmapstart, u64int totalblocks)
42+ream1(int fd, u64int blocksize, u64int ptrmapstart, u64int bmapstart, u64int totalblocks, int fmtblocks)
4343 {
4444 Fn *f = infn("ream1");
4545 Metablock *m = mallocz(sizeof(Metablock),0);
46+ Metablock *w = mallocz(sizeof(Metablock),0);
4647 BlockptrODF *blocks;
4748 if(m == nil){
4849 shit(f,"malloc failed");
@@ -55,7 +56,7 @@ ream1(int fd, u64int blocksize, u64int ptrmapstart, u64int bmapstart, u64int tot · 6 unmodified lines
5556 m->bitmapstart = bmapstart;
5657 // sanity checking
5758 if(((bmapstart-ptrmapstart)/sizeof(BlockptrODF)) >= totalblocks){
58− shit(f,smprint("ptrmap not large enough (failed: %x >= %x)",
59+ shit(f,smprint("ptrmap not large enough (failed: %ullx >= %ullx)",
5960 ((bmapstart-ptrmapstart)/sizeof(BlockptrODF)),
6061 totalblocks));
6162 outfn(f);
@@ -70,6 +71,8 @@ ream1(int fd, u64int blocksize, u64int ptrmapstart, u64int bmapstart, u64int tot · 8 unmodified lines
7071 return -5;
7172 }
7273 u64int written = pwriten(fd,m,0,sizeof(Metablock));
74+ u64int readback = preadn(fd,w,0,sizeof(Metablock));
75+ action(f,smprint("readback = %ulld, blocksize = %ulld, ptrmapstart = %ulld, totalblocks = %ulld, bitmapstart = %ulld",readback, w->blocksize, w->ptrmapstart, w->totalblocks, w->bitmapstart));
7376 if(written < sizeof(Metablock)){
7477 shit(f,smprint("whole metablock not written"));
7578 outfn(f);
@@ -81,16 +84,18 @@ ream1(int fd, u64int blocksize, u64int ptrmapstart, u64int bmapstart, u64int tot · 5 unmodified lines
8184 outfn(f);
8285 return -7;
8386 }
84− action(f,"formatting blocks");
85− for(u64int i = 0; i<totalblocks; i++){
86− blocks[i].used = 0;
87− blocks[i].offset = blocksize*i;
88− }
89− written = pwriten(fd,blocks,ptrmapstart,sizeof(BlockptrODF)*totalblocks);
90− if(written < (sizeof(BlockptrODF)*totalblocks)){
91− shit(f,"all blocksptrs not written");
92− outfn(f);
93− return -8;
87+ if(fmtblocks){
88+ action(f,"formatting blocks");
89+ for(u64int i = 0; i<totalblocks; i++){
90+ blocks[i].used = 0;
91+ blocks[i].offset = blocksize*i;
92+ }
93+ written = pwriten(fd,blocks,ptrmapstart,sizeof(BlockptrODF)*totalblocks);
94+ if(written < (sizeof(BlockptrODF)*totalblocks)){
95+ shit(f,"all blocksptrs not written");
96+ outfn(f);
97+ return -8;
98+ }
9499 }
95100 action(f,"ream done. cleaning up");
96101 free(m);
tests/ream-test.c+99−0
@@ -0,0 +1,99 @@
1+#include <u.h>
2+#include <libc.h>
3+#include <blockalloc.h>
4+
5+#define LIKE50MB 52428800
6+
7+int createtestfile(void);
8+int sproc(char*,char*[]);
9+int crucify(int);
10+
11+int disksimpid;
12+
13+void
14+main(int argc, char *argv[])
15+{
16+ initinstru();
17+ Fn *f = infn("main");
18+ action(f,"creating virtual sd device sdTT");
19+ int fd = createtestfile();
20+ if(fd<0){
21+// crucify(disksimpid);
22+ upanic(f,smprint("unable to open device /dev/sdTT/data. errstr = %r"));
23+ }
24+ action(f,"reaming with blocksize 1024");
25+ int retval = ream(fd,1024,0);
26+ if(retval == -2)
27+ upanic(f,smprint("ream short read errstr = %r"));
28+ action(f,smprint("ream retval = %d",retval));
29+ Disk *d;
30+ action(f,smprint("d(ptr) = %p",d));
31+ retval = fd2disk(fd,d,0);
32+ action(f,smprint("fd2disk retval = %d",retval));
33+ action(f,smprint("d(ptr) = %p",d));
34+ u64int blocksize = d->meta->blocksize;
35+ u64int ptrmapstart = d->meta->ptrmapstart;
36+ u64int totalblocks = d->meta->totalblocks;
37+ u64int bitmapstart = d->meta->bitmapstart;
38+ u64int dsize = d->size;
39+ action(f,smprint("blocksize = %d",d->meta->blocksize));
40+ action(f,smprint("ptrmapstart = %d",d->meta->ptrmapstart));
41+ action(f,smprint("totalblocks = %d",d->meta->totalblocks));
42+ action(f,smprint("bitmapstart = %d",d->meta->bitmapstart));
43+ action(f,smprint("disk size = %d",d->size));
44+ close(fd);
45+ crucify(disksimpid);
46+ action(f,"done");
47+ outfn(f);
48+ exits(nil);
49+}
50+
51+int
52+createtestfile(void)
53+{
54+ Fn *f = infn("createtestfile");
55+ action(f,"running disksim");
56+// char *dsargs[] = { "aux/disksim","sdTT",0 };
57+// disksimpid = sproc("/bin/aux/disksim",dsargs);
58+// sleep(2);
59+// int fd = open("/dev/sdTT/ctl",OWRITE|OREAD);
60+// if(fd<0)
61+// upanic(f,"could not open /dev/sdTT/ctl");
62+// fprint(fd,"geometry %d 512 0 0 0",LIKE50MB*2);
63+// close(fd);
64+ outfn(f);
65+ return open("/n/ram/testdisk.img",OWRITE|OREAD);
66+}
67+
68+int
69+sproc(char *execf, char *args[])
70+{
71+ Fn *f = infn("sproc");
72+ int pid;
73+ if((pid = fork()) == 0){
74+ Fn *f2 = infn(smprint("sproc [pid %d]",getpid()));
75+ action(f2,smprint("calling %s",execf));
76+ int x = exec(execf,args);
77+ char *s = malloc(sizeof(char)*1024);
78+ if(s == nil)
79+ upanic(f2,"unable to malloc");
80+ errstr(s,1024);
81+ upanic(f2,smprint("unable to exec. retval = %d, errstr = %s",x,s));
82+ }
83+ outfn(f);
84+ return pid;
85+}
86+
87+int
88+crucify(int pid)
89+{
90+ Fn *f = infn("crucify");
91+ int fd = open(smprint("/proc/%d/ctl"),OWRITE);
92+ if(fd<0)
93+ return -1;
94+ fprint(fd,"kill\n");
95+ close(fd);
96+ action(f,smprint("the process %d met his destiny.",pid));
97+ outfn(f);
98+ return 0;
99+}