ref: aa0d4ea543fec82928fc1ff6f57eb681e1b50716
author: Sigrid Solveig Haflínudóttir <ftrvxmtrx@gmail.com>
date: Tue Nov 3 14:25:47 EST 2020
wip
--- /dev/null
+++ b/.gitignore
@@ -1,0 +1,2 @@
+*.[0125678vqki]
+[0125678vqki].*
--- /dev/null
+++ b/README.md
@@ -1,0 +1,3 @@
+# ext4srv
+
+Ext[2-4] file system for Plan 9. *WIP*
--- /dev/null
+++ b/ext4srv.c
@@ -1,0 +1,265 @@
+#include <ext4.h>
+#include <fcall.h>
+#include <thread.h>
+#include <9p.h>
+
+typedef struct Aux Aux;
+typedef struct Root Root;
+
+struct Aux {
+ int type;
+ Aux *raux;
+ union {
+ ext4_file *file;
+ ext4_dir *dir;
+ Root *r;
+ };
+};
+
+struct Root {
+ struct ext4_blockdev *dev;
+ QLock lock;
+ int id;
+ int f;
+};
+
+enum {
+ Aroot,
+ Afile,
+ Adir,
+
+ Frdonly = 1<<0,
+};
+
+#define BDEV2AUX(bdev) (Aux*)(bdev-1)
+
+static int
+bdopen(struct ext4_blockdev *bdev)
+{
+ Aux *a;
+
+ a = BDEV2AUX(bdev);
+
+ return 0;
+}
+
+static int
+bdread(struct ext4_blockdev *bdev, void *buf, u64int blkid, u32int blkcnt)
+{
+ Aux *a;
+
+ a = BDEV2AUX(bdev);
+
+ return 0;
+}
+
+static int
+bdwrite(struct ext4_blockdev *bdev, const void *buf, u64int blkid, u32int blkcnt)
+{
+ Aux *a;
+
+ a = BDEV2AUX(bdev);
+
+ return 0;
+}
+
+static int
+bdnowrite(struct ext4_blockdev *bdev, const void *buf, u64int blkid, u32int blkcnt)
+{
+ USED(bdev, buf, blkid, blkcnt);
+
+ return -1;
+}
+
+static int
+bdclose(struct ext4_blockdev *bdev)
+{
+ Aux *a;
+
+ a = BDEV2AUX(bdev);
+
+ return 0;
+}
+
+static int
+bdlock(struct ext4_blockdev *bdev)
+{
+ Aux *a;
+
+ a = BDEV2AUX(bdev);
+ qlock(&a->root.b.lock);
+
+ return 0;
+}
+
+static int
+bdunlock(struct ext4_blockdev *bdev)
+{
+ Aux *a;
+
+ a = BDEV2AUX(bdev);
+ qunlock(&a->root.b.lock);
+
+ return 0;
+}
+
+static Aux *
+newroot(char *dev, int flags)
+{
+ static int newid;
+ static QLock lock;
+ int id;
+ Aux *a;
+ Root *r;
+ int f;
+
+ qlock(&lock);
+ id = newid++;
+ if(id < 0){
+ werrstr("root id overflow");
+ /* no unlock on purpose, get stuck forever */
+ return nil;
+ }
+ qunlock(&lock);
+
+ if((f = open(dev, ORDWR)) < 0)
+ return nil;
+
+ if((a = calloc(1, sizeof(*a)+sizeof(*r)) == nil){
+ close(f);
+ return nil;
+ }
+ a->type = Aroot;
+ a->raux = a;
+ a->r = r = (struct ext4_blockdev*)(a+1);
+
+ r->open = bdopen;
+ r->bread = bdread;
+ r->bwrite = (flags & Frdonly) != 0 ? bdwrite : bdnowrite;
+ r->close = bdclose;
+ r->lock = bdlock;
+ r->unlock = bdunlock;
+ r->ph_bsize =
+
+ return a;
+}
+
+static struct ext4_blockdev_iface iface0 = {
+
+ /**@brief Block size (bytes): physical*/
+ uint32_t ph_bsize;
+
+ /**@brief Block count: physical*/
+ uint64_t ph_bcnt;
+
+ /**@brief Block size buffer: physical*/
+ uint8_t *ph_bbuf;
+
+ /**@brief Reference counter to block device interface*/
+ uint32_t ph_refctr;
+
+ /**@brief Physical read counter*/
+ uint32_t bread_ctr;
+
+ /**@brief Physical write counter*/
+ uint32_t bwrite_ctr;
+
+ /**@brief User data pointer*/
+ void* p_user;
+
+static void
+rattach(Req *r)
+{
+}
+
+static void
+rauth(Req *r)
+{
+}
+
+static void
+ropen(Req *r)
+{
+}
+
+static void
+rcreate(Req *r)
+{
+}
+
+static void
+rread(Req *r)
+{
+}
+
+static void
+rwrite(Req *r)
+{
+}
+
+static void
+rremove(Req *r)
+{
+}
+
+static void
+rstat(Req *r)
+{
+}
+
+static void
+rwstat(Req *r)
+{
+}
+
+static char *
+rwalk1(Fid *fid, char *name, Qid *qid)
+{
+ return nil;
+}
+
+static char *
+rclone(Fid *oldfid, Fid *newfid)
+{
+ return nil;
+}
+
+static void
+rdestroyfid(Fid *fid)
+{
+}
+
+static void
+rstart(Srv *s)
+{
+}
+
+static void
+rend(Srv *s)
+{
+}
+
+static Srv fs = {
+ .attach = rattach,
+ .open = ropen,
+ .create = rcreate,
+ .read = rread,
+ .write = rwrite,
+ .remove = rremove,
+ .stat = rstat,
+ .wstat = rwstat,
+ .walk1 = rwalk1,
+ .clone = rclone,
+ .destroyfid = rdestroyfid,
+ .start = rstart,
+ .end = rend,
+};
+
+void
+threadmain(int argc, char **argv)
+{
+ ARGBEGIN{
+ }ARGEND
+
+ threadexitsall(nil);
+}
--- /dev/null
+++ b/mkfile
@@ -1,0 +1,14 @@
+</$objtype/mkfile
+
+BIN=/$objtype/bin
+TARG=ext4srv
+CFLAGS=$CFLAGS -p -I../lwext4/include/plan9 -I../lwext4/include
+
+HFILES=\
+
+OFILES=\
+ ext4srv.$O\
+
+default:V: all
+
+</sys/src/cmd/mkone