Devtab created with linker tables
[akaros.git] / kern / drivers / dev / mnt.c
index 4d76446..619d803 100644 (file)
@@ -106,7 +106,7 @@ mntinit(void)
 long
 mntversion(struct chan *c, char *version, int msize, int returnlen)
 {
-       ERRSTACK(4);
+       ERRSTACK(2);
        struct fcall f;
        uint8_t *msg;
        struct mnt *m;
@@ -176,7 +176,7 @@ mntversion(struct chan *c, char *version, int msize, int returnlen)
        c->offset += k;
        spin_unlock(&c->lock);
 
-       l = devtab[c->type]->write(c, msg, k, oo);
+       l = devtab[c->type].write(c, msg, k, oo);
 
        if(l < k){
                spin_lock(&c->lock);
@@ -186,7 +186,7 @@ mntversion(struct chan *c, char *version, int msize, int returnlen)
        }
 
        /* message sent; receive and decode reply */
-       k = devtab[c->type]->read(c, msg, 8192+IOHDRSZ, c->offset);
+       k = devtab[c->type].read(c, msg, 8192+IOHDRSZ, c->offset);
        if(k <= 0)
                error("EOF receiving fversion reply");
 
@@ -404,11 +404,13 @@ mntwalk(struct chan *c, struct chan *nc, char **name, int nname)
        if(nname > MAXWELEM)
                error("devmnt: too many name elements");
        alloc = 0;
-       wq = kzmalloc(sizeof(struct walkqid) + (nname - 1) * sizeof(struct qid), 0);
+       wq = kzmalloc(sizeof(struct walkqid) + nname * sizeof(struct qid),
+                     KMALLOC_WAIT);
        if(waserror()){
                if(alloc && wq->clone!=NULL)
                        cclose(wq->clone);
                kfree(wq);
+               poperror();
                return NULL;
        }
 
@@ -456,7 +458,7 @@ mntwalk(struct chan *c, struct chan *nc, char **name, int nname)
                if(wq->clone != c){
                        wq->clone->type = c->type;
                        wq->clone->mchan = c->mchan;
-                       incref(&c->mchan->ref);
+                       kref_get(&c->mchan->ref, 1);
                }
                if(r->reply.nwqid > 0)
                        wq->clone->qid = r->reply.wqid[r->reply.nwqid-1];
@@ -475,7 +477,7 @@ mntwalk(struct chan *c, struct chan *nc, char **name, int nname)
 static int
 mntstat(struct chan *c, uint8_t *dp, int n)
 {
-       ERRSTACK(2);
+       ERRSTACK(1);
        struct mnt *m;
        struct mntrpc *r;
 
@@ -509,7 +511,7 @@ mntstat(struct chan *c, uint8_t *dp, int n)
 static struct chan*
 mntopencreate(int type, struct chan *c, char *name, int omode, uint32_t perm)
 {
-       ERRSTACK(2);
+       ERRSTACK(1);
        struct mnt *m;
        struct mntrpc *r;
 
@@ -559,7 +561,7 @@ mntcreate(struct chan *c, char *name, int omode, uint32_t perm)
 static void
 mntclunk(struct chan *c, int t)
 {
-       ERRSTACK(2);
+       ERRSTACK(1);
        struct mnt *m;
        struct mntrpc *r;
 
@@ -630,7 +632,7 @@ mntremove(struct chan *c)
 static int
 mntwstat(struct chan *c, uint8_t *dp, int n)
 {
-       ERRSTACK(2);
+       ERRSTACK(1);
        struct mnt *m;
        struct mntrpc *r;
 
@@ -702,7 +704,7 @@ mntwrite(struct chan *c, void *buf, long n, int64_t off)
 long
 mntrdwr(int type, struct chan *c, void *buf, long n, int64_t off)
 {
-       ERRSTACK(2);
+       ERRSTACK(1);
        struct mnt *m;
        struct mntrpc *r;       /* TO DO: volatile struct { Mntrpc *r; } r; */
        char *uba;
@@ -789,7 +791,7 @@ mountrpc(struct mnt *m, struct mntrpc *r)
 void
 mountio(struct mnt *m, struct mntrpc *r)
 {
-       ERRSTACK(4);
+       ERRSTACK(1);
        int n;
 
        while(waserror()) {
@@ -800,6 +802,8 @@ mountio(struct mnt *m, struct mntrpc *r)
                        nexterror();
                }
                r = mntflushalloc(r, m->msize);
+               /* need one for every waserror call (so this plus one outside) */
+               poperror();
        }
 
        spin_lock(&m->lock);
@@ -814,7 +818,7 @@ mountio(struct mnt *m, struct mntrpc *r)
        n = convS2M(&r->request, r->rpc, m->msize);
        if(n < 0)
                panic("bad message type in mountio");
-       if(devtab[m->c->type]->write(m->c, r->rpc, n, 0) != n)
+       if(devtab[m->c->type].write(m->c, r->rpc, n, 0) != n)
                error(Emountrpc);
 /*     r->stime = fastticks(NULL); */
        r->reqlen = n;
@@ -850,7 +854,7 @@ doread(struct mnt *m, int len)
        struct block *b;
 
        while(qlen(m->q) < len){
-               b = devtab[m->c->type]->bread(m->c, m->msize, 0);
+               b = devtab[m->c->type].bread(m->c, m->msize, 0);
                if(b == NULL)
                        return -1;
                if(blocklen(b) == 0){
@@ -1077,7 +1081,7 @@ mntralloc(struct chan *c, uint32_t msize)
                 * The header is split from the data buffer as
                 * mountmux may swap the buffer with another header.
                 */
-               new->rpc = mallocz(msize, 0);
+               new->rpc = kzmalloc(msize, KMALLOC_WAIT);
                if(new->rpc == NULL){
                        kfree(new);
                        spin_unlock(&mntalloc.l);
@@ -1096,7 +1100,7 @@ mntralloc(struct chan *c, uint32_t msize)
                mntalloc.nrpcfree--;
                if(new->rpclen < msize){
                        kfree(new->rpc);
-                       new->rpc = mallocz(msize, 0);
+                       new->rpc = kzmalloc(msize, KMALLOC_WAIT);
                        if(new->rpc == NULL){
                                kfree(new);
                                mntalloc.nrpcused--;
@@ -1188,7 +1192,7 @@ mntdirfix(uint8_t *dirbuf, struct chan *c)
 {
        unsigned int r;
 
-       r = devtab[c->type]->dc;
+       r = devtab[c->type].dc;
        dirbuf += BIT16SZ;      /* skip count */
        PBIT16(dirbuf, r);
        dirbuf += BIT16SZ;
@@ -1204,7 +1208,7 @@ rpcattn(void *v)
        return r->done || r->m->rip == 0;
 }
 
-struct dev mntdevtab = {
+struct dev mntdevtab __devtab = {
        'M',
        "mnt",