Blame


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>
4 51d1a81c 2007-05-28 devnull
5 51d1a81c 2007-05-28 devnull typedef struct DiskPart DiskPart;
6 51d1a81c 2007-05-28 devnull struct DiskPart
7 51d1a81c 2007-05-28 devnull {
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;
12 51d1a81c 2007-05-28 devnull };
13 51d1a81c 2007-05-28 devnull
14 51d1a81c 2007-05-28 devnull static Block*
15 51d1a81c 2007-05-28 devnull diskpartread(Disk *dd, u32int len, u64int offset)
16 51d1a81c 2007-05-28 devnull {
17 51d1a81c 2007-05-28 devnull DiskPart *d = (DiskPart*)dd;
18 51d1a81c 2007-05-28 devnull
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;
22 51d1a81c 2007-05-28 devnull }
23 51d1a81c 2007-05-28 devnull return diskread(d->subdisk, len, offset+d->offset);
24 51d1a81c 2007-05-28 devnull }
25 51d1a81c 2007-05-28 devnull
26 51d1a81c 2007-05-28 devnull static int
27 51d1a81c 2007-05-28 devnull diskpartsync(Disk *dd)
28 51d1a81c 2007-05-28 devnull {
29 51d1a81c 2007-05-28 devnull DiskPart *d = (DiskPart*)dd;
30 fa325e9b 2020-01-10 cross
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;
34 51d1a81c 2007-05-28 devnull }
35 51d1a81c 2007-05-28 devnull
36 51d1a81c 2007-05-28 devnull static void
37 51d1a81c 2007-05-28 devnull diskpartclose(Disk *dd)
38 51d1a81c 2007-05-28 devnull {
39 51d1a81c 2007-05-28 devnull DiskPart *d = (DiskPart*)dd;
40 fa325e9b 2020-01-10 cross
41 dcb5580c 2007-05-28 devnull if(d->subdisk)
42 dcb5580c 2007-05-28 devnull diskclose(d->subdisk);
43 51d1a81c 2007-05-28 devnull free(d);
44 51d1a81c 2007-05-28 devnull }
45 51d1a81c 2007-05-28 devnull
46 51d1a81c 2007-05-28 devnull Disk*
47 dcb5580c 2007-05-28 devnull diskpart(Disk *subdisk, u64int offset, u64int size)
48 51d1a81c 2007-05-28 devnull {
49 51d1a81c 2007-05-28 devnull DiskPart *d;
50 fa325e9b 2020-01-10 cross
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;
54 fa325e9b 2020-01-10 cross
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;
61 fa325e9b 2020-01-10 cross
62 51d1a81c 2007-05-28 devnull return &d->disk;
63 51d1a81c 2007-05-28 devnull }
64 dcb5580c 2007-05-28 devnull
65 dcb5580c 2007-05-28 devnull void
66 dcb5580c 2007-05-28 devnull diskpartabandon(Disk *d)
67 dcb5580c 2007-05-28 devnull {
68 dcb5580c 2007-05-28 devnull if(d->_read != diskpartread)
69 dcb5580c 2007-05-28 devnull abort();
70 d63163af 2007-05-28 devnull ((DiskPart*)d)->subdisk = nil;
71 dcb5580c 2007-05-28 devnull }