Blob


1 #include <u.h>
2 #include <libc.h>
3 #include <diskfs.h>
5 typedef struct DiskPart DiskPart;
6 struct DiskPart
7 {
8 Disk disk;
9 Disk *subdisk;
10 u64int offset;
11 u64int size;
12 };
14 static Block*
15 diskpartread(Disk *dd, u32int len, u64int offset)
16 {
17 DiskPart *d = (DiskPart*)dd;
19 if(offset+len > d->size){
20 werrstr("read past end of partition %llud + %lud > %llud", offset, len, d->size);
21 return nil;
22 }
23 return diskread(d->subdisk, len, offset+d->offset);
24 }
26 static int
27 diskpartsync(Disk *dd)
28 {
29 DiskPart *d = (DiskPart*)dd;
31 if(d->subdisk)
32 return disksync(d->subdisk);
33 return 0;
34 }
36 static void
37 diskpartclose(Disk *dd)
38 {
39 DiskPart *d = (DiskPart*)dd;
41 if(d->subdisk)
42 diskclose(d->subdisk);
43 free(d);
44 }
46 Disk*
47 diskpart(Disk *subdisk, u64int offset, u64int size)
48 {
49 DiskPart *d;
51 d = mallocz(sizeof(DiskPart), 1);
52 if(d == nil)
53 return nil;
55 d->subdisk = subdisk;
56 d->offset = offset;
57 d->size = size;
58 d->disk._read = diskpartread;
59 d->disk._sync = diskpartsync;
60 d->disk._close = diskpartclose;
62 return &d->disk;
63 }
65 void
66 diskpartabandon(Disk *d)
67 {
68 if(d->_read != diskpartread)
69 abort();
70 ((DiskPart*)d)->subdisk = nil;
71 }