add disk partitions (David Swasey)

This commit is contained in:
rsc 2007-05-28 17:34:27 +00:00
parent 27c1d3a436
commit 51d1a81c38
2 changed files with 61 additions and 0 deletions

View file

@ -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
View 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;
}