Fixes devnix's V lookup
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).
diff --git a/kern/drivers/dev/nix.c b/kern/drivers/dev/nix.c
index c1cb598..7ed4386 100644
--- a/kern/drivers/dev/nix.c
+++ b/kern/drivers/dev/nix.c
@@ -130,6 +130,11 @@
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 @@
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;
}