add disk partitions (David Swasey)
This commit is contained in:
parent
27c1d3a436
commit
51d1a81c38
2 changed files with 61 additions and 0 deletions
|
|
@ -68,6 +68,7 @@ void blockput(Block *b);
|
|||
Disk* diskcache(Disk*, uint, uint);
|
||||
Disk* diskopenventi(struct VtCache*, uchar*);
|
||||
Disk* diskopenfile(char *file);
|
||||
Disk* diskpart(Disk*, u64int offset, u64int count);
|
||||
|
||||
Disk* diskopen(char *file);
|
||||
void diskclose(Disk *disk);
|
||||
|
|
|
|||
60
src/libdiskfs/part.c
Normal file
60
src/libdiskfs/part.c
Normal file
|
|
@ -0,0 +1,60 @@
|
|||
#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;
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue