1
0
Fork 0

[PATCH] dup_fd() - part 3

merge alloc_files() into dup_fd(), leave setting newf->fdt until the end

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
wifi-calibration
Al Viro 2008-05-08 21:11:17 -04:00
parent 9dec3c4d30
commit afbec7fff4
1 changed files with 15 additions and 28 deletions

View File

@ -273,31 +273,6 @@ static int count_open_files(struct fdtable *fdt)
return i; return i;
} }
static struct files_struct *alloc_files(void)
{
struct files_struct *newf;
struct fdtable *fdt;
newf = kmem_cache_alloc(files_cachep, GFP_KERNEL);
if (!newf)
goto out;
atomic_set(&newf->count, 1);
spin_lock_init(&newf->file_lock);
newf->next_fd = 0;
fdt = &newf->fdtab;
fdt->max_fds = NR_OPEN_DEFAULT;
fdt->close_on_exec = (fd_set *)&newf->close_on_exec_init;
fdt->open_fds = (fd_set *)&newf->open_fds_init;
fdt->fd = &newf->fd_array[0];
INIT_RCU_HEAD(&fdt->rcu);
fdt->next = NULL;
rcu_assign_pointer(newf->fdt, fdt);
out:
return newf;
}
/* /*
* Allocate a new files structure and copy contents from the * Allocate a new files structure and copy contents from the
* passed in files structure. * passed in files structure.
@ -311,13 +286,24 @@ struct files_struct *dup_fd(struct files_struct *oldf, int *errorp)
struct fdtable *old_fdt, *new_fdt; struct fdtable *old_fdt, *new_fdt;
*errorp = -ENOMEM; *errorp = -ENOMEM;
newf = alloc_files(); newf = kmem_cache_alloc(files_cachep, GFP_KERNEL);
if (!newf) if (!newf)
goto out; goto out;
atomic_set(&newf->count, 1);
spin_lock_init(&newf->file_lock);
newf->next_fd = 0;
new_fdt = &newf->fdtab;
new_fdt->max_fds = NR_OPEN_DEFAULT;
new_fdt->close_on_exec = (fd_set *)&newf->close_on_exec_init;
new_fdt->open_fds = (fd_set *)&newf->open_fds_init;
new_fdt->fd = &newf->fd_array[0];
INIT_RCU_HEAD(&new_fdt->rcu);
new_fdt->next = NULL;
spin_lock(&oldf->file_lock); spin_lock(&oldf->file_lock);
old_fdt = files_fdtable(oldf); old_fdt = files_fdtable(oldf);
new_fdt = files_fdtable(newf);
open_files = count_open_files(old_fdt); open_files = count_open_files(old_fdt);
/* /*
@ -341,7 +327,6 @@ struct files_struct *dup_fd(struct files_struct *oldf, int *errorp)
*errorp = -EMFILE; *errorp = -EMFILE;
goto out_release; goto out_release;
} }
rcu_assign_pointer(files->fdt, new_fdt);
/* /*
* Reacquire the oldf lock and a pointer to its fd table * Reacquire the oldf lock and a pointer to its fd table
@ -391,6 +376,8 @@ struct files_struct *dup_fd(struct files_struct *oldf, int *errorp)
memset(&new_fdt->close_on_exec->fds_bits[start], 0, left); memset(&new_fdt->close_on_exec->fds_bits[start], 0, left);
} }
rcu_assign_pointer(newf->fdt, new_fdt);
return newf; return newf;
out_release: out_release: