18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci *  linux/fs/file_table.c
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci *  Copyright (C) 1991, 1992  Linus Torvalds
68c2ecf20Sopenharmony_ci *  Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu)
78c2ecf20Sopenharmony_ci */
88c2ecf20Sopenharmony_ci
98c2ecf20Sopenharmony_ci#include <linux/string.h>
108c2ecf20Sopenharmony_ci#include <linux/slab.h>
118c2ecf20Sopenharmony_ci#include <linux/file.h>
128c2ecf20Sopenharmony_ci#include <linux/fdtable.h>
138c2ecf20Sopenharmony_ci#include <linux/init.h>
148c2ecf20Sopenharmony_ci#include <linux/module.h>
158c2ecf20Sopenharmony_ci#include <linux/fs.h>
168c2ecf20Sopenharmony_ci#include <linux/security.h>
178c2ecf20Sopenharmony_ci#include <linux/cred.h>
188c2ecf20Sopenharmony_ci#include <linux/eventpoll.h>
198c2ecf20Sopenharmony_ci#include <linux/rcupdate.h>
208c2ecf20Sopenharmony_ci#include <linux/mount.h>
218c2ecf20Sopenharmony_ci#include <linux/capability.h>
228c2ecf20Sopenharmony_ci#include <linux/cdev.h>
238c2ecf20Sopenharmony_ci#include <linux/fsnotify.h>
248c2ecf20Sopenharmony_ci#include <linux/sysctl.h>
258c2ecf20Sopenharmony_ci#include <linux/percpu_counter.h>
268c2ecf20Sopenharmony_ci#include <linux/percpu.h>
278c2ecf20Sopenharmony_ci#include <linux/task_work.h>
288c2ecf20Sopenharmony_ci#include <linux/ima.h>
298c2ecf20Sopenharmony_ci#include <linux/swap.h>
308c2ecf20Sopenharmony_ci
318c2ecf20Sopenharmony_ci#include <linux/atomic.h>
328c2ecf20Sopenharmony_ci
338c2ecf20Sopenharmony_ci#include "internal.h"
348c2ecf20Sopenharmony_ci
358c2ecf20Sopenharmony_ci/* sysctl tunables... */
368c2ecf20Sopenharmony_cistruct files_stat_struct files_stat = {
378c2ecf20Sopenharmony_ci	.max_files = NR_FILE
388c2ecf20Sopenharmony_ci};
398c2ecf20Sopenharmony_ci
408c2ecf20Sopenharmony_ci/* SLAB cache for file structures */
418c2ecf20Sopenharmony_cistatic struct kmem_cache *filp_cachep __read_mostly;
428c2ecf20Sopenharmony_ci
438c2ecf20Sopenharmony_cistatic struct percpu_counter nr_files __cacheline_aligned_in_smp;
448c2ecf20Sopenharmony_ci
458c2ecf20Sopenharmony_cistatic void file_free_rcu(struct rcu_head *head)
468c2ecf20Sopenharmony_ci{
478c2ecf20Sopenharmony_ci	struct file *f = container_of(head, struct file, f_u.fu_rcuhead);
488c2ecf20Sopenharmony_ci
498c2ecf20Sopenharmony_ci	put_cred(f->f_cred);
508c2ecf20Sopenharmony_ci	kmem_cache_free(filp_cachep, f);
518c2ecf20Sopenharmony_ci}
528c2ecf20Sopenharmony_ci
538c2ecf20Sopenharmony_cistatic inline void file_free(struct file *f)
548c2ecf20Sopenharmony_ci{
558c2ecf20Sopenharmony_ci	security_file_free(f);
568c2ecf20Sopenharmony_ci	if (!(f->f_mode & FMODE_NOACCOUNT))
578c2ecf20Sopenharmony_ci		percpu_counter_dec(&nr_files);
588c2ecf20Sopenharmony_ci	call_rcu(&f->f_u.fu_rcuhead, file_free_rcu);
598c2ecf20Sopenharmony_ci}
608c2ecf20Sopenharmony_ci
618c2ecf20Sopenharmony_ci/*
628c2ecf20Sopenharmony_ci * Return the total number of open files in the system
638c2ecf20Sopenharmony_ci */
648c2ecf20Sopenharmony_cistatic long get_nr_files(void)
658c2ecf20Sopenharmony_ci{
668c2ecf20Sopenharmony_ci	return percpu_counter_read_positive(&nr_files);
678c2ecf20Sopenharmony_ci}
688c2ecf20Sopenharmony_ci
698c2ecf20Sopenharmony_ci/*
708c2ecf20Sopenharmony_ci * Return the maximum number of open files in the system
718c2ecf20Sopenharmony_ci */
728c2ecf20Sopenharmony_ciunsigned long get_max_files(void)
738c2ecf20Sopenharmony_ci{
748c2ecf20Sopenharmony_ci	return files_stat.max_files;
758c2ecf20Sopenharmony_ci}
768c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(get_max_files);
778c2ecf20Sopenharmony_ci
788c2ecf20Sopenharmony_ci/*
798c2ecf20Sopenharmony_ci * Handle nr_files sysctl
808c2ecf20Sopenharmony_ci */
818c2ecf20Sopenharmony_ci#if defined(CONFIG_SYSCTL) && defined(CONFIG_PROC_FS)
828c2ecf20Sopenharmony_ciint proc_nr_files(struct ctl_table *table, int write,
838c2ecf20Sopenharmony_ci                     void *buffer, size_t *lenp, loff_t *ppos)
848c2ecf20Sopenharmony_ci{
858c2ecf20Sopenharmony_ci	files_stat.nr_files = get_nr_files();
868c2ecf20Sopenharmony_ci	return proc_doulongvec_minmax(table, write, buffer, lenp, ppos);
878c2ecf20Sopenharmony_ci}
888c2ecf20Sopenharmony_ci#else
898c2ecf20Sopenharmony_ciint proc_nr_files(struct ctl_table *table, int write,
908c2ecf20Sopenharmony_ci                     void *buffer, size_t *lenp, loff_t *ppos)
918c2ecf20Sopenharmony_ci{
928c2ecf20Sopenharmony_ci	return -ENOSYS;
938c2ecf20Sopenharmony_ci}
948c2ecf20Sopenharmony_ci#endif
958c2ecf20Sopenharmony_ci
968c2ecf20Sopenharmony_cistatic struct file *__alloc_file(int flags, const struct cred *cred)
978c2ecf20Sopenharmony_ci{
988c2ecf20Sopenharmony_ci	struct file *f;
998c2ecf20Sopenharmony_ci	int error;
1008c2ecf20Sopenharmony_ci
1018c2ecf20Sopenharmony_ci	f = kmem_cache_zalloc(filp_cachep, GFP_KERNEL);
1028c2ecf20Sopenharmony_ci	if (unlikely(!f))
1038c2ecf20Sopenharmony_ci		return ERR_PTR(-ENOMEM);
1048c2ecf20Sopenharmony_ci
1058c2ecf20Sopenharmony_ci	f->f_cred = get_cred(cred);
1068c2ecf20Sopenharmony_ci	error = security_file_alloc(f);
1078c2ecf20Sopenharmony_ci	if (unlikely(error)) {
1088c2ecf20Sopenharmony_ci		file_free_rcu(&f->f_u.fu_rcuhead);
1098c2ecf20Sopenharmony_ci		return ERR_PTR(error);
1108c2ecf20Sopenharmony_ci	}
1118c2ecf20Sopenharmony_ci
1128c2ecf20Sopenharmony_ci	atomic_long_set(&f->f_count, 1);
1138c2ecf20Sopenharmony_ci	rwlock_init(&f->f_owner.lock);
1148c2ecf20Sopenharmony_ci	spin_lock_init(&f->f_lock);
1158c2ecf20Sopenharmony_ci	mutex_init(&f->f_pos_lock);
1168c2ecf20Sopenharmony_ci	eventpoll_init_file(f);
1178c2ecf20Sopenharmony_ci	f->f_flags = flags;
1188c2ecf20Sopenharmony_ci	f->f_mode = OPEN_FMODE(flags);
1198c2ecf20Sopenharmony_ci	/* f->f_version: 0 */
1208c2ecf20Sopenharmony_ci
1218c2ecf20Sopenharmony_ci	return f;
1228c2ecf20Sopenharmony_ci}
1238c2ecf20Sopenharmony_ci
1248c2ecf20Sopenharmony_ci/* Find an unused file structure and return a pointer to it.
1258c2ecf20Sopenharmony_ci * Returns an error pointer if some error happend e.g. we over file
1268c2ecf20Sopenharmony_ci * structures limit, run out of memory or operation is not permitted.
1278c2ecf20Sopenharmony_ci *
1288c2ecf20Sopenharmony_ci * Be very careful using this.  You are responsible for
1298c2ecf20Sopenharmony_ci * getting write access to any mount that you might assign
1308c2ecf20Sopenharmony_ci * to this filp, if it is opened for write.  If this is not
1318c2ecf20Sopenharmony_ci * done, you will imbalance int the mount's writer count
1328c2ecf20Sopenharmony_ci * and a warning at __fput() time.
1338c2ecf20Sopenharmony_ci */
1348c2ecf20Sopenharmony_cistruct file *alloc_empty_file(int flags, const struct cred *cred)
1358c2ecf20Sopenharmony_ci{
1368c2ecf20Sopenharmony_ci	static long old_max;
1378c2ecf20Sopenharmony_ci	struct file *f;
1388c2ecf20Sopenharmony_ci
1398c2ecf20Sopenharmony_ci	/*
1408c2ecf20Sopenharmony_ci	 * Privileged users can go above max_files
1418c2ecf20Sopenharmony_ci	 */
1428c2ecf20Sopenharmony_ci	if (get_nr_files() >= files_stat.max_files && !capable(CAP_SYS_ADMIN)) {
1438c2ecf20Sopenharmony_ci		/*
1448c2ecf20Sopenharmony_ci		 * percpu_counters are inaccurate.  Do an expensive check before
1458c2ecf20Sopenharmony_ci		 * we go and fail.
1468c2ecf20Sopenharmony_ci		 */
1478c2ecf20Sopenharmony_ci		if (percpu_counter_sum_positive(&nr_files) >= files_stat.max_files)
1488c2ecf20Sopenharmony_ci			goto over;
1498c2ecf20Sopenharmony_ci	}
1508c2ecf20Sopenharmony_ci
1518c2ecf20Sopenharmony_ci	f = __alloc_file(flags, cred);
1528c2ecf20Sopenharmony_ci	if (!IS_ERR(f))
1538c2ecf20Sopenharmony_ci		percpu_counter_inc(&nr_files);
1548c2ecf20Sopenharmony_ci
1558c2ecf20Sopenharmony_ci	return f;
1568c2ecf20Sopenharmony_ci
1578c2ecf20Sopenharmony_ciover:
1588c2ecf20Sopenharmony_ci	/* Ran out of filps - report that */
1598c2ecf20Sopenharmony_ci	if (get_nr_files() > old_max) {
1608c2ecf20Sopenharmony_ci		pr_info("VFS: file-max limit %lu reached\n", get_max_files());
1618c2ecf20Sopenharmony_ci		old_max = get_nr_files();
1628c2ecf20Sopenharmony_ci	}
1638c2ecf20Sopenharmony_ci	return ERR_PTR(-ENFILE);
1648c2ecf20Sopenharmony_ci}
1658c2ecf20Sopenharmony_ci
1668c2ecf20Sopenharmony_ci/*
1678c2ecf20Sopenharmony_ci * Variant of alloc_empty_file() that doesn't check and modify nr_files.
1688c2ecf20Sopenharmony_ci *
1698c2ecf20Sopenharmony_ci * Should not be used unless there's a very good reason to do so.
1708c2ecf20Sopenharmony_ci */
1718c2ecf20Sopenharmony_cistruct file *alloc_empty_file_noaccount(int flags, const struct cred *cred)
1728c2ecf20Sopenharmony_ci{
1738c2ecf20Sopenharmony_ci	struct file *f = __alloc_file(flags, cred);
1748c2ecf20Sopenharmony_ci
1758c2ecf20Sopenharmony_ci	if (!IS_ERR(f))
1768c2ecf20Sopenharmony_ci		f->f_mode |= FMODE_NOACCOUNT;
1778c2ecf20Sopenharmony_ci
1788c2ecf20Sopenharmony_ci	return f;
1798c2ecf20Sopenharmony_ci}
1808c2ecf20Sopenharmony_ci
1818c2ecf20Sopenharmony_ci/**
1828c2ecf20Sopenharmony_ci * alloc_file - allocate and initialize a 'struct file'
1838c2ecf20Sopenharmony_ci *
1848c2ecf20Sopenharmony_ci * @path: the (dentry, vfsmount) pair for the new file
1858c2ecf20Sopenharmony_ci * @flags: O_... flags with which the new file will be opened
1868c2ecf20Sopenharmony_ci * @fop: the 'struct file_operations' for the new file
1878c2ecf20Sopenharmony_ci */
1888c2ecf20Sopenharmony_cistatic struct file *alloc_file(const struct path *path, int flags,
1898c2ecf20Sopenharmony_ci		const struct file_operations *fop)
1908c2ecf20Sopenharmony_ci{
1918c2ecf20Sopenharmony_ci	struct file *file;
1928c2ecf20Sopenharmony_ci
1938c2ecf20Sopenharmony_ci	file = alloc_empty_file(flags, current_cred());
1948c2ecf20Sopenharmony_ci	if (IS_ERR(file))
1958c2ecf20Sopenharmony_ci		return file;
1968c2ecf20Sopenharmony_ci
1978c2ecf20Sopenharmony_ci	file->f_path = *path;
1988c2ecf20Sopenharmony_ci	file->f_inode = path->dentry->d_inode;
1998c2ecf20Sopenharmony_ci	file->f_mapping = path->dentry->d_inode->i_mapping;
2008c2ecf20Sopenharmony_ci	file->f_wb_err = filemap_sample_wb_err(file->f_mapping);
2018c2ecf20Sopenharmony_ci	file->f_sb_err = file_sample_sb_err(file);
2028c2ecf20Sopenharmony_ci	if ((file->f_mode & FMODE_READ) &&
2038c2ecf20Sopenharmony_ci	     likely(fop->read || fop->read_iter))
2048c2ecf20Sopenharmony_ci		file->f_mode |= FMODE_CAN_READ;
2058c2ecf20Sopenharmony_ci	if ((file->f_mode & FMODE_WRITE) &&
2068c2ecf20Sopenharmony_ci	     likely(fop->write || fop->write_iter))
2078c2ecf20Sopenharmony_ci		file->f_mode |= FMODE_CAN_WRITE;
2088c2ecf20Sopenharmony_ci	file->f_mode |= FMODE_OPENED;
2098c2ecf20Sopenharmony_ci	file->f_op = fop;
2108c2ecf20Sopenharmony_ci	if ((file->f_mode & (FMODE_READ | FMODE_WRITE)) == FMODE_READ)
2118c2ecf20Sopenharmony_ci		i_readcount_inc(path->dentry->d_inode);
2128c2ecf20Sopenharmony_ci	return file;
2138c2ecf20Sopenharmony_ci}
2148c2ecf20Sopenharmony_ci
2158c2ecf20Sopenharmony_cistruct file *alloc_file_pseudo(struct inode *inode, struct vfsmount *mnt,
2168c2ecf20Sopenharmony_ci				const char *name, int flags,
2178c2ecf20Sopenharmony_ci				const struct file_operations *fops)
2188c2ecf20Sopenharmony_ci{
2198c2ecf20Sopenharmony_ci	static const struct dentry_operations anon_ops = {
2208c2ecf20Sopenharmony_ci		.d_dname = simple_dname
2218c2ecf20Sopenharmony_ci	};
2228c2ecf20Sopenharmony_ci	struct qstr this = QSTR_INIT(name, strlen(name));
2238c2ecf20Sopenharmony_ci	struct path path;
2248c2ecf20Sopenharmony_ci	struct file *file;
2258c2ecf20Sopenharmony_ci
2268c2ecf20Sopenharmony_ci	path.dentry = d_alloc_pseudo(mnt->mnt_sb, &this);
2278c2ecf20Sopenharmony_ci	if (!path.dentry)
2288c2ecf20Sopenharmony_ci		return ERR_PTR(-ENOMEM);
2298c2ecf20Sopenharmony_ci	if (!mnt->mnt_sb->s_d_op)
2308c2ecf20Sopenharmony_ci		d_set_d_op(path.dentry, &anon_ops);
2318c2ecf20Sopenharmony_ci	path.mnt = mntget(mnt);
2328c2ecf20Sopenharmony_ci	d_instantiate(path.dentry, inode);
2338c2ecf20Sopenharmony_ci	file = alloc_file(&path, flags, fops);
2348c2ecf20Sopenharmony_ci	if (IS_ERR(file)) {
2358c2ecf20Sopenharmony_ci		ihold(inode);
2368c2ecf20Sopenharmony_ci		path_put(&path);
2378c2ecf20Sopenharmony_ci	}
2388c2ecf20Sopenharmony_ci	return file;
2398c2ecf20Sopenharmony_ci}
2408c2ecf20Sopenharmony_ciEXPORT_SYMBOL(alloc_file_pseudo);
2418c2ecf20Sopenharmony_ci
2428c2ecf20Sopenharmony_cistruct file *alloc_file_clone(struct file *base, int flags,
2438c2ecf20Sopenharmony_ci				const struct file_operations *fops)
2448c2ecf20Sopenharmony_ci{
2458c2ecf20Sopenharmony_ci	struct file *f = alloc_file(&base->f_path, flags, fops);
2468c2ecf20Sopenharmony_ci	if (!IS_ERR(f)) {
2478c2ecf20Sopenharmony_ci		path_get(&f->f_path);
2488c2ecf20Sopenharmony_ci		f->f_mapping = base->f_mapping;
2498c2ecf20Sopenharmony_ci	}
2508c2ecf20Sopenharmony_ci	return f;
2518c2ecf20Sopenharmony_ci}
2528c2ecf20Sopenharmony_ci
2538c2ecf20Sopenharmony_ci/* the real guts of fput() - releasing the last reference to file
2548c2ecf20Sopenharmony_ci */
2558c2ecf20Sopenharmony_cistatic void __fput(struct file *file)
2568c2ecf20Sopenharmony_ci{
2578c2ecf20Sopenharmony_ci	struct dentry *dentry = file->f_path.dentry;
2588c2ecf20Sopenharmony_ci	struct vfsmount *mnt = file->f_path.mnt;
2598c2ecf20Sopenharmony_ci	struct inode *inode = file->f_inode;
2608c2ecf20Sopenharmony_ci	fmode_t mode = file->f_mode;
2618c2ecf20Sopenharmony_ci
2628c2ecf20Sopenharmony_ci	if (unlikely(!(file->f_mode & FMODE_OPENED)))
2638c2ecf20Sopenharmony_ci		goto out;
2648c2ecf20Sopenharmony_ci
2658c2ecf20Sopenharmony_ci	might_sleep();
2668c2ecf20Sopenharmony_ci
2678c2ecf20Sopenharmony_ci	fsnotify_close(file);
2688c2ecf20Sopenharmony_ci	/*
2698c2ecf20Sopenharmony_ci	 * The function eventpoll_release() should be the first called
2708c2ecf20Sopenharmony_ci	 * in the file cleanup chain.
2718c2ecf20Sopenharmony_ci	 */
2728c2ecf20Sopenharmony_ci	eventpoll_release(file);
2738c2ecf20Sopenharmony_ci	locks_remove_file(file);
2748c2ecf20Sopenharmony_ci
2758c2ecf20Sopenharmony_ci	ima_file_free(file);
2768c2ecf20Sopenharmony_ci	if (unlikely(file->f_flags & FASYNC)) {
2778c2ecf20Sopenharmony_ci		if (file->f_op->fasync)
2788c2ecf20Sopenharmony_ci			file->f_op->fasync(-1, file, 0);
2798c2ecf20Sopenharmony_ci	}
2808c2ecf20Sopenharmony_ci	if (file->f_op->release)
2818c2ecf20Sopenharmony_ci		file->f_op->release(inode, file);
2828c2ecf20Sopenharmony_ci	if (unlikely(S_ISCHR(inode->i_mode) && inode->i_cdev != NULL &&
2838c2ecf20Sopenharmony_ci		     !(mode & FMODE_PATH))) {
2848c2ecf20Sopenharmony_ci		cdev_put(inode->i_cdev);
2858c2ecf20Sopenharmony_ci	}
2868c2ecf20Sopenharmony_ci	fops_put(file->f_op);
2878c2ecf20Sopenharmony_ci	put_pid(file->f_owner.pid);
2888c2ecf20Sopenharmony_ci	if ((mode & (FMODE_READ | FMODE_WRITE)) == FMODE_READ)
2898c2ecf20Sopenharmony_ci		i_readcount_dec(inode);
2908c2ecf20Sopenharmony_ci	if (mode & FMODE_WRITER) {
2918c2ecf20Sopenharmony_ci		put_write_access(inode);
2928c2ecf20Sopenharmony_ci		__mnt_drop_write(mnt);
2938c2ecf20Sopenharmony_ci	}
2948c2ecf20Sopenharmony_ci	dput(dentry);
2958c2ecf20Sopenharmony_ci	if (unlikely(mode & FMODE_NEED_UNMOUNT))
2968c2ecf20Sopenharmony_ci		dissolve_on_fput(mnt);
2978c2ecf20Sopenharmony_ci	mntput(mnt);
2988c2ecf20Sopenharmony_ciout:
2998c2ecf20Sopenharmony_ci	file_free(file);
3008c2ecf20Sopenharmony_ci}
3018c2ecf20Sopenharmony_ci
3028c2ecf20Sopenharmony_cistatic LLIST_HEAD(delayed_fput_list);
3038c2ecf20Sopenharmony_cistatic void delayed_fput(struct work_struct *unused)
3048c2ecf20Sopenharmony_ci{
3058c2ecf20Sopenharmony_ci	struct llist_node *node = llist_del_all(&delayed_fput_list);
3068c2ecf20Sopenharmony_ci	struct file *f, *t;
3078c2ecf20Sopenharmony_ci
3088c2ecf20Sopenharmony_ci	llist_for_each_entry_safe(f, t, node, f_u.fu_llist)
3098c2ecf20Sopenharmony_ci		__fput(f);
3108c2ecf20Sopenharmony_ci}
3118c2ecf20Sopenharmony_ci
3128c2ecf20Sopenharmony_cistatic void ____fput(struct callback_head *work)
3138c2ecf20Sopenharmony_ci{
3148c2ecf20Sopenharmony_ci	__fput(container_of(work, struct file, f_u.fu_rcuhead));
3158c2ecf20Sopenharmony_ci}
3168c2ecf20Sopenharmony_ci
3178c2ecf20Sopenharmony_ci/*
3188c2ecf20Sopenharmony_ci * If kernel thread really needs to have the final fput() it has done
3198c2ecf20Sopenharmony_ci * to complete, call this.  The only user right now is the boot - we
3208c2ecf20Sopenharmony_ci * *do* need to make sure our writes to binaries on initramfs has
3218c2ecf20Sopenharmony_ci * not left us with opened struct file waiting for __fput() - execve()
3228c2ecf20Sopenharmony_ci * won't work without that.  Please, don't add more callers without
3238c2ecf20Sopenharmony_ci * very good reasons; in particular, never call that with locks
3248c2ecf20Sopenharmony_ci * held and never call that from a thread that might need to do
3258c2ecf20Sopenharmony_ci * some work on any kind of umount.
3268c2ecf20Sopenharmony_ci */
3278c2ecf20Sopenharmony_civoid flush_delayed_fput(void)
3288c2ecf20Sopenharmony_ci{
3298c2ecf20Sopenharmony_ci	delayed_fput(NULL);
3308c2ecf20Sopenharmony_ci}
3318c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(flush_delayed_fput);
3328c2ecf20Sopenharmony_ci
3338c2ecf20Sopenharmony_cistatic DECLARE_DELAYED_WORK(delayed_fput_work, delayed_fput);
3348c2ecf20Sopenharmony_ci
3358c2ecf20Sopenharmony_civoid fput_many(struct file *file, unsigned int refs)
3368c2ecf20Sopenharmony_ci{
3378c2ecf20Sopenharmony_ci	if (atomic_long_sub_and_test(refs, &file->f_count)) {
3388c2ecf20Sopenharmony_ci		struct task_struct *task = current;
3398c2ecf20Sopenharmony_ci
3408c2ecf20Sopenharmony_ci		if (likely(!in_interrupt() && !(task->flags & PF_KTHREAD))) {
3418c2ecf20Sopenharmony_ci			init_task_work(&file->f_u.fu_rcuhead, ____fput);
3428c2ecf20Sopenharmony_ci			if (!task_work_add(task, &file->f_u.fu_rcuhead, TWA_RESUME))
3438c2ecf20Sopenharmony_ci				return;
3448c2ecf20Sopenharmony_ci			/*
3458c2ecf20Sopenharmony_ci			 * After this task has run exit_task_work(),
3468c2ecf20Sopenharmony_ci			 * task_work_add() will fail.  Fall through to delayed
3478c2ecf20Sopenharmony_ci			 * fput to avoid leaking *file.
3488c2ecf20Sopenharmony_ci			 */
3498c2ecf20Sopenharmony_ci		}
3508c2ecf20Sopenharmony_ci
3518c2ecf20Sopenharmony_ci		if (llist_add(&file->f_u.fu_llist, &delayed_fput_list))
3528c2ecf20Sopenharmony_ci			schedule_delayed_work(&delayed_fput_work, 1);
3538c2ecf20Sopenharmony_ci	}
3548c2ecf20Sopenharmony_ci}
3558c2ecf20Sopenharmony_ci
3568c2ecf20Sopenharmony_civoid fput(struct file *file)
3578c2ecf20Sopenharmony_ci{
3588c2ecf20Sopenharmony_ci	fput_many(file, 1);
3598c2ecf20Sopenharmony_ci}
3608c2ecf20Sopenharmony_ci
3618c2ecf20Sopenharmony_ci/*
3628c2ecf20Sopenharmony_ci * synchronous analog of fput(); for kernel threads that might be needed
3638c2ecf20Sopenharmony_ci * in some umount() (and thus can't use flush_delayed_fput() without
3648c2ecf20Sopenharmony_ci * risking deadlocks), need to wait for completion of __fput() and know
3658c2ecf20Sopenharmony_ci * for this specific struct file it won't involve anything that would
3668c2ecf20Sopenharmony_ci * need them.  Use only if you really need it - at the very least,
3678c2ecf20Sopenharmony_ci * don't blindly convert fput() by kernel thread to that.
3688c2ecf20Sopenharmony_ci */
3698c2ecf20Sopenharmony_civoid __fput_sync(struct file *file)
3708c2ecf20Sopenharmony_ci{
3718c2ecf20Sopenharmony_ci	if (atomic_long_dec_and_test(&file->f_count)) {
3728c2ecf20Sopenharmony_ci		struct task_struct *task = current;
3738c2ecf20Sopenharmony_ci		BUG_ON(!(task->flags & PF_KTHREAD));
3748c2ecf20Sopenharmony_ci		__fput(file);
3758c2ecf20Sopenharmony_ci	}
3768c2ecf20Sopenharmony_ci}
3778c2ecf20Sopenharmony_ci
3788c2ecf20Sopenharmony_ciEXPORT_SYMBOL(fput);
3798c2ecf20Sopenharmony_ciEXPORT_SYMBOL(__fput_sync);
3808c2ecf20Sopenharmony_ci
3818c2ecf20Sopenharmony_civoid __init files_init(void)
3828c2ecf20Sopenharmony_ci{
3838c2ecf20Sopenharmony_ci	filp_cachep = kmem_cache_create("filp", sizeof(struct file), 0,
3848c2ecf20Sopenharmony_ci			SLAB_HWCACHE_ALIGN | SLAB_PANIC | SLAB_ACCOUNT, NULL);
3858c2ecf20Sopenharmony_ci	percpu_counter_init(&nr_files, 0, GFP_KERNEL);
3868c2ecf20Sopenharmony_ci}
3878c2ecf20Sopenharmony_ci
3888c2ecf20Sopenharmony_ci/*
3898c2ecf20Sopenharmony_ci * One file with associated inode and dcache is very roughly 1K. Per default
3908c2ecf20Sopenharmony_ci * do not use more than 10% of our memory for files.
3918c2ecf20Sopenharmony_ci */
3928c2ecf20Sopenharmony_civoid __init files_maxfiles_init(void)
3938c2ecf20Sopenharmony_ci{
3948c2ecf20Sopenharmony_ci	unsigned long n;
3958c2ecf20Sopenharmony_ci	unsigned long nr_pages = totalram_pages();
3968c2ecf20Sopenharmony_ci	unsigned long memreserve = (nr_pages - nr_free_pages()) * 3/2;
3978c2ecf20Sopenharmony_ci
3988c2ecf20Sopenharmony_ci	memreserve = min(memreserve, nr_pages - 1);
3998c2ecf20Sopenharmony_ci	n = ((nr_pages - memreserve) * (PAGE_SIZE / 1024)) / 10;
4008c2ecf20Sopenharmony_ci
4018c2ecf20Sopenharmony_ci	files_stat.max_files = max_t(unsigned long, n, NR_FILE);
4028c2ecf20Sopenharmony_ci}
403