Fixes devnix's V lookup
authorBarret Rhoden <brho@cs.berkeley.edu>
Thu, 5 Mar 2015 19:48:58 +0000 (14:48 -0500)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 5 Mar 2015 19:48:58 +0000 (14:48 -0500)
The issue was that the QID for chans that were genned from a Qnixdir had
a bad nixid.  We were passing either 0 (for ctl) or 1 (for image) (which
is what you get when you take (s - Qctl).  This happened to work okay
for ctl, since we usually have a nix0.  But image thought its struct v
was for nix1.

I think we only need to do this for "state machine genned" entries,
meaning the entries under Qnixdir.  The "directly genned" entries should
come in to gen with a properly filled out QID (which came from a
previous gen).

kern/drivers/dev/nix.c

index c1cb598..7ed4386 100644 (file)
@@ -130,6 +130,11 @@ static inline int QID(int index, int type)
        return ((index << INDEX_SHIFT) | type);
 }
 
+static inline int QID2ID(struct qid q)
+{
+       return q.path >> INDEX_SHIFT;
+}
+
 /* TODO: (MGMT) not called yet.  -- we have to unlink the nix */
 static void nix_release(struct kref *kref)
 {
@@ -205,11 +210,11 @@ static int nixgen(struct chan *c, char *entry_name,
                s += Qctl;      /* first time through, start on Qctl */
                switch (s) {
                case Qctl:
-                       mkqid(&q, QID(s-Qctl, Qctl), 0, QTFILE);
+                       mkqid(&q, QID(QID2ID(c->qid), Qctl), 0, QTFILE);
                        devdir(c, q, "ctl", 0, eve, 0666, dp);
                        return 1;
                case Qimage:
-                       mkqid(&q, QID(s-Qctl, Qimage), 0, QTFILE);
+                       mkqid(&q, QID(QID2ID(c->qid), Qimage), 0, QTFILE);
                        devdir(c, q, "image", 0, eve, 0666, dp);
                        return 1;
                }