1 51d1a81c 2007-05-28 devnull #include <u.h>
2 51d1a81c 2007-05-28 devnull #include <libc.h>
3 51d1a81c 2007-05-28 devnull #include <diskfs.h>
5 51d1a81c 2007-05-28 devnull typedef struct DiskPart DiskPart;
6 51d1a81c 2007-05-28 devnull struct DiskPart
8 51d1a81c 2007-05-28 devnull Disk disk;
9 51d1a81c 2007-05-28 devnull Disk *subdisk;
10 51d1a81c 2007-05-28 devnull u64int offset;
11 51d1a81c 2007-05-28 devnull u64int size;
14 51d1a81c 2007-05-28 devnull static Block*
15 51d1a81c 2007-05-28 devnull diskpartread(Disk *dd, u32int len, u64int offset)
17 51d1a81c 2007-05-28 devnull DiskPart *d = (DiskPart*)dd;
19 51d1a81c 2007-05-28 devnull if(offset+len > d->size){
20 703d3cbc 2007-05-29 devnull werrstr("read past end of partition %llud + %lud > %llud", offset, len, d->size);
21 51d1a81c 2007-05-28 devnull return nil;
23 51d1a81c 2007-05-28 devnull return diskread(d->subdisk, len, offset+d->offset);
26 51d1a81c 2007-05-28 devnull static int
27 51d1a81c 2007-05-28 devnull diskpartsync(Disk *dd)
29 51d1a81c 2007-05-28 devnull DiskPart *d = (DiskPart*)dd;
31 dcb5580c 2007-05-28 devnull if(d->subdisk)
32 dcb5580c 2007-05-28 devnull return disksync(d->subdisk);
33 dcb5580c 2007-05-28 devnull return 0;
36 51d1a81c 2007-05-28 devnull static void
37 51d1a81c 2007-05-28 devnull diskpartclose(Disk *dd)
39 51d1a81c 2007-05-28 devnull DiskPart *d = (DiskPart*)dd;
41 dcb5580c 2007-05-28 devnull if(d->subdisk)
42 dcb5580c 2007-05-28 devnull diskclose(d->subdisk);
47 dcb5580c 2007-05-28 devnull diskpart(Disk *subdisk, u64int offset, u64int size)
49 51d1a81c 2007-05-28 devnull DiskPart *d;
51 51d1a81c 2007-05-28 devnull d = mallocz(sizeof(DiskPart), 1);
52 51d1a81c 2007-05-28 devnull if(d == nil)
53 51d1a81c 2007-05-28 devnull return nil;
55 51d1a81c 2007-05-28 devnull d->subdisk = subdisk;
56 51d1a81c 2007-05-28 devnull d->offset = offset;
57 51d1a81c 2007-05-28 devnull d->size = size;
58 51d1a81c 2007-05-28 devnull d->disk._read = diskpartread;
59 51d1a81c 2007-05-28 devnull d->disk._sync = diskpartsync;
60 51d1a81c 2007-05-28 devnull d->disk._close = diskpartclose;
62 51d1a81c 2007-05-28 devnull return &d->disk;
66 dcb5580c 2007-05-28 devnull diskpartabandon(Disk *d)
68 dcb5580c 2007-05-28 devnull if(d->_read != diskpartread)
70 d63163af 2007-05-28 devnull ((DiskPart*)d)->subdisk = nil;