]> Pileus Git - ~andy/linux/blobdiff - kernel/exit.c
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jmorris...
[~andy/linux] / kernel / exit.c
index f65345f9e5bbe2aa06b69db5b91b1c4002857c0f..346616c0092cfe3993fbcfb9b7f36d0d02986fb2 100644 (file)
@@ -457,108 +457,13 @@ void daemonize(const char *name, ...)
        /* Become as one with the init task */
 
        daemonize_fs_struct();
-       exit_files(current);
-       current->files = init_task.files;
-       atomic_inc(&current->files->count);
+       daemonize_descriptors();
 
        reparent_to_kthreadd();
 }
 
 EXPORT_SYMBOL(daemonize);
 
-static void close_files(struct files_struct * files)
-{
-       int i, j;
-       struct fdtable *fdt;
-
-       j = 0;
-
-       /*
-        * It is safe to dereference the fd table without RCU or
-        * ->file_lock because this is the last reference to the
-        * files structure.  But use RCU to shut RCU-lockdep up.
-        */
-       rcu_read_lock();
-       fdt = files_fdtable(files);
-       rcu_read_unlock();
-       for (;;) {
-               unsigned long set;
-               i = j * BITS_PER_LONG;
-               if (i >= fdt->max_fds)
-                       break;
-               set = fdt->open_fds[j++];
-               while (set) {
-                       if (set & 1) {
-                               struct file * file = xchg(&fdt->fd[i], NULL);
-                               if (file) {
-                                       filp_close(file, files);
-                                       cond_resched();
-                               }
-                       }
-                       i++;
-                       set >>= 1;
-               }
-       }
-}
-
-struct files_struct *get_files_struct(struct task_struct *task)
-{
-       struct files_struct *files;
-
-       task_lock(task);
-       files = task->files;
-       if (files)
-               atomic_inc(&files->count);
-       task_unlock(task);
-
-       return files;
-}
-
-void put_files_struct(struct files_struct *files)
-{
-       struct fdtable *fdt;
-
-       if (atomic_dec_and_test(&files->count)) {
-               close_files(files);
-               /*
-                * Free the fd and fdset arrays if we expanded them.
-                * If the fdtable was embedded, pass files for freeing
-                * at the end of the RCU grace period. Otherwise,
-                * you can free files immediately.
-                */
-               rcu_read_lock();
-               fdt = files_fdtable(files);
-               if (fdt != &files->fdtab)
-                       kmem_cache_free(files_cachep, files);
-               free_fdtable(fdt);
-               rcu_read_unlock();
-       }
-}
-
-void reset_files_struct(struct files_struct *files)
-{
-       struct task_struct *tsk = current;
-       struct files_struct *old;
-
-       old = tsk->files;
-       task_lock(tsk);
-       tsk->files = files;
-       task_unlock(tsk);
-       put_files_struct(old);
-}
-
-void exit_files(struct task_struct *tsk)
-{
-       struct files_struct * files = tsk->files;
-
-       if (files) {
-               task_lock(tsk);
-               tsk->files = NULL;
-               task_unlock(tsk);
-               put_files_struct(files);
-       }
-}
-
 #ifdef CONFIG_MM_OWNER
 /*
  * A task is exiting.   If it owned this mm, find a new owner for the mm.
@@ -1046,6 +951,9 @@ void do_exit(long code)
        if (tsk->splice_pipe)
                __free_pipe_info(tsk->splice_pipe);
 
+       if (tsk->task_frag.page)
+               put_page(tsk->task_frag.page);
+
        validate_creds_for_do_exit(tsk);
 
        preempt_disable();