new helper: daemonize_descriptors()
authorAl Viro <viro@zeniv.linux.org.uk>
Wed, 22 Aug 2012 22:42:10 +0000 (18:42 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Thu, 27 Sep 2012 01:10:00 +0000 (21:10 -0400)
descriptor-related parts of daemonize, done right.  As the
result we simplify the locking rules for ->files - we
hold task_lock in *all* cases when we modify ->files.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/file.c
include/linux/fdtable.h
kernel/exit.c

index e6e4181..15750b8 100644 (file)
--- a/fs/file.c
+++ b/fs/file.c
@@ -519,6 +519,12 @@ struct files_struct init_files = {
        .file_lock      = __SPIN_LOCK_UNLOCKED(init_task.file_lock),
 };
 
+void daemonize_descriptors(void)
+{
+       atomic_inc(&init_files.count);
+       reset_files_struct(&init_files);
+}
+
 /*
  * allocate a file descriptor, mark it busy.
  */
index fb7daca..45052aa 100644 (file)
@@ -95,6 +95,7 @@ struct task_struct;
 struct files_struct *get_files_struct(struct task_struct *);
 void put_files_struct(struct files_struct *fs);
 void reset_files_struct(struct files_struct *);
+void daemonize_descriptors(void);
 int unshare_files(struct files_struct **);
 struct files_struct *dup_fd(struct files_struct *, int *);
 void do_close_on_exec(struct files_struct *);
index 20dfc76..0951133 100644 (file)
@@ -457,9 +457,7 @@ 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();
 }