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* diskcache(Disk*, uint, uint);
|
||||||
Disk* diskopenventi(struct VtCache*, uchar*);
|
Disk* diskopenventi(struct VtCache*, uchar*);
|
||||||
Disk* diskopenfile(char *file);
|
Disk* diskopenfile(char *file);
|
||||||
|
Disk* diskpart(Disk*, u64int offset, u64int count);
|
||||||
|
|
||||||
Disk* diskopen(char *file);
|
Disk* diskopen(char *file);
|
||||||
void diskclose(Disk *disk);
|
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