Closes files in proc_destroy()
authorBarret Rhoden <brho@cs.berkeley.edu>
Sat, 11 Dec 2010 00:37:35 +0000 (16:37 -0800)
committerKevin Klues <klueska@cs.berkeley.edu>
Thu, 3 Nov 2011 00:35:57 +0000 (17:35 -0700)
If there is a syscall in progress on a file, it will stay open til the
end of the call (which is what the kref does).  This change allows us to
have the files (or something they point to) reference the process.
Note, this still doesn't work for mmap() files.  Eagle-eyed readers
should know why!

kern/src/process.c

index af3c7ba..81fb6e6 100644 (file)
@@ -382,7 +382,6 @@ static void __proc_free(struct kref *kref)
        // All parts of the kernel should have decref'd before __proc_free is called
        assert(kref_refcnt(&p->kref) == 0);
 
-       close_all_files(&p->open_files, FALSE);
        kref_put(&p->fs_env.root->d_kref);
        kref_put(&p->fs_env.pwd->d_kref);
        destroy_vmrs(p);
@@ -676,6 +675,10 @@ void proc_destroy(struct proc *p)
                              __FUNCTION__);
        }
        __proc_set_state(p, PROC_DYING);
+       /* This prevents processes from accessing their old files while dying, and
+        * will help if these files (or similar objects in the future) hold
+        * references to p (preventing a __proc_free()). */
+       close_all_files(&p->open_files, FALSE);
        /* This kref_put() is for the process's existence. */
        kref_put(&p->kref);
        /* Unlock and possible decref and wait.  A death IPI should be on its way,