Add placeholder handling to devgen.
authorGodfrey van der Linden <gvdl@google.com>
Sat, 14 Feb 2015 02:31:32 +0000 (18:31 -0800)
committerBarret Rhoden <brho@cs.berkeley.edu>
Mon, 16 Feb 2015 15:10:26 +0000 (10:10 -0500)
The current devgen assumes that the dirtab is static, which until now it
has been. However, the gen functions are allowed to return 0 if the
entry exists for that 's' but shouldn't be active.

Overload dirtab->qid.vers to indicate if the dirtab entry is inactive
and return 0 if vers == -1.

kern/src/ns/dev.c

index 7fb59d0..4228e6d 100644 (file)
@@ -59,6 +59,9 @@ devdir(struct chan *c, struct qid qid, char *n,
 
 /*
  * the zeroth element of the table MUST be the directory itself for ..
+ * Any entry with qid vers of -1 will return 0, indicating that the value is
+ * valid but there is nothing there continue walk.
+ * TODO(gvdl): Update akaros devgen man page.
 */
 int
 devgen(struct chan *c, char *unused_char_p_t, struct dirtab *tab, int ntab,
@@ -73,8 +76,10 @@ devgen(struct chan *c, char *unused_char_p_t, struct dirtab *tab, int ntab,
                        return -1;
                tab += i;
        }
-       devdir(c, tab->qid, tab->name, tab->length, eve, tab->perm, dp);
-       return 1;
+       int ret = (tab->qid.vers == -1)? 0 : 1;
+       if (ret)
+               devdir(c, tab->qid, tab->name, tab->length, eve, tab->perm, dp);
+       return ret;
 }
 
 void devreset(void)