]> git.lizzy.rs Git - plan9front.git/blobdiff - sys/src/9/port/devaoe.c
devproc: return process id when reading /proc/n/ctl file
[plan9front.git] / sys / src / 9 / port / devaoe.c
index 23f621a05aa8a5109c740f647abb8fc648f8d969..ed091df0a7d36735b48a58c51a510b3c82850bc8 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *     © 2005-10 coraid
+ *     © 2005-13 coraid
  *     aoe storage initiator
  */
 
@@ -12,7 +12,7 @@
 #include "ureg.h"
 #include "../port/error.h"
 #include "../port/netif.h"
-#include "etherif.h"
+#include "../port/etherif.h"
 #include "../ip/ip.h"
 #include "../port/aoe.h"
 #include <fis.h>
 #define uprint(...)    snprint(up->genbuf, sizeof up->genbuf, __VA_ARGS__);
 
 enum {
-       Maxunits        = 0xff,
+       Typebits                = 4,
+       Unitbits                = 12,
+       L3bits          = 4,
+       Maxtype         = (1<<Typebits)-1,
+       Maxunits        = (1<<Unitbits)-1,
+       Maxl3           = (1<<L3bits)-1,
        Maxframes       = 128,
        Maxmtu          = 100000,
        Ndevlink        = 6,
@@ -31,11 +36,11 @@ enum {
        Nnetlink        = 6,
 };
 
-#define TYPE(q)                ((ulong)(q).path & 0xf)
-#define UNIT(q)                (((ulong)(q).path>>4) & 0xff)
-#define L(q)           (((ulong)(q).path>>12) & 0xf)
-#define QID(u, t)      ((u)<<4 | (t))
-#define Q3(l, u, t)    ((l)<<8 | QID(u, t))
+#define TYPE(q)                ((ulong)(q).path & Maxtype)
+#define UNIT(q)                (((ulong)(q).path>>Typebits) & Maxunits)
+#define L(q)           (((ulong)(q).path>>Typebits+Unitbits) & Maxl3)
+#define QID(u, t)      ((u)<<Typebits | (t))
+#define Q3(l, u, t)    ((l)<<Typebits+Unitbits | QID(u, t))
 #define UP(d)          ((d)->flag & Dup)
 
 #define        Ticks           MACHP(0)->ticks
@@ -304,7 +309,7 @@ srbcleanout(Aoedev *d, Srb *srb)
        if(srb == d->inprocess)
                d->inprocess = nil;
        else
-               for(ll = &d->head; x = *ll; ll = &x->next){
+               for(ll = &d->head; (x = *ll) != nil; ll = &x->next){
                        d->tail = x;
                        if(x == srb)
                                *ll = x->next;
@@ -329,7 +334,7 @@ frameerror(Aoedev *d, Frame *f, char *s)
        srb = f->srb;
        f->srb = nil;
        f->tag = Tfree;         /* don't get fooled by way-slow responses */
-       if(!srb)
+       if(srb == nil)
                return;
        srb->nout--;
        srberror(d, srb, s);
@@ -370,15 +375,15 @@ eventlogread(void *a, long n)
 
                /* the concern here is page faults in memmove below */
                if(waserror()){
-                       free(buf);
                        qunlock(&events);
+                       free(buf);
                        nexterror();
                }
                memmove(a, buf, n);
                poperror();
        }
-       free(buf);
        qunlock(&events);
+       free(buf);
        return n;
 }
 
@@ -497,16 +502,16 @@ pickdevlink(Aoedev *d)
        for(i = 0; i < d->ndl; i++){
                n = d->dlidx++ % d->ndl;
                l = d->dl + n;
-               if(l && l->flag & Dup)
+               if(l->flag & Dup)
                        return l;
        }
-       return 0;
+       return nil;
 }
 
 static int
 pickea(Devlink *l)
 {
-       if(l == 0)
+       if(l == nil)
                return -1;
        if(l->nea == 0)
                return -1;
@@ -520,12 +525,12 @@ pickea(Devlink *l)
 #define Nofail(d, s)   (((d)->flag&Dnofail) == Dnofail)
 
 static int
-hset(Aoedev *d, Frame *f, Aoehdr *h, int cmd)
+hset(Aoedev *d, Frame *f, Aoehdr *h, int cmd, int new)
 {
        int i;
        Devlink *l;
 
-       if(f->srb)
+       if(f->srb != nil)
        if((long)(Ticks-f->srb->ticksent) > Srbtimeout){
                eventlog("%æ: srb timeout\n", d);
                if(cmd == ACata && Nofail(d, s))
@@ -537,7 +542,7 @@ hset(Aoedev *d, Frame *f, Aoehdr *h, int cmd)
        l = pickdevlink(d);
        i = pickea(l);
        if(i == -1){
-               if(!(cmd == ACata && f->srb && Nofail(d, s)))
+               if(!(cmd == ACata && f->srb != nil && Nofail(d, s)))
                        downdev(d, "resend fails; no netlink/ea");
                return -1;
        }
@@ -550,7 +555,9 @@ hset(Aoedev *d, Frame *f, Aoehdr *h, int cmd)
        h->minor = d->minor;
        h->cmd = cmd;
 
-       hnputl(h->tag, f->tag = newtag(d));
+       if(new)
+               f->tag = newtag(d);
+       hnputl(h->tag, f->tag);
        f->dl = l;
        f->nl = l->nl;
        f->eaidx = i;
@@ -567,7 +574,7 @@ resend(Aoedev *d, Frame *f)
        Aoehdr *h;
 
        h = (Aoehdr*)f->hdr;
-       if(hset(d, f, h, h->cmd) == -1)
+       if(hset(d, f, h, h->cmd, 0) == -1)
                return -1;
        a = (Aoeata*)(f->hdr + Aoehsz);
        n = f->bcnt;
@@ -646,7 +653,7 @@ loop:
        }
        starttick = Ticks;
        rlock(&devs);
-       for(d = devs.d; d; d = d->next){
+       for(d = devs.d; d != nil; d = d->next){
                if(!canqlock(d))
                        continue;
                if(!UP(d)){
@@ -694,8 +701,10 @@ loop:
        }
        runlock(&devs);
        i = Nms - TK2MS(Ticks - starttick);
-       if(i > 0)
+       if(i > 0 && !waserror()){
                tsleep(&up->sleep, return0, 0, i);
+               poperror();
+       }
        goto loop;
 }
 
@@ -771,19 +780,25 @@ aoeattach(char *spec)
        return c;
 }
 
-static Aoedev*
-unitseq(ulong unit)
+static int
+unitseq(Chan *c, uint unit, Dir *dp)
 {
-       int i;
+       int i, rv;
+       Qid q;
        Aoedev *d;
 
        i = 0;
+       rv = -1;
        rlock(&devs);
-       for(d = devs.d; d; d = d->next)
-               if(i++ == unit)
+       for(d = devs.d; d != nil; d = d->next)
+               if(i++ == unit){
+                       mkqid(&q, QID(d->unit, Qunitdir), 0, QTDIR);
+                       devdir(c, q, unitname(d), 0, eve, 0555, dp);
+                       rv = 1;
                        break;
+               }
        runlock(&devs);
-       return d;
+       return rv;
 }
 
 static Aoedev*
@@ -792,7 +807,7 @@ unit2dev(ulong unit)
        Aoedev *d;
 
        rlock(&devs);
-       for(d = devs.d; d; d = d->next)
+       for(d = devs.d; d != nil; d = d->next)
                if(d->unit == unit){
                        runlock(&devs);
                        return d;
@@ -813,7 +828,7 @@ unitgen(Chan *c, ulong type, Dir *dp)
        Qid q;
 
        d = unit2dev(UNIT(c->qid));
-       perm = 0644;
+       perm = 0664;
        size = 0;
        vers = d->vers;
        t = QTFILE;
@@ -826,7 +841,7 @@ unitgen(Chan *c, ulong type, Dir *dp)
                break;
        case Qdata:
                p = "data";
-               perm = 0640;
+               perm = 0660;
                if(UP(d))
                        size = d->bsize;
                break;
@@ -866,7 +881,7 @@ topgen(Chan *c, ulong type, Dir *d)
                return -1;
        case Qtopctl:
                p = "ctl";
-               perm = 0644;
+               perm = 0664;
                break;
        case Qtoplog:
                p = "log";
@@ -915,11 +930,7 @@ aoegen(Chan *c, char *, Dirtab *, int, int s, Dir *dp)
                if(s < Qtopfiles)
                        return topgen(c, Qtopbase + s, dp);
                s -= Qtopfiles;
-               if((d = unitseq(s)) == 0)
-                       return -1;
-               mkqid(&q, QID(d->unit, Qunitdir), 0, QTDIR);
-               devdir(c, q, unitname(d), 0, eve, 0555, dp);
-               return 1;
+               return unitseq(c, s, dp);
        case Qtopctl:
        case Qtoplog:
                return topgen(c, TYPE(c->qid), dp);
@@ -938,24 +949,24 @@ aoegen(Chan *c, char *, Dirtab *, int, int s, Dir *dp)
                return unitgen(c, TYPE(c->qid), dp);
        case Qdevlinkdir:
                i = UNIT(c->qid);
+               if(i >= Maxunits || i >= units.ref)
+                       return -1;
+               d = unit2dev(i);
                if(s == DEVDOTDOT){
                        mkqid(&q, QID(i, Qunitdir), 0, QTDIR);
-                       devdir(c, q, "devlink", 0, eve, 0555, dp);
+                       devdir(c, q, unitname(d), 0, eve, 0555, dp);
                        return 1;
                }
-               if(i >= units.ref)
-                       return -1;
-               d = unit2dev(i);
                if(s >= d->ndl)
                        return -1;
                uprint("%d", s);
                mkqid(&q, Q3(s, i, Qdevlink), 0, QTFILE);
-               devdir(c, q, up->genbuf, 0, eve, 0755, dp);
+               devdir(c, q, up->genbuf, 0, eve, 0444, dp);
                return 1;
        case Qdevlink:
                uprint("%d", s);
                mkqid(&q, Q3(s, UNIT(c->qid), Qdevlink), 0, QTFILE);
-               devdir(c, q, up->genbuf, 0, eve, 0755, dp);
+               devdir(c, q, up->genbuf, 0, eve, 0444, dp);
                return 1;
        }
 }
@@ -1031,7 +1042,7 @@ atarw(Aoedev *d, Frame *f)
        f->nhdr = Aoehsz + Aoeatasz;
        memset(f->hdr, 0, f->nhdr);
        h = (Aoehdr*)f->hdr;
-       if(hset(d, f, h, ACata) == -1){
+       if(hset(d, f, h, ACata, 1) == -1){
                d->inprocess = nil;
                return;
        }
@@ -1091,9 +1102,9 @@ aoeerror(Aoehdr *h)
        };
 
        if((h->verflag & AFerr) == 0)
-               return 0;
+               return nil;
        n = h->error;
-       if(n > nelem(errs))
+       if(n >= nelem(errs))
                n = 0;
        return errs[n];
 }
