diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2012-08-16 02:06:36 +0200 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2012-09-27 03:08:54 +0200 |
commit | 1983e781da2f7f77906f4ccc2c3dc279cd61d1ff (patch) | |
tree | abc4f323de02eba64f82ff9bc5706f93e25c33c1 /fs/file.c | |
parent | don't bother with call_rcu() in put_files_struct() (diff) | |
download | linux-1983e781da2f7f77906f4ccc2c3dc279cd61d1ff.tar.xz linux-1983e781da2f7f77906f4ccc2c3dc279cd61d1ff.zip |
trim free_fdtable_rcu()
embedded case isn't hit anymore
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to '')
-rw-r--r-- | fs/file.c | 17 |
1 files changed, 2 insertions, 15 deletions
diff --git a/fs/file.c b/fs/file.c index 533fa5d56a5f..4ce4a0fcf320 100644 --- a/fs/file.c +++ b/fs/file.c @@ -90,16 +90,8 @@ static void free_fdtable_rcu(struct rcu_head *rcu) struct fdtable_defer *fddef; BUG_ON(!fdt); + BUG_ON(fdt->max_fds <= NR_OPEN_DEFAULT); - if (fdt->max_fds <= NR_OPEN_DEFAULT) { - /* - * This fdtable is embedded in the files structure and that - * structure itself is getting destroyed. - */ - kmem_cache_free(files_cachep, - container_of(fdt, struct files_struct, fdtab)); - return; - } if (!is_vmalloc_addr(fdt->fd) && !is_vmalloc_addr(fdt->open_fds)) { kfree(fdt->fd); kfree(fdt->open_fds); @@ -116,11 +108,6 @@ static void free_fdtable_rcu(struct rcu_head *rcu) } } -static inline void free_fdtable(struct fdtable *fdt) -{ - call_rcu(&fdt->rcu, free_fdtable_rcu); -} - /* * Expand the fdset in the files_struct. Called with the files spinlock * held for write. @@ -234,7 +221,7 @@ static int expand_fdtable(struct files_struct *files, int nr) copy_fdtable(new_fdt, cur_fdt); rcu_assign_pointer(files->fdt, new_fdt); if (cur_fdt->max_fds > NR_OPEN_DEFAULT) - free_fdtable(cur_fdt); + call_rcu(&cur_fdt->rcu, free_fdtable_rcu); } else { /* Somebody else expanded, so undo our attempt */ __free_fdtable(new_fdt); |