Convert omode to 9p for devmnt [4/7]
authorBarret Rhoden <brho@cs.berkeley.edu>
Tue, 15 Sep 2015 16:15:22 +0000 (12:15 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Mon, 28 Sep 2015 19:14:00 +0000 (15:14 -0400)
9p expects the mode to match a format similar to POSIX, based on
http://man.cat-v.org/plan_9/5/open.  Since Akaros allows O_EXEC to be
or-ed with READ and WRITE, but 9p doesn't, we just treat O_EXEC as
O_READ for purposes of the conversion.

Note that we cannot express "no I/O permissions" across 9p.

kern/drivers/dev/mnt.c
kern/include/ns.h
kern/src/ns/util.c

index 21d1b10..af219d9 100644 (file)
@@ -525,7 +525,7 @@ static struct chan *mntopencreate(int type, struct chan *c, char *name,
        }
        r->request.type = type;
        r->request.fid = c->fid;
-       r->request.mode = omode & O_ACCMODE;    /* not using openmode, want O_EXEC */
+       r->request.mode = omode_to_9p_accmode(omode);
        if (omode & O_TRUNC)
                r->request.mode |= MNT_9P_OPEN_OTRUNC;
        if (omode & O_REMCLO)
index 6612e9a..ed4f386 100644 (file)
@@ -770,6 +770,7 @@ int nrand(int);
 uint64_t ns2fastticks(uint64_t);
 int okaddr(uint32_t, uint32_t, int);
 int omode_to_rwx(int);
+int omode_to_9p_accmode(int open_flags);
 struct block *packblock(struct block *);
 struct block *padblock(struct block *, int);
 
index 9bf0a01..8f5c373 100644 (file)
@@ -48,3 +48,21 @@ int omode_to_rwx(int open_flags)
                                  [O_EXEC] = 0100 };
        return rwx_opts[open_flags & O_ACCMODE];
 }
+
+/* Converts open mode flags related to permissions, e.g. O_RDWR, to 9p.  It's a
+ * bit ugly, since 9p (according to http://man.cat-v.org/plan_9/5/open) seems to
+ * require that O_EXEC is mutually exclusive with the others.  If someone on
+ * Akaros wants EXEC, we'll just substitute READ. */
+int omode_to_9p_accmode(int open_flags)
+{
+       static int acc_opts[] = { [O_RDWR | O_EXEC] = 2,
+                                 [O_WRITE | O_EXEC] = 2,
+                                 [O_READ | O_EXEC] = 0,
+                                 [O_EXEC] = 0,
+                                 [O_RDWR] = 2,
+                                 [O_WRITE] = 1,
+                                 [O_READ] = 0,
+                                 [0] = 0 /* we can't express no permissions */
+                                 };
+       return acc_opts[open_flags & O_ACCMODE];
+}