11 initpart(char *name, int writable)
18 part->name = estrdup(name);
19 if(!writable && readonly)
23 part->fd = open(name, how);
26 part->fd = open(name, OREAD);
29 seterr(EOk, "can't open partition='%s': %r", name);
32 fprint(2, "warning: %s opened for reading only\n", name);
34 dir = dirfstat(part->fd);
37 seterr(EOk, "can't stat partition='%s': %r", name);
40 part->size = dir->length;
57 partblocksize(Part *part, u32int blocksize)
60 sysfatal("resetting partition=%s's block size", part->name);
61 part->blocksize = blocksize;
62 if(blocksize > maxblocksize)
63 maxblocksize = blocksize;
67 writepart(Part *part, u64int addr, u8int *buf, u32int n)
73 stats.diskbwrites += n;
76 if(addr > part->size || addr + n > part->size){
77 seterr(ECorrupt, "out of bounds write to partition='%s'", part->name);
80 if(trace) print("write %s %lud at %llud\n", part->name, n, addr);
81 for(nn = 0; nn < n; nn += m){
85 m = pwrite(part->fd, &buf[nn], mm, addr + nn);
88 seterr(EOk, "can't write partition='%s': %r", part->name);
91 logerr(EOk, "truncated write to partition='%s' n=%ld wrote=%ld", part->name, mm, m);
98 readpart(Part *part, u64int addr, u8int *buf, u32int n)
105 stats.diskbreads += n;
106 qunlock(&stats.lock);
108 if(addr > part->size || addr + n > part->size){
109 seterr(ECorrupt, "out of bounds read from partition='%s': addr=%lld n=%d size=%lld", part->name, addr, n, part->size);
112 if(trace) print("read %s %lud at %llud\n", part->name, n, addr);
113 for(nn = 0; nn < n; nn += m){
119 m = pread(part->fd, &buf[nn], mm, addr + nn);
125 seterr(EOk, "can't read partition='%s': %r", part->name);
128 logerr(EOk, "warning: truncated read from partition='%s' n=%ld read=%ld", part->name, mm, m);