kmem_cache_free(files_cachep, fdt->free_files);
return;
}
- if (fdt->max_fdset <= EMBEDDED_FD_SET_SIZE &&
- fdt->max_fds <= NR_OPEN_DEFAULT) {
+ if (fdt->max_fdset <= __FD_SETSIZE && fdt->max_fds <= NR_OPEN_DEFAULT) {
/*
* The fdtable was embedded
*/
void free_fdtable(struct fdtable *fdt)
{
- if (fdt->free_files ||
- fdt->max_fdset > EMBEDDED_FD_SET_SIZE ||
- fdt->max_fds > NR_OPEN_DEFAULT)
+ if (fdt->free_files || fdt->max_fdset > __FD_SETSIZE ||
+ fdt->max_fds > NR_OPEN_DEFAULT)
call_rcu(&fdt->rcu, free_fdtable_rcu);
}
(nfdt->max_fds - fdt->max_fds) *
sizeof(struct file *));
}
+ nfdt->next_fd = fdt->next_fd;
}
/*
void free_fdset(fd_set *array, int num)
{
- if (num <= EMBEDDED_FD_SET_SIZE) /* Don't free an embedded fdset */
+ int size = num / 8;
+
+ if (num <= __FD_SETSIZE) /* Don't free an embedded fdset */
return;
- else if (num <= 8 * PAGE_SIZE)
+ else if (size <= PAGE_SIZE)
kfree(array);
else
vfree(array);
fd_set *new_openset = NULL, *new_execset = NULL;
struct file **new_fds;
- fdt = kzalloc(sizeof(*fdt), GFP_KERNEL);
+ fdt = kmalloc(sizeof(*fdt), GFP_KERNEL);
if (!fdt)
goto out;
+ memset(fdt, 0, sizeof(*fdt));
- nfds = 8 * L1_CACHE_BYTES;
+ nfds = __FD_SETSIZE;
/* Expand to the max in easy steps */
- while (nfds <= nr) {
- nfds = nfds * 2;
- if (nfds > NR_OPEN)
- nfds = NR_OPEN;
- }
+ do {
+ if (nfds < (PAGE_SIZE * 8))
+ nfds = PAGE_SIZE * 8;
+ else {
+ nfds = nfds * 2;
+ if (nfds > NR_OPEN)
+ nfds = NR_OPEN;
+ }
+ } while (nfds <= nr);
new_openset = alloc_fdset(nfds);
new_execset = alloc_fdset(nfds);
void __init files_defer_init(void)
{
int i;
- for_each_possible_cpu(i)
+ for_each_cpu(i)
fdtable_defer_list_init(i);
}