Commit Diff


commit - 27c1d3a4367ddc499d79183b33bacdd0542ed30f
commit + 51d1a81c38d5ac3f89d2f22e11545b786040f198
blob - df28e606f7b417cc132f8e8a323b94e2be60a203
blob + 50366ef2b0dc67f1ea69929fb202cfb9d50065d8
--- include/diskfs.h
+++ include/diskfs.h
@@ -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);
blob - /dev/null
blob + d156457d5fcbad85f29a430a012bc39e6a1384c7 (mode 644)
--- /dev/null
+++ src/libdiskfs/part.c
@@ -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;
+}