@@ -1171,7 +1182,7 @@ strategy(Aoedev *d, Srb *srb)
        if(!UP(d))
                error(Eio);
        srb->next = nil;
-       if(d->tail)
+       if(d->tail != nil)
                d->tail->next = srb;
        d->tail = srb;
        if(d->head == nil)
@@ -1227,7 +1238,7 @@ rw(Aoedev *d, int write, uchar *db, long len, uvlong off)
                if(write && !copy)
                        memmove(srb->data, db, n);
                strategy(d, srb);
-               if(srb->error)
+               if(srb->error != nil)
                        error(srb->error);
                if(!write && !copy)
                        memmove(db, srb->data, n);
@@ -1267,7 +1278,7 @@ pstat(Aoedev *d, char *db, int len, int off)
        int i;
        char *state, *s, *p, *e;
 
-       s = p = malloc(READSTR);
+       s = p = smalloc(READSTR);
        e = p + READSTR;
 
        state = "down";
@@ -1353,7 +1364,7 @@ devlinkread(Chan *c, void *db, int len, int off)
                return 0;
        l = d->dl + i;
 
-       s = p = malloc(READSTR);
+       s = p = smalloc(READSTR);
        e = s + READSTR;
 
        p = seprint(p, e, "addr: ");
@@ -1389,7 +1400,7 @@ topctlread(Chan *, void *db, int len, int off)
        char *s, *p, *e;
        Netlink *n;
 
-       s = p = malloc(READSTR);
+       s = p = smalloc(READSTR);
        e = s + READSTR;
 
        p = seprint(p, e, "debug: %d\n", debug);
@@ -1398,7 +1409,7 @@ topctlread(Chan *, void *db, int len, int off)
 
        for(i = 0; i < Nnetlink; i++){
                n = netlinks.nl+i;
-               if(n->cc == 0)
+               if(n->cc == nil)
                        continue;
                p = seprint(p, e, "if%d path: %s\n", i, n->path);
                p = seprint(p, e, "if%d ea: %E\n", i, n->ea);
@@ -1480,7 +1491,7 @@ configwrite(Aoedev *d, void *db, long len)
        f->nhdr = Aoehsz + Aoecfgsz;
        memset(f->hdr, 0, f->nhdr);
        h = (Aoehdr*)f->hdr;
-       if(hset(d, f, h, ACconfig) == -1)
+       if(hset(d, f, h, ACconfig, 1) == -1)
                return 0;
        ch = (Aoecfg*)(f->hdr + Aoehsz);
        f->srb = srb;
@@ -1670,7 +1681,7 @@ unitwrite(Chan *c, void *db, long n, vlong off)
        case Qconfig:
                if(off + n > sizeof d->config)
                        error(Etoobig);
-               buf = malloc(sizeof d->config);
+               buf = smalloc(sizeof d->config);
                if(waserror()){
                        free(buf);
                        nexterror();
@@ -1696,7 +1707,7 @@ addnet(char *path, Chan *cc, Chan *dc, Chan *mtu, uchar *ea)
        }
        nl = netlinks.nl;
        e = nl + nelem(netlinks.nl);
-       for(; nl < e && nl->cc; nl++)
+       for(; nl < e && nl->cc != nil; nl++)
                continue;
        if(nl == e)
                error("out of netlink structures");
@@ -1705,7 +1716,7 @@ addnet(char *path, Chan *cc, Chan *dc, Chan *mtu, uchar *ea)
        nl->mtu = mtu;
        strncpy(nl->path, path, sizeof(nl->path)-1);
        nl->path[sizeof(nl->path)-1] = 0;
-       memmove(nl->ea, ea, sizeof(nl->ea));
+       memmove(nl->ea, ea, sizeof nl->ea);
        poperror();
        nl->flag |= Dup;
        unlock(&netlinks);
@@ -1717,24 +1728,18 @@ newunit(void)
 {
        int x;
 
-       lock(&units);
-       if(units.ref == Maxunits)
+       x = incref(&units)-1;
+       if(x >= Maxunits){
+               decref(&units);
                x = -1;
-       else
-               x = units.ref++;
-       unlock(&units);
+       }
        return x;
 }
 
 static int
 dropunit(void)
 {
-       int x;
-
-       lock(&units);
-       x = --units.ref;
-       unlock(&units);
-       return x;
+       return decref(&units);
 }
 
 /*
@@ -1748,7 +1753,7 @@ newdev(uint major, uint minor, int n)
 
        d = malloc(sizeof *d);
        f = malloc(sizeof *f*Maxframes);
-       if(!d || !f) {
+       if(d == nil || f == nil) {
                free(d);
                free(f);
                error("aoe device allocation failure");
@@ -1828,7 +1833,7 @@ ataident(Aoedev *d)
        f->nhdr = Aoehsz + Aoeatasz;
        memset(f->hdr, 0, f->nhdr);
        h = (Aoehdr*)f->hdr;
-       if(hset(d, f, h, ACata) == -1)
+       if(hset(d, f, h, ACata, 1) == -1)
                return;
        a = (Aoeata*)(f->hdr + Aoehsz);
        f->srb = srbkalloc(0, 0);
@@ -1911,7 +1916,7 @@ errrsp(Block *b, char *s)
        if(n == Tmgmt || n == Tfree)
                return;
        d = mm2dev(nhgets(h->major), h->minor);
-       if(d == 0)
+       if(d == nil)
                return;
        if(f = getframe(d, n))
                frameerror(d, f, s);
@@ -1923,7 +1928,7 @@ qcfgrsp(Block *b, Netlink *nl)
        int cmd, cslen, blen;
        uint n, major;
        Aoedev *d;
-       Aoehdr *h;
+       Aoehdr *h, *h0;
        Aoecfg *ch;
        Devlink *l;
        Frame *f;
@@ -1933,7 +1938,7 @@ qcfgrsp(Block *b, Netlink *nl)
        ch = (Aoecfg*)(b->rp + Aoehsz);
        major = nhgets(h->major);
        n = nhgetl(h->tag);
-       if(n != Tmgmt){
+       if(n != Tmgmt && n != Tfree){
                d = mm2dev(major, h->minor);
                if(d == nil)
                        return;
@@ -1944,6 +1949,13 @@ qcfgrsp(Block *b, Netlink *nl)
                        eventlog("%æ: unknown response tag %ux\n", d, n);
                        return;
                }
+               h0 = (Aoehdr*)f->hdr;
+               cmd = h0->cmd;
+               if(cmd != ACconfig){
+                       qunlock(d);
+                       eventlog("%æ: malicious server got ACconfig want %d; tag %ux\n", d, cmd, n);
+                       return;
+               }
                cslen = nhgets(ch->cslen);
                blen = BLEN(b) - (Aoehsz + Aoecfgsz);
                if(cslen < blen && BLEN(b) > 60)
@@ -1954,11 +1966,11 @@ qcfgrsp(Block *b, Netlink *nl)
                                d, n, cslen, blen);
                        cslen = blen;
                }
-               memmove(f->dp, (uchar*)ch + Aoehsz + Aoecfgsz, cslen);
+               memmove(f->dp, b->rp + Aoehsz + Aoecfgsz, cslen);
                srb = f->srb;
                f->dp = nil;
                f->srb = nil;
-               if(srb){
+               if(srb != nil){
                        srb->nout--;
                        srbwakeup(srb);
                        d->nout--;
@@ -1997,11 +2009,13 @@ qcfgrsp(Block *b, Netlink *nl)
        l = newdevlink(d, nl, h);               /* add this interface. */
 
        d->fwver = nhgets(ch->fwver);
-       n = nhgets(ch->cslen);
-       if(n > sizeof d->config)
-               n = sizeof d->config;
-       d->nconfig = n;
-       memmove(d->config, (uchar*)ch + Aoehsz + Aoecfgsz, n);
+       cslen = nhgets(ch->cslen);
+       if(cslen > sizeof d->config)
+               cslen = sizeof d->config;
+       if(Aoehsz + Aoecfgsz + cslen > BLEN(b))
+               cslen = BLEN(b) - (Aoehsz + Aoecfgsz);
+       d->nconfig = cslen;
+       memmove(d->config, b->rp + Aoehsz + Aoecfgsz, cslen);
 
        /* manually set mtu may be reset lower if conditions warrant */
        if(l){
@@ -2028,10 +2042,12 @@ aoeidentify(Aoedev *d, ushort *id)
        vlong s;
 
        s = idfeat(d, id);
-       if(s == -1)
+       if(s == -1){
+               eventlog("%æ: idfeat returns -1\n", d);
                return -1;
+       }
        if((d->feat&Dlba) == 0){
-               dprint("%æ: no lba support\n", d);
+               eventlog("%æ: no lba support\n", d);
                return -1;
        }
        d->flag |= Dup;
@@ -2042,9 +2058,7 @@ aoeidentify(Aoedev *d, ushort *id)
 static void
 newvers(Aoedev *d)
 {
-       lock(&drivevers);
-       d->vers = drivevers.ref++;
-       unlock(&drivevers);
+       d->vers = incref(&drivevers);
 }
 
 static int
@@ -2078,10 +2092,10 @@ identify(Aoedev *d, ushort *id)
 static void
 atarsp(Block *b)
 {
-       uint n;
+       uint n, cmd;
        ushort major;
        Aoeata *ahin, *ahout;
-       Aoehdr *h;
+       Aoehdr *h, *h0;
        Aoedev *d;
        Frame *f;
        Srb *srb;
@@ -2098,11 +2112,20 @@ atarsp(Block *b)
                nexterror();
        }
        n = nhgetl(h->tag);
+       if(n == Tfree || n == Tmgmt)
+               goto bail;
        f = getframe(d, n);
        if(f == nil){
-               dprint("%æ: unexpected response; tag %ux\n", d, n);
+               eventlog("%æ: unexpected response; tag %ux\n", d, n);
+               goto bail;
+       }
+       h0 = (Aoehdr*)f->hdr;
+       cmd = h0->cmd;
+       if(cmd != ACata){
+               eventlog("%æ: malicious server got ACata want %d; tag %ux\n", d, cmd, n);
                goto bail;
        }
+
        rtupdate(f->dl, tsince(f->tag));
        ahout = (Aoeata*)(f->hdr + Aoehsz);
        srb = f->srb;
@@ -2110,7 +2133,7 @@ atarsp(Block *b)
        if(ahin->cmdstat & 0xa9){
                eventlog("%æ: ata error cmd %.2ux stat %.2ux\n",
                        d, ahout->cmdstat, ahin->cmdstat);
-               if(srb)
+               if(srb != nil)
                        srb->error = Eio;
        } else {
                n = ahout->scnt * Aoesectsz;
@@ -2118,7 +2141,7 @@ atarsp(Block *b)
                case Crd:
                case Crdext:
                        if(BLEN(b) - (Aoehsz + Aoeatasz) != n){
-                               eventlog("%æ: misread blen %ld expect %d\n",
+                               eventlog("%æ: misread blen %zd expect %d\n",
                                        d, BLEN(b), n);
                                goto bail;
                        }
@@ -2136,7 +2159,7 @@ atarsp(Block *b)
                        break;
                case Cid:
                        if(BLEN(b) - (Aoehsz + Aoeatasz) < 512){
-                               eventlog("%æ: runt identify blen %ld expect %d\n",
+                               eventlog("%æ: runt identify blen %zd expect %d\n",
                                        d, BLEN(b), 512 + Aoehsz + Aoeatasz);
                                goto bail;
                        }
@@ -2151,7 +2174,7 @@ atarsp(Block *b)
        }
 
        f->srb = nil;
-       if(srb){
+       if(srb != nil){
                srb->nout--;
                srbwakeup(srb);
        }
@@ -2197,13 +2220,14 @@ netrdaoeproc(void *v)
                h = (Aoehdr*)b->rp;
                if(h->verflag & AFrsp)
                        if(s = aoeerror(h)){
-                               eventlog("%s: %s\n", nl->path, s);
+                               eventlog("%s: %d.%d %s\n", nl->path,
+                                       h->major[0]<<8 | h->major[1], h->minor, s);
                                errrsp(b, s);
                        }else if(h->cmd == ACata)
                                atarsp(b);
                        else if(h->cmd == ACconfig)
                                qcfgrsp(b, nl);
-                       else if((h->cmd & 0xf0) == 0){
+                       else if((h->cmd & 0xf0) != 0xf0){
                                eventlog("%s: unknown cmd %d\n",
                                        nl->path, h->cmd);
                                errrsp(b, "unknown command");
@@ -2225,11 +2249,9 @@ getaddr(char *path, uchar *ea)
                cclose(c);
                nexterror();
        }
-       if(c == nil)
-               panic("æ: getaddr: c == nil");
        n = devtab[c->type]->read(c, buf, sizeof buf-1, 0);
-       poperror();
        cclose(c);
+       poperror();
        buf[n] = 0;
        if(parseether(ea, buf) < 0)
                error("parseether failure");
@@ -2246,21 +2268,19 @@ netbind(char *path)
        snprint(addr, sizeof addr, "%s!0x%x", path, Aoetype);
        dc = chandial(addr, nil, nil, &cc);
        snprint(addr, sizeof addr, "%s/mtu", path);
-       if(waserror())
-               mtu = nil;
-       else {
+       mtu = nil;
+       if(!waserror()){
                mtu = namec(addr, Aopen, OREAD, 0);
                poperror();
        }
-
        if(waserror()){
                cclose(dc);
                cclose(cc);
-               if(mtu)
+               if(mtu != nil)
                        cclose(mtu);
                nexterror();
        }
-       if(dc == nil  || cc == nil)
+       if(dc == nil || cc == nil)
                error(Enonexist);
        getaddr(path, ea);
        nl = addnet(path, cc, dc, mtu, ea);
@@ -2322,7 +2342,7 @@ netunbind(char *path)
 
        /* reschedule packets. */
        wlock(&devs);
-       for(d = devs.d; d; d = d->next){
+       for(d = devs.d; d != nil; d = d->next){
                qlock(d);
                for(i = 0; i < d->nframes; i++){
                        f = d->frames + i;
@@ -2335,7 +2355,7 @@ netunbind(char *path)
 
        /* squeeze devlink pool.  (we assert nobody is using them now) */
        wlock(&devs);
-       for(d = devs.d; d; d = d->next){
+       for(d = devs.d; d != nil; d = d->next){
                qlock(d);
                for(i = 0; i < d->ndl; i++){
                        l = d->dl + i;
@@ -2350,7 +2370,7 @@ netunbind(char *path)
        lock(&netlinks);
        dc = n->dc;
        cc = n->cc;
-       if(n->mtu)
+       if(n->mtu != nil)
                cclose(n->mtu);
        memset(n, 0, sizeof *n);
        unlock(&netlinks);
@@ -2360,7 +2380,7 @@ netunbind(char *path)
 
        /* squeeze orphan devices */
        wlock(&devs);
-       for(p = d = devs.d; d; d = next){
+       for(p = d = devs.d; d != nil; d = next){
                next = d->next;
                if(d->ndl > 0){
                        p = d;
@@ -2389,7 +2409,7 @@ strtoss(char *f, uint *shelf, uint *slot)
 
        *shelf = 0xffff;
        *slot = 0xff;
-       if(!f)
+       if(f == nil)
                return;
        *shelf = strtol(f, &s, 0);
        if(s == f || *shelf > 0xffff)
@@ -2420,7 +2440,7 @@ removedev(Aoedev *d)
        wlock(&devs);
        p = 0;
        if(d != devs.d)
-       for(p = devs.d; p; p = p->next)
+       for(p = devs.d; p != nil; p = p->next)
                if(p->next == d)
                        break;
        qlock(d);
@@ -2431,7 +2451,7 @@ removedev(Aoedev *d)
        for(i = 0; i < d->nframes; i++)
                frameerror(d, d->frames+i, Enotup);
 
-       if(p)
+       if(p != nil)
                p->next = d->next;
        else
                devs.d = d->next;
@@ -2470,7 +2490,7 @@ removestr(char *f)
 
        strtoss(f, &shelf, &slot);
        wlock(&devs);
-       for(d = devs.d; d; d = d->next)
+       for(d = devs.d; d != nil; d = d->next)
                if(shelf == d->major && slot == d->minor){
                        wunlock(&devs); /* BOTCH */
                        removedev(d);