61 lines
966 B
C
61 lines
966 B
C
|
|
#include <u.h>
|
||
|
|
#include <libc.h>
|
||
|
|
#include <diskfs.h>
|
||
|
|
|
||
|
|
typedef struct DiskPart DiskPart;
|
||
|
|
struct DiskPart
|
||
|
|
{
|
||
|
|
Disk disk;
|
||
|
|
Disk *subdisk;
|
||
|
|
u64int offset;
|
||
|
|
u64int size;
|
||
|
|
};
|
||
|
|
|
||
|
|
static Block*
|
||
|
|
diskpartread(Disk *dd, u32int len, u64int offset)
|
||
|
|
{
|
||
|
|
DiskPart *d = (DiskPart*)dd;
|
||
|
|
|
||
|
|
if(offset+len > d->size){
|
||
|
|
werrstr("read past region %llud + %lud > %llud", offset, len, d->size);
|
||
|
|
return nil;
|
||
|
|
}
|
||
|
|
return diskread(d->subdisk, len, offset+d->offset);
|
||
|
|
}
|
||
|
|
|
||
|
|
static int
|
||
|
|
diskpartsync(Disk *dd)
|
||
|
|
{
|
||
|
|
DiskPart *d = (DiskPart*)dd;
|
||
|
|
|
||
|
|
return disksync(d->subdisk);
|
||
|
|
}
|
||
|
|
|
||
|
|
static void
|
||
|
|
diskpartclose(Disk *dd)
|
||
|
|
{
|
||
|
|
DiskPart *d = (DiskPart*)dd;
|
||
|
|
|
||
|
|
diskclose(d->subdisk);
|
||
|
|
free(d);
|
||
|
|
}
|
||
|
|
|
||
|
|
Disk*
|
||
|
|
diskpart(Disk *subdisk, u64int size, u64int offset)
|
||
|
|
{
|
||
|
|
DiskPart *d;
|
||
|
|
|
||
|
|
d = mallocz(sizeof(DiskPart), 1);
|
||
|
|
if(d == nil)
|
||
|
|
return nil;
|
||
|
|
|
||
|
|
d->subdisk = subdisk;
|
||
|
|
d->offset = offset;
|
||
|
|
d->size = size;
|
||
|
|
d->disk._read = diskpartread;
|
||
|
|
d->disk._sync = diskpartsync;
|
||
|
|
d->disk._close = diskpartclose;
|
||
|
|
|
||
|
|
return &d->disk;
|
||
|
|
}
|