9ns: Make QTFILE == 0. Goddamn 9p
authorBarret Rhoden <brho@cs.berkeley.edu>
Tue, 20 Mar 2018 19:55:00 +0000 (15:55 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Mon, 30 Apr 2018 18:33:44 +0000 (14:33 -0400)
This is annoying, but translating qids back and forth just for one bit
isn't worth the bugs.

Zero wouldn't be as bad if there were a bunch of *values* for qid.type, so
that we're just doing == checks or switches  (still, don't use zero).  But
it's bits!  The worst possible decision.

This is OK, and you see it everywhere:

c->qid.type & QTDIR

this isn't, since QTFILE has the value 0:

c->qid.type & QTFILE

This is the same shit with O_READ modes.

Goddamn.

Told-off-by: Barret Rhoden <brho@cs.berkeley.edu>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/include/ns.h
kern/include/tree_file.h
kern/src/mm.c
kern/src/ns/fs_file.c
kern/src/ns/tree_file.c

index 188a165..77c5404 100644 (file)
@@ -116,7 +116,7 @@ extern int parseether(uint8_t * unused_uint8_p_t, char *unused_char_p_t);
 #define QTMOUNT                0x10    /* type bit for mounted channel */
 #define QTAUTH         0x08    /* type bit for authentication file */
 #define QTSYMLINK      0x02    /* type bit for symlinks */
-#define QTFILE         0x01    /* plain file */
+#define QTFILE         0x00    /* plain file.  Yeah, a zero.  Fucking 9p. */
 
 /* bits in Dir.mode */
 #define DMDIR          0x80000000      /* mode bit for directories */
@@ -136,6 +136,11 @@ struct qid {
        uint8_t type;
 };
 
+static inline bool qid_is_file(struct qid q)
+{
+       return (q.type & (QTDIR | QTSYMLINK)) == 0;
+}
+
 struct dir {
        /* system-modified data */
        uint16_t type;                          /* server type */
index fdc963a..71b78e9 100644 (file)
@@ -200,7 +200,7 @@ static inline bool tree_file_is_dir(struct tree_file *tf)
 
 static inline bool tree_file_is_file(struct tree_file *tf)
 {
-       return tree_file_to_qid(tf).type & QTFILE ? true : false;
+       return qid_is_file(tree_file_to_qid(tf));
 }
 
 static inline bool tree_file_is_symlink(struct tree_file *tf)
index 971c1e6..eb48d74 100644 (file)
@@ -82,7 +82,7 @@ ssize_t foc_read(struct file_or_chan *foc, void *buf, size_t amt, off64_t off)
 
        switch (foc->type) {
        case F_OR_C_CHAN:
-               if (!(foc->chan->qid.type & QTFILE))
+               if (!qid_is_file(foc->chan->qid))
                        return -1;
                if (!waserror())
                        ret = devtab[foc->chan->type].read(foc->chan, buf, amt, off);
index dc556df..db9b0e2 100644 (file)
@@ -84,8 +84,6 @@ void fs_file_init_dir(struct fs_file *f, int dir_type, int dir_dev,
                dir->qid.type |= QTEXCL;
        if (perm & DMSYMLINK)
                dir->qid.type |= QTSYMLINK;
-       if (!(dir->qid.type & (QTSYMLINK | QTDIR)))
-               dir->qid.type |= QTFILE;
        /* dir->mode stores all the DM bits, but note that userspace can only affect
         * the permissions (S_PMASK) bits. */
        dir->mode = perm;
index fba7950..24ec0a7 100644 (file)
@@ -1161,9 +1161,6 @@ static void dump_tf(struct tree_file *tf, int tabs)
            !!(tf->file.dir.qid.type & QTSYMLINK))
                warn("%s has differing symlink bits", tree_file_to_name(tf));
 
-       if ((tf->file.dir.qid.type & (QTFILE | QTDIR | QTSYMLINK)) == 0)
-               warn("%s has no type!  (prob QTFILE)", tree_file_to_name(tf));
-
        for (int i = 0; i < tabs; i++)
                printk("    ");
        print_tf(tf);