qio: remove qproduce()
[akaros.git] / kern / drivers / dev / mnt.c
index 013ca3b..b9036cc 100644 (file)
@@ -1,4 +1,31 @@
-// INFERNO
+/* Copyright © 1994-1999 Lucent Technologies Inc.  All rights reserved.
+ * Portions Copyright © 1997-1999 Vita Nuova Limited
+ * Portions Copyright © 2000-2007 Vita Nuova Holdings Limited
+ *                                (www.vitanuova.com)
+ * Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others
+ *
+ * Modified for the Akaros operating system:
+ * Copyright (c) 2013-2014 The Regents of the University of California
+ * Copyright (c) 2013-2015 Google Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE. */
+
 #include <vfs.h>
 #include <kfs.h>
 #include <slab.h>
@@ -152,7 +179,7 @@ long mntversion(struct chan *c, char *version, int msize, int returnlen)
                qunlock(&c->umqlock);
                poperror();
 
-               strncpy(buf, m->version, sizeof buf);
+               strlcpy(buf, m->version, sizeof(buf));
                k = strlen(buf);
                if (strncmp(buf, v, k) != 0) {
                        snprintf(buf, sizeof buf, "incompatible 9P versions %s %s",
@@ -161,7 +188,7 @@ long mntversion(struct chan *c, char *version, int msize, int returnlen)
                }
                if (returnlen > 0) {
                        if (returnlen < k)
-                               error(ENAMETOOLONG, NULL);
+                               error(ENAMETOOLONG, ERROR_FIXME);
                        memmove(version, buf, k);
                }
                return k;
@@ -258,7 +285,7 @@ long mntversion(struct chan *c, char *version, int msize, int returnlen)
        k = strlen(f.version);
        if (returnlen > 0) {
                if (returnlen < k)
-                       error(ENAMETOOLONG, NULL);
+                       error(ENAMETOOLONG, ERROR_FIXME);
                memmove(version, f.version, k);
        }
 
@@ -277,7 +304,7 @@ struct chan *mntauth(struct chan *c, char *spec)
                mntversion(c, VERSION9P, MAXRPC, 0);
                m = c->mux;
                if (m == NULL)
-                       error(EINVAL, NULL);
+                       error(EINVAL, ERROR_FIXME);
        }
 
        c = mntchan();
@@ -339,7 +366,7 @@ static struct chan *mntattach(char *muxattach)
                mntversion(c, NULL, 0, 0);
                m = c->mux;
                if (m == NULL)
-                       error(EINVAL, NULL);
+                       error(EINVAL, ERROR_FIXME);
        }
 
        c = mntchan();
@@ -413,7 +440,7 @@ static struct walkqid *mntwalk(struct chan *c, struct chan *nc, char **name,
                error(EFAIL, "devmnt: too many name elements");
        alloc = 0;
        wq = kzmalloc(sizeof(struct walkqid) + nname * sizeof(struct qid),
-                                 KMALLOC_WAIT);
+                                 MEM_WAIT);
        if (waserror()) {
                if (alloc && wq->clone != NULL)
                        cclose(wq->clone);
@@ -488,7 +515,7 @@ static int mntstat(struct chan *c, uint8_t * dp, int n)
        struct mntrpc *r;
 
        if (n < BIT16SZ)
-               error(EINVAL, NULL);
+               error(EINVAL, ERROR_FIXME);
        m = mntchk(c);
        r = mntralloc(c, m->msize);
        if (waserror()) {
@@ -798,7 +825,7 @@ void mountrpc(struct mnt *m, struct mntrpc *r)
                        } else
                                error(EFAIL, r->reply.ename);
                case Rflush:
-                       error(EINTR, NULL);
+                       error(EINTR, ERROR_FIXME);
                default:
                        if (t == r->request.type + 1)
                                break;
@@ -812,7 +839,7 @@ void mountrpc(struct mnt *m, struct mntrpc *r)
                                ("mnt: proc %s %lu: mismatch from %s %s rep 0x%p tag %d fid %d T%d R%d rp %d\n",
                                 "current->text", "current->pid", sn, cn, r, r->request.tag,
                                 r->request.fid, r->request.type, r->reply.type, r->reply.tag);
-                       error(EPROTO, NULL);
+                       error(EPROTO, ERROR_FIXME);
        }
 }
 
@@ -828,8 +855,7 @@ void mountio(struct mnt *m, struct mntrpc *r)
                 * the old request to a flsh (mntflushalloc) and try again.  We'll
                 * always try to flush, and you can't get out until the flush either
                 * succeeds or errors out with a non-abort/Eintr error. */
-               if (strcmp(current_errstr(), "syscall aborted") &&
-                   strcmp(current_errstr(), Eintr)) {
+               if (get_errno() != EINTR) {
                        /* all other errors (not abort or Eintr) */
                        mntflushfree(m, r);
                        nexterror();
@@ -852,7 +878,7 @@ void mountio(struct mnt *m, struct mntrpc *r)
        if (n < 0)
                panic("bad message type in mountio");
        if (devtab[m->c->type].write(m->c, r->rpc, n, 0) != n)
-               error(EIO, NULL);
+               error(EIO, ERROR_FIXME);
 /*     r->stime = fastticks(NULL); */
        r->reqlen = n;
 
@@ -873,7 +899,7 @@ void mountio(struct mnt *m, struct mntrpc *r)
        spin_unlock(&m->lock);
        while (r->done == 0) {
                if (mntrpcread(m, r) < 0)
-                       error(EIO, NULL);
+                       error(EIO, ERROR_FIXME);
                mountmux(m, r);
        }
        mntgate(m);
@@ -958,7 +984,7 @@ int mntrpcread(struct mnt *m, struct mntrpc *r)
                        l = &(b->next);
                } else {
                        /* split block and put unused bit back */
-                       nb = allocb(i - len);
+                       nb = block_alloc(i - len, MEM_WAIT);
                        memmove(nb->wp, b->rp + len, i - len);
                        b->wp = b->rp + len;
                        nb->wp += i - len;
@@ -1095,7 +1121,7 @@ struct mntrpc *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 = kzmalloc(msize, KMALLOC_WAIT);
+               new->rpc = kzmalloc(msize, MEM_WAIT);
                if (new->rpc == NULL) {
                        kfree(new);
                        spin_unlock(&mntalloc.l);
@@ -1113,7 +1139,7 @@ struct mntrpc *mntralloc(struct chan *c, uint32_t msize)
                mntalloc.nrpcfree--;
                if (new->rpclen < msize) {
                        kfree(new->rpc);
-                       new->rpc = kzmalloc(msize, KMALLOC_WAIT);
+                       new->rpc = kzmalloc(msize, MEM_WAIT);
                        if (new->rpc == NULL) {
                                kfree(new);
                                mntalloc.nrpcused--;
@@ -1219,23 +1245,23 @@ int rpcattn(void *v)
 }
 
 struct dev mntdevtab __devtab = {
-       "mnt",
-
-       devreset,
-       mntinit,
-       devshutdown,
-       mntattach,
-       mntwalk,
-       mntstat,
-       mntopen,
-       mntcreate,
-       mntclose,
-       mntread,
-       devbread,
-       mntwrite,
-       devbwrite,
-       mntremove,
-       mntwstat,
-       devpower,
-       devchaninfo,
+       .name = "mnt",
+
+       .reset = devreset,
+       .init = mntinit,
+       .shutdown = devshutdown,
+       .attach = mntattach,
+       .walk = mntwalk,
+       .stat = mntstat,
+       .open = mntopen,
+       .create = mntcreate,
+       .close = mntclose,
+       .read = mntread,
+       .bread = devbread,
+       .write = mntwrite,
+       .bwrite = devbwrite,
+       .remove = mntremove,
+       .wstat = mntwstat,
+       .power = devpower,
+       .chaninfo = devchaninfo,
 };