hc
2024-05-11 04dd17822334871b23ea2862f7798fb0e0007777
kernel/fs/file_table.c
....@@ -1,3 +1,4 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * linux/fs/file_table.c
34 *
....@@ -79,14 +80,14 @@
7980 */
8081 #if defined(CONFIG_SYSCTL) && defined(CONFIG_PROC_FS)
8182 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)
8384 {
8485 files_stat.nr_files = get_nr_files();
8586 return proc_doulongvec_minmax(table, write, buffer, lenp, ppos);
8687 }
8788 #else
8889 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)
9091 {
9192 return -ENOSYS;
9293 }
....@@ -197,6 +198,7 @@
197198 file->f_inode = path->dentry->d_inode;
198199 file->f_mapping = path->dentry->d_inode->i_mapping;
199200 file->f_wb_err = filemap_sample_wb_err(file->f_mapping);
201
+ file->f_sb_err = file_sample_sb_err(file);
200202 if ((file->f_mode & FMODE_READ) &&
201203 likely(fop->read || fop->read_iter))
202204 file->f_mode |= FMODE_CAN_READ;
....@@ -255,6 +257,7 @@
255257 struct dentry *dentry = file->f_path.dentry;
256258 struct vfsmount *mnt = file->f_path.mnt;
257259 struct inode *inode = file->f_inode;
260
+ fmode_t mode = file->f_mode;
258261
259262 if (unlikely(!(file->f_mode & FMODE_OPENED)))
260263 goto out;
....@@ -277,18 +280,20 @@
277280 if (file->f_op->release)
278281 file->f_op->release(inode, file);
279282 if (unlikely(S_ISCHR(inode->i_mode) && inode->i_cdev != NULL &&
280
- !(file->f_mode & FMODE_PATH))) {
283
+ !(mode & FMODE_PATH))) {
281284 cdev_put(inode->i_cdev);
282285 }
283286 fops_put(file->f_op);
284287 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)
286289 i_readcount_dec(inode);
287
- if (file->f_mode & FMODE_WRITER) {
290
+ if (mode & FMODE_WRITER) {
288291 put_write_access(inode);
289292 __mnt_drop_write(mnt);
290293 }
291294 dput(dentry);
295
+ if (unlikely(mode & FMODE_NEED_UNMOUNT))
296
+ dissolve_on_fput(mnt);
292297 mntput(mnt);
293298 out:
294299 file_free(file);
....@@ -323,6 +328,7 @@
323328 {
324329 delayed_fput(NULL);
325330 }
331
+EXPORT_SYMBOL_GPL(flush_delayed_fput);
326332
327333 static DECLARE_DELAYED_WORK(delayed_fput_work, delayed_fput);
328334
....@@ -333,7 +339,7 @@
333339
334340 if (likely(!in_interrupt() && !(task->flags & PF_KTHREAD))) {
335341 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))
337343 return;
338344 /*
339345 * After this task has run exit_task_work(),
....@@ -370,6 +376,7 @@
370376 }
371377
372378 EXPORT_SYMBOL(fput);
379
+EXPORT_SYMBOL(__fput_sync);
373380
374381 void __init files_init(void)
375382 {
....@@ -385,10 +392,11 @@
385392 void __init files_maxfiles_init(void)
386393 {
387394 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;
389397
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;
392400
393401 files_stat.max_files = max_t(unsigned long, n, NR_FILE);
394402 }