This breaks the build but I ran out of time.
authorRonald G. Minnich <rminnich@google.com>
Fri, 17 Jan 2014 23:55:36 +0000 (15:55 -0800)
committerRonald G. Minnich <rminnich@google.com>
Fri, 17 Jan 2014 23:56:01 +0000 (15:56 -0800)
Anyway, we have to have it. Barret will fix it.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
kern/include/env.h
kern/include/ns.h
kern/src/ns/sysfile.c

index a4974fb..4b4003c 100644 (file)
@@ -33,6 +33,7 @@ struct proc {
        spinlock_t proc_lock;
        struct user_context scp_ctx;    /* context for an SCP.  TODO: move to vc0 */
        char user[64]; /* user name */
+
        pid_t pid;
        /* Tempting to add a struct proc *parent, but we'd need to protect the use
         * of that reference from concurrent parent-death (letting init inherit
@@ -88,6 +89,10 @@ struct proc {
        struct files_struct                     open_files;
        struct pgrp                             *pgrp;
        struct fgrp                             *fgrp;
+       struct fgrp                             *closingfgrp;
+       struct chan                             *slash;
+       struct chan                             *dot;
+
 
        /* UCQ hashlocks */
        struct hashlock                         *ucq_hashlock;
index d2cd887..625e074 100644 (file)
@@ -1003,7 +1003,7 @@ int sysiounit(int fd);
 void close_9ns_files(struct proc *p, bool only_cloexec);
 void print_chaninfo(struct chan *ch);
 void print_9ns_files(struct proc *p);
-
+int plan9setup(struct proc *new_proc, struct proc *parent);
 int iseve(void);
 
 static inline int abs(int a)
index 7434a16..249edf4 100644 (file)
@@ -1225,3 +1225,56 @@ void print_9ns_files(struct proc *p)
        spin_unlock(&f->lock);
 }
 
+/* TODO: 9ns ns inheritance flags: Shared, copied, or empty.  Looks like we're
+ * copying the fgrp, and sharing the pgrp. */
+int plan9setup(struct proc *new_proc, struct proc *parent)
+{
+       struct proc *old_current;
+       struct kref *new_dot_ref;
+       ERRSTACK(1);
+       if (waserror()) {
+               printd("plan9setup failed\n");
+               poperror();
+               return -1;
+       }
+       if (!parent) {
+               /* We are probably spawned by the kernel directly, and have no parent to
+                * inherit from.  Be sure to set up fgrp/pgrp before calling namec().
+                *
+                * TODO: One problem is namec wants a current set for things like
+                * genbuf.  So we'll use new_proc for this bootstrapping.  Note
+                * switch_to() also loads the cr3. */
+               new_proc->fgrp = dupfgrp(NULL);
+               new_proc->pgrp = newpgrp();
+               old_current = switch_to(new_proc);
+               new_proc->slash = namec("#r", Atodir, 0, 0);
+               switch_back(new_proc, old_current);
+               /* Want the name to be "/" instead of "#r" */
+               pathclose(new_proc->slash->path);
+               new_proc->slash->path = newpath("/");
+               new_proc->dot = cclone(new_proc->slash);
+               poperror();
+               return 0;
+       }
+       /* Copy semantics: do not change this without revisiting proc_destroy,
+        * close_9ns_files, and closefgrp. */
+       new_proc->fgrp = dupfgrp(parent->fgrp);
+       /* Shared semantics */
+       kref_get(&parent->pgrp->ref, 1);
+       new_proc->pgrp = parent->pgrp;
+       /* copy semantics on / and . (doesn't make a lot of sense in akaros o/w) */
+       /* / should never disappear while we hold a ref to parent */
+       kref_get(&parent->slash->ref, 1);
+       new_proc->slash = parent->slash;
+       /* dot could change concurrently, and we could fail to gain a ref if whoever
+        * decref'd dot triggered the release.  if that did happen, new_proc->dot
+        * should update and we can try again. */
+       while (!(new_dot_ref = kref_get_not_zero(&parent->dot->ref, 1)))
+               cpu_relax();
+       /* And now, we can't trust parent->dot, and need to determine our dot from
+        * the ref we obtained. */
+       new_proc->dot = container_of(new_dot_ref, struct chan, ref);
+       poperror();
+       return 0;
+}
+