Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 96989
b: refs/heads/master
c: afbec7f
h: refs/heads/master
i:
  96987: ccc6864
v: v3
  • Loading branch information
Al Viro committed May 16, 2008
1 parent 48823e5 commit 4149d3c
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 29 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 9dec3c4d306b09b31331e475e895bb9674e16d81
refs/heads/master: afbec7fff4928c273a1f1bb14dfdfdf62688a193
43 changes: 15 additions & 28 deletions trunk/fs/file.c
Original file line number Diff line number Diff line change
Expand Up @@ -273,31 +273,6 @@ static int count_open_files(struct fdtable *fdt)
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
* passed in files structure.
Expand All @@ -311,13 +286,24 @@ struct files_struct *dup_fd(struct files_struct *oldf, int *errorp)
struct fdtable *old_fdt, *new_fdt;

*errorp = -ENOMEM;
newf = alloc_files();
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;
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);
old_fdt = files_fdtable(oldf);
new_fdt = files_fdtable(newf);
open_files = count_open_files(old_fdt);

/*
Expand All @@ -341,7 +327,6 @@ struct files_struct *dup_fd(struct files_struct *oldf, int *errorp)
*errorp = -EMFILE;
goto out_release;
}
rcu_assign_pointer(files->fdt, new_fdt);

/*
* Reacquire the oldf lock and a pointer to its fd table
Expand Down Expand Up @@ -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);
}

rcu_assign_pointer(newf->fdt, new_fdt);

return newf;

out_release:
Expand Down

0 comments on commit 4149d3c

Please sign in to comment.