9 initpart(char *name, int writable)
16 part->name = estrdup(name);
17 if(!writable && readonly)
21 part->fd = open(name, how);
24 part->fd = open(name, OREAD);
27 seterr(EOk, "can't open partition='%s': %r", name);
30 fprint(2, "warning: %s opened for reading only\n", name);
32 dir = dirfstat(part->fd);
35 seterr(EOk, "can't stat partition='%s': %r", name);
38 part->size = dir->length;
55 partblocksize(Part *part, u32int blocksize)
58 sysfatal("resetting partition=%s's block size", part->name);
59 part->blocksize = blocksize;
60 if(blocksize > maxblocksize)
61 maxblocksize = blocksize;
65 writepart(Part *part, u64int addr, u8int *buf, u32int n)
71 stats.diskbwrites += n;
74 if(addr > part->size || addr + n > part->size){
75 seterr(ECorrupt, "out of bounds write to partition='%s'", part->name);
78 print("write %s %lud at %llud\n", part->name, n, addr);
79 for(nn = 0; nn < n; nn += m){
83 m = pwrite(part->fd, &buf[nn], mm, addr + nn);
86 seterr(EOk, "can't write partition='%s': %r", part->name);
89 logerr(EOk, "truncated write to partition='%s' n=%ld wrote=%ld", part->name, mm, m);
96 readpart(Part *part, u64int addr, u8int *buf, u32int n)
103 stats.diskbreads += n;
104 qunlock(&stats.lock);
106 if(addr > part->size || addr + n > part->size){
107 seterr(ECorrupt, "out of bounds read from partition='%s': addr=%lld n=%d size=%lld", part->name, addr, n, part->size);
110 print("read %s %lud at %llud\n", part->name, n, addr);
111 for(nn = 0; nn < n; nn += m){
117 m = pread(part->fd, &buf[nn], mm, addr + nn);
123 seterr(EOk, "can't read partition='%s': %r", part->name);
126 logerr(EOk, "warning: truncated read from partition='%s' n=%ld read=%ld", part->name, mm, m);