struct proc FS structures and preprocessor hacks
authorBarret Rhoden <brho@cs.berkeley.edu>
Mon, 19 Jul 2010 22:01:02 +0000 (15:01 -0700)
committerKevin Klues <klueska@cs.berkeley.edu>
Thu, 3 Nov 2011 00:35:49 +0000 (17:35 -0700)
kern/include/env.h
kern/include/vfs.h
kern/src/process.c

index 508751f..b82a7fd 100644 (file)
@@ -18,6 +18,7 @@
 #include <sys/queue.h>
 #include <atomic.h>
 #include <mm.h>
+#include <vfs.h>
 
 // TODO: clean this up.
 struct proc {
@@ -61,6 +62,11 @@ struct proc {
        // The front ring pointers for pushing asynchronous system events out to the user
        // Note this is the actual frontring, not a pointer to it somewhere else
        sysevent_front_ring_t syseventfrontring;
+
+       /* Filesystem info */
+       struct namespace                        *ns;
+       struct fs_struct                        fs_env;
+       struct files_struct                     open_files;
 };
 
 /* Til we remove all Env references */
index 087987e..93e8524 100644 (file)
 #include <arch/bitmask.h>
 #include <atomic.h>
 #include <timing.h>
-#include <page_alloc.h>
-#include <mm.h>
 #include <radix.h>
 
+/* ghetto preprocessor hacks (since proc includes vfs) */
+struct page;
+struct vm_region;
+
 // TODO: temp typedefs, etc.  remove when we support this stuff.
 typedef int dev_t;
 typedef int kdev_t;
@@ -367,7 +369,6 @@ struct small_fd_set {
 
 /* All open files for a process */
 struct files_struct {
-       atomic_t                                        refcnt;
        spinlock_t                                      lock;
        int                                                     max_files;              /* max files ptd to by fd */
        int                                                     max_fdset;              /* max of the current fd_set */
@@ -380,7 +381,6 @@ struct files_struct {
 
 /* Process specific filesysten info */
 struct fs_struct {
-       atomic_t                                        refcnt;
        spinlock_t                                      lock;
        int                                                     umask;
        struct dentry                           *root;
index 0247a42..89736f5 100644 (file)
@@ -242,7 +242,7 @@ proc_init_procinfo(struct proc* p)
  * Errors include:
  *  - ENOFREEPID if it can't get a PID
  *  - ENOMEM on memory exhaustion */
-static error_t proc_alloc(struct proc *SAFE*SAFE pp, pid_t parent_id)
+static error_t proc_alloc(struct proc *SAFE*SAFE pp, struct proc *parent)
 {
        error_t r;
        struct proc *p;
@@ -274,7 +274,7 @@ static error_t proc_alloc(struct proc *SAFE*SAFE pp, pid_t parent_id)
        /* Set the basic status variables. */
        spinlock_init(&p->proc_lock);
        p->exitcode = 0;
-       p->ppid = parent_id;
+       p->ppid = parent ? parent->pid : 0;
        p->state = PROC_CREATED; // shouldn't go through state machine for init
        p->env_refcnt = 2; // one for the object, one for the ref we pass back
        p->env_flags = 0;
@@ -303,6 +303,26 @@ static error_t proc_alloc(struct proc *SAFE*SAFE pp, pid_t parent_id)
        FRONT_RING_INIT(&p->syseventfrontring,
                        &p->procdata->syseventring,
                        SYSEVENTRINGSIZE);
+
+       /* Init FS structures TODO: cleanup (might pull this out) */
+       atomic_inc(&default_ns.refcnt);
+       p->ns = &default_ns;
+       spinlock_init(&p->fs_env.lock);
+       p->fs_env.umask = parent ? parent->fs_env.umask : 0002;
+       p->fs_env.root = p->ns->root->mnt_root;
+       atomic_inc(&p->fs_env.root->d_refcnt);
+       p->fs_env.pwd = parent ? parent->fs_env.pwd : p->fs_env.root;
+       atomic_inc(&p->fs_env.pwd->d_refcnt);
+       spinlock_init(&p->open_files.lock);
+       p->open_files.max_files = NR_OPEN_FILES_DEFAULT;
+       p->open_files.max_fdset = NR_FILE_DESC_DEFAULT;
+       p->open_files.fd = p->open_files.fd_array;
+       p->open_files.open_fds = (struct fd_set*)&p->open_files.open_fds_init;
+       /* 0, 1, and 2 are reserved, but prob shouldn't do it this way */
+       p->open_files.next_fd = 3;
+       for (int i = 0; i < 3; i++)
+               SET_BITMASK_BIT(p->open_files.open_fds->fds_bits, i);
+
        *pp = p;
        atomic_inc(&num_envs);
 
@@ -320,10 +340,8 @@ struct proc *proc_create(uint8_t *binary, size_t size)
 {
        struct proc *p;
        error_t r;
-       pid_t curid;
 
-       curid = (current ? current->pid : 0);
-       if ((r = proc_alloc(&p, curid)) < 0)
+       if ((r = proc_alloc(&p, current)) < 0)
                panic("proc_create: %e", r); // one of 3 quaint usages of %e.
        if(binary != NULL)
                env_load_icode(p, NULL, binary, size);