.. | .. |
---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-only |
---|
1 | 2 | /* |
---|
2 | 3 | * linux/fs/file_table.c |
---|
3 | 4 | * |
---|
.. | .. |
---|
79 | 80 | */ |
---|
80 | 81 | #if defined(CONFIG_SYSCTL) && defined(CONFIG_PROC_FS) |
---|
81 | 82 | int proc_nr_files(struct ctl_table *table, int write, |
---|
82 | | - void __user *buffer, size_t *lenp, loff_t *ppos) |
---|
| 83 | + void *buffer, size_t *lenp, loff_t *ppos) |
---|
83 | 84 | { |
---|
84 | 85 | files_stat.nr_files = get_nr_files(); |
---|
85 | 86 | return proc_doulongvec_minmax(table, write, buffer, lenp, ppos); |
---|
86 | 87 | } |
---|
87 | 88 | #else |
---|
88 | 89 | int proc_nr_files(struct ctl_table *table, int write, |
---|
89 | | - void __user *buffer, size_t *lenp, loff_t *ppos) |
---|
| 90 | + void *buffer, size_t *lenp, loff_t *ppos) |
---|
90 | 91 | { |
---|
91 | 92 | return -ENOSYS; |
---|
92 | 93 | } |
---|
.. | .. |
---|
197 | 198 | file->f_inode = path->dentry->d_inode; |
---|
198 | 199 | file->f_mapping = path->dentry->d_inode->i_mapping; |
---|
199 | 200 | file->f_wb_err = filemap_sample_wb_err(file->f_mapping); |
---|
| 201 | + file->f_sb_err = file_sample_sb_err(file); |
---|
200 | 202 | if ((file->f_mode & FMODE_READ) && |
---|
201 | 203 | likely(fop->read || fop->read_iter)) |
---|
202 | 204 | file->f_mode |= FMODE_CAN_READ; |
---|
.. | .. |
---|
255 | 257 | struct dentry *dentry = file->f_path.dentry; |
---|
256 | 258 | struct vfsmount *mnt = file->f_path.mnt; |
---|
257 | 259 | struct inode *inode = file->f_inode; |
---|
| 260 | + fmode_t mode = file->f_mode; |
---|
258 | 261 | |
---|
259 | 262 | if (unlikely(!(file->f_mode & FMODE_OPENED))) |
---|
260 | 263 | goto out; |
---|
.. | .. |
---|
277 | 280 | if (file->f_op->release) |
---|
278 | 281 | file->f_op->release(inode, file); |
---|
279 | 282 | if (unlikely(S_ISCHR(inode->i_mode) && inode->i_cdev != NULL && |
---|
280 | | - !(file->f_mode & FMODE_PATH))) { |
---|
| 283 | + !(mode & FMODE_PATH))) { |
---|
281 | 284 | cdev_put(inode->i_cdev); |
---|
282 | 285 | } |
---|
283 | 286 | fops_put(file->f_op); |
---|
284 | 287 | put_pid(file->f_owner.pid); |
---|
285 | | - if ((file->f_mode & (FMODE_READ | FMODE_WRITE)) == FMODE_READ) |
---|
| 288 | + if ((mode & (FMODE_READ | FMODE_WRITE)) == FMODE_READ) |
---|
286 | 289 | i_readcount_dec(inode); |
---|
287 | | - if (file->f_mode & FMODE_WRITER) { |
---|
| 290 | + if (mode & FMODE_WRITER) { |
---|
288 | 291 | put_write_access(inode); |
---|
289 | 292 | __mnt_drop_write(mnt); |
---|
290 | 293 | } |
---|
291 | 294 | dput(dentry); |
---|
| 295 | + if (unlikely(mode & FMODE_NEED_UNMOUNT)) |
---|
| 296 | + dissolve_on_fput(mnt); |
---|
292 | 297 | mntput(mnt); |
---|
293 | 298 | out: |
---|
294 | 299 | file_free(file); |
---|
.. | .. |
---|
323 | 328 | { |
---|
324 | 329 | delayed_fput(NULL); |
---|
325 | 330 | } |
---|
| 331 | +EXPORT_SYMBOL_GPL(flush_delayed_fput); |
---|
326 | 332 | |
---|
327 | 333 | static DECLARE_DELAYED_WORK(delayed_fput_work, delayed_fput); |
---|
328 | 334 | |
---|
.. | .. |
---|
333 | 339 | |
---|
334 | 340 | if (likely(!in_interrupt() && !(task->flags & PF_KTHREAD))) { |
---|
335 | 341 | init_task_work(&file->f_u.fu_rcuhead, ____fput); |
---|
336 | | - if (!task_work_add(task, &file->f_u.fu_rcuhead, true)) |
---|
| 342 | + if (!task_work_add(task, &file->f_u.fu_rcuhead, TWA_RESUME)) |
---|
337 | 343 | return; |
---|
338 | 344 | /* |
---|
339 | 345 | * After this task has run exit_task_work(), |
---|
.. | .. |
---|
370 | 376 | } |
---|
371 | 377 | |
---|
372 | 378 | EXPORT_SYMBOL(fput); |
---|
| 379 | +EXPORT_SYMBOL(__fput_sync); |
---|
373 | 380 | |
---|
374 | 381 | void __init files_init(void) |
---|
375 | 382 | { |
---|
.. | .. |
---|
385 | 392 | void __init files_maxfiles_init(void) |
---|
386 | 393 | { |
---|
387 | 394 | unsigned long n; |
---|
388 | | - unsigned long memreserve = (totalram_pages - nr_free_pages()) * 3/2; |
---|
| 395 | + unsigned long nr_pages = totalram_pages(); |
---|
| 396 | + unsigned long memreserve = (nr_pages - nr_free_pages()) * 3/2; |
---|
389 | 397 | |
---|
390 | | - memreserve = min(memreserve, totalram_pages - 1); |
---|
391 | | - n = ((totalram_pages - memreserve) * (PAGE_SIZE / 1024)) / 10; |
---|
| 398 | + memreserve = min(memreserve, nr_pages - 1); |
---|
| 399 | + n = ((nr_pages - memreserve) * (PAGE_SIZE / 1024)) / 10; |
---|
392 | 400 | |
---|
393 | 401 | files_stat.max_files = max_t(unsigned long, n, NR_FILE); |
---|
394 | 402 | } |
---|