net: Change transport_header_end -> tranport_offset
[akaros.git] / kern / src / ns / pgrp.c
index c6cc4b4..df747d5 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>
 #include <vfs.h>
 #include <kfs.h>
 #include <slab.h>
@@ -11,7 +38,7 @@
 #include <cpio.h>
 #include <pmap.h>
 #include <smp.h>
 #include <cpio.h>
 #include <pmap.h>
 #include <smp.h>
-#include <ip.h>
+#include <net/ip.h>
 
 /* TODO: (ID) need a unique ID service.  These will loop around... */
 static int pgrpid;
 
 /* TODO: (ID) need a unique ID service.  These will loop around... */
 static int pgrpid;
@@ -53,11 +80,12 @@ struct pgrp *newpgrp(void)
 {
        struct pgrp *p;
 
 {
        struct pgrp *p;
 
-       p = kzmalloc(sizeof(struct pgrp), KMALLOC_WAIT);
+       p = kzmalloc(sizeof(struct pgrp), MEM_WAIT);
        kref_init(&p->ref, freepgrp, 1);
        p->pgrpid = NEXT_ID(pgrpid);
        p->progmode = 0644;
        qlock_init(&p->debug);
        kref_init(&p->ref, freepgrp, 1);
        p->pgrpid = NEXT_ID(pgrpid);
        p->progmode = 0644;
        qlock_init(&p->debug);
+       rwinit(&p->ns);
        qlock_init(&p->nsh);
        return p;
 }
        qlock_init(&p->nsh);
        return p;
 }
@@ -109,7 +137,7 @@ void pgrpcpy(struct pgrp *to, struct pgrp *from)
                        }
                        mh = newmhead(f->from);
                        if (!mh)
                        }
                        mh = newmhead(f->from);
                        if (!mh)
-                               error(Enomem);
+                               error(ENOMEM, ERROR_FIXME);
                        *l = mh;
                        l = &mh->hash;
                        link = &mh->mount;
                        *l = mh;
                        l = &mh->hash;
                        link = &mh->mount;
@@ -141,89 +169,6 @@ void pgrpcpy(struct pgrp *to, struct pgrp *from)
        wunlock(&from->ns);
 }
 
        wunlock(&from->ns);
 }
 
-void closefgrp(struct fgrp *f)
-{
-       /* TODO: look at this more carefully.  sharing fgrps might be unnecessary,
-        * due to our parallelism style. */
-       /* closefgrp can't be called from proc_destroy, due to races on the fgrp.
-        * current->fgrp is a kref source, and we'd need some form of external sync
-        * to remove it, since multiple kthreads could be accessing current->fgrp.
-        * proc_free is synchronized, for instance.  we could put some sync in the
-        * fgrp, but that would require splitting the deallocation (which we do
-        * manually), and would require not having multiple procs per fgrp (which we
-        * also require).  another option would be to use RCU: clear current->fgrp,
-        * then closefgrp after a grace period. */
-       warn("Don't call closefgrp()");
-
-       if (!f)
-               return;
-       kref_put(&f->ref);
-}
-
-static void freefgrp(struct kref *k)
-{
-       struct fgrp *f = container_of(k, struct fgrp, ref);
-       struct chan *c;
-       for (int i = 0; i <= f->maxfd; i++)
-               if ((c = f->fd[i]))
-                       cclose(c);
-
-       kfree(f->fd);
-       kfree(f);
-}
-
-struct fgrp *newfgrp(void)
-{
-       struct fgrp *new;
-       int n;
-
-       new = kzmalloc(sizeof(struct fgrp), 0);
-       kref_init(&new->ref, freefgrp, 1);
-       spinlock_init(&new->lock);
-       n = DELTAFD;
-       new->nfd = n;
-       new->fd = kzmalloc(n * sizeof(struct chan *), 0);
-       return new;
-}
-
-struct fgrp *dupfgrp(struct fgrp *f)
-{
-       int i;
-       struct chan *c;
-       struct fgrp *new;
-       int n;
-
-       new = kzmalloc(sizeof(struct fgrp), KMALLOC_WAIT);
-       kref_init(&new->ref, freefgrp, 1);
-       spin_lock(&f->lock);
-       if (f->closed) {
-               spin_unlock(&f->lock);
-               kfree(new);
-               error("File group closed");
-       }
-       n = DELTAFD;
-       if (f->maxfd >= n)
-               n = (f->maxfd + 1 + DELTAFD - 1) / DELTAFD * DELTAFD;
-       new->nfd = n;
-       new->fd = kzmalloc(n * sizeof(struct chan *), 0);
-       if (new->fd == NULL) {
-               spin_unlock(&f->lock);
-               kfree(new);
-               error(Enomem);
-       }
-       new->maxfd = f->maxfd;
-       new->minfd = f->minfd;
-       for (i = 0; i <= f->maxfd; i++) {
-               if ((c = f->fd[i])) {
-                       kref_get(&c->ref, 1);
-                       new->fd[i] = c;
-               }
-       }
-       spin_unlock(&f->lock);
-
-       return new;
-}
-
 struct mount *newmount(struct mhead *mh, struct chan *to, int flag, char *spec)
 {
        struct mount *m;
 struct mount *newmount(struct mhead *mh, struct chan *to, int flag, char *spec)
 {
        struct mount *m;
@@ -231,7 +176,7 @@ struct mount *newmount(struct mhead *mh, struct chan *to, int flag, char *spec)
        m = kzmalloc(sizeof(struct mount), 0);
        m->to = to;
        m->head = mh;
        m = kzmalloc(sizeof(struct mount), 0);
        m->to = to;
        m->head = mh;
-       kref_get(&to->ref, 1);
+       chan_incref(to);
        m->mountid = NEXT_ID(mountid);
        m->mflag = flag;
        if (spec != 0)
        m->mountid = NEXT_ID(mountid);
        m->mflag = flag;
        if (spec != 0)
@@ -268,7 +213,7 @@ almost certainly not needed.void resrcwait(char *reason)
                printd("%s\n", reason);
        }
 
                printd("%s\n", reason);
        }
 
-       udelay_sched(300 * 1000);
+       kthread_usleep(300 * 1000);
        up->psstate = p;
 }
 #endif
        up->psstate = p;
 }
 #endif