Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    1) // SPDX-License-Identifier: GPL-2.0-only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    3)  *  linux/fs/namespace.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    4)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    5)  * (C) Copyright Al Viro 2000, 2001
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    6)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    7)  * Based on code from fs/super.c, copyright Linus Torvalds and others.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    8)  * Heavily rewritten.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    9)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   10) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   11) #include <linux/syscalls.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   12) #include <linux/export.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   13) #include <linux/capability.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   14) #include <linux/mnt_namespace.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   15) #include <linux/user_namespace.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   16) #include <linux/namei.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   17) #include <linux/security.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   18) #include <linux/cred.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   19) #include <linux/idr.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   20) #include <linux/init.h>		/* init_rootfs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   21) #include <linux/fs_struct.h>	/* get_fs_root et.al. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   22) #include <linux/fsnotify.h>	/* fsnotify_vfsmount_delete */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   23) #include <linux/file.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   24) #include <linux/uaccess.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   25) #include <linux/proc_ns.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   26) #include <linux/magic.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   27) #include <linux/memblock.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   28) #include <linux/task_work.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   29) #include <linux/sched/task.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   30) #include <uapi/linux/mount.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   31) #include <linux/fs_context.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   32) #include <linux/shmem_fs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   33) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   34) #include "pnode.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   35) #include "internal.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   36) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   37) /* Maximum number of mounts in a mount namespace */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   38) unsigned int sysctl_mount_max __read_mostly = 100000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   39) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   40) static unsigned int m_hash_mask __read_mostly;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   41) static unsigned int m_hash_shift __read_mostly;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   42) static unsigned int mp_hash_mask __read_mostly;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   43) static unsigned int mp_hash_shift __read_mostly;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   44) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   45) static __initdata unsigned long mhash_entries;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   46) static int __init set_mhash_entries(char *str)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   47) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   48) 	if (!str)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   49) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   50) 	mhash_entries = simple_strtoul(str, &str, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   51) 	return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   52) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   53) __setup("mhash_entries=", set_mhash_entries);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   54) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   55) static __initdata unsigned long mphash_entries;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   56) static int __init set_mphash_entries(char *str)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   57) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   58) 	if (!str)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   59) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   60) 	mphash_entries = simple_strtoul(str, &str, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   61) 	return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   62) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   63) __setup("mphash_entries=", set_mphash_entries);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   64) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   65) static u64 event;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   66) static DEFINE_IDA(mnt_id_ida);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   67) static DEFINE_IDA(mnt_group_ida);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   68) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   69) static struct hlist_head *mount_hashtable __read_mostly;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   70) static struct hlist_head *mountpoint_hashtable __read_mostly;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   71) static struct kmem_cache *mnt_cache __read_mostly;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   72) static DECLARE_RWSEM(namespace_sem);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   73) static HLIST_HEAD(unmounted);	/* protected by namespace_sem */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   74) static LIST_HEAD(ex_mountpoints); /* protected by namespace_sem */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   75) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   76) /* /sys/fs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   77) struct kobject *fs_kobj;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   78) EXPORT_SYMBOL_GPL(fs_kobj);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   79) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   80) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   81)  * vfsmount lock may be taken for read to prevent changes to the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   82)  * vfsmount hash, ie. during mountpoint lookups or walking back
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   83)  * up the tree.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   84)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   85)  * It should be taken for write in all cases where the vfsmount
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   86)  * tree or hash is modified or when a vfsmount structure is modified.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   87)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   88) __cacheline_aligned_in_smp DEFINE_SEQLOCK(mount_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   89) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   90) static inline struct hlist_head *m_hash(struct vfsmount *mnt, struct dentry *dentry)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   91) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   92) 	unsigned long tmp = ((unsigned long)mnt / L1_CACHE_BYTES);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   93) 	tmp += ((unsigned long)dentry / L1_CACHE_BYTES);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   94) 	tmp = tmp + (tmp >> m_hash_shift);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   95) 	return &mount_hashtable[tmp & m_hash_mask];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   96) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   97) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   98) static inline struct hlist_head *mp_hash(struct dentry *dentry)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   99) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  100) 	unsigned long tmp = ((unsigned long)dentry / L1_CACHE_BYTES);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  101) 	tmp = tmp + (tmp >> mp_hash_shift);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  102) 	return &mountpoint_hashtable[tmp & mp_hash_mask];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  103) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  104) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  105) static int mnt_alloc_id(struct mount *mnt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  106) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  107) 	int res = ida_alloc(&mnt_id_ida, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  108) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  109) 	if (res < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  110) 		return res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  111) 	mnt->mnt_id = res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  112) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  113) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  114) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  115) static void mnt_free_id(struct mount *mnt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  116) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  117) 	ida_free(&mnt_id_ida, mnt->mnt_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  118) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  119) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  120) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  121)  * Allocate a new peer group ID
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  122)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  123) static int mnt_alloc_group_id(struct mount *mnt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  124) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  125) 	int res = ida_alloc_min(&mnt_group_ida, 1, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  126) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  127) 	if (res < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  128) 		return res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  129) 	mnt->mnt_group_id = res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  130) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  131) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  132) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  133) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  134)  * Release a peer group ID
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  135)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  136) void mnt_release_group_id(struct mount *mnt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  137) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  138) 	ida_free(&mnt_group_ida, mnt->mnt_group_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  139) 	mnt->mnt_group_id = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  140) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  141) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  142) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  143)  * vfsmount lock must be held for read
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  144)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  145) static inline void mnt_add_count(struct mount *mnt, int n)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  146) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  147) #ifdef CONFIG_SMP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  148) 	this_cpu_add(mnt->mnt_pcp->mnt_count, n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  149) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  150) 	preempt_disable();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  151) 	mnt->mnt_count += n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  152) 	preempt_enable();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  153) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  154) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  155) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  156) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  157)  * vfsmount lock must be held for write
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  158)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  159) int mnt_get_count(struct mount *mnt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  160) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  161) #ifdef CONFIG_SMP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  162) 	int count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  163) 	int cpu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  164) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  165) 	for_each_possible_cpu(cpu) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  166) 		count += per_cpu_ptr(mnt->mnt_pcp, cpu)->mnt_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  167) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  168) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  169) 	return count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  170) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  171) 	return mnt->mnt_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  172) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  173) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  174) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  175) static struct mount *alloc_vfsmnt(const char *name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  176) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  177) 	struct mount *mnt = kmem_cache_zalloc(mnt_cache, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  178) 	if (mnt) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  179) 		int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  180) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  181) 		err = mnt_alloc_id(mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  182) 		if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  183) 			goto out_free_cache;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  184) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  185) 		if (name) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  186) 			mnt->mnt_devname = kstrdup_const(name, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  187) 			if (!mnt->mnt_devname)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  188) 				goto out_free_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  189) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  190) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  191) #ifdef CONFIG_SMP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  192) 		mnt->mnt_pcp = alloc_percpu(struct mnt_pcp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  193) 		if (!mnt->mnt_pcp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  194) 			goto out_free_devname;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  195) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  196) 		this_cpu_add(mnt->mnt_pcp->mnt_count, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  197) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  198) 		mnt->mnt_count = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  199) 		mnt->mnt_writers = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  200) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  201) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  202) 		INIT_HLIST_NODE(&mnt->mnt_hash);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  203) 		INIT_LIST_HEAD(&mnt->mnt_child);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  204) 		INIT_LIST_HEAD(&mnt->mnt_mounts);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  205) 		INIT_LIST_HEAD(&mnt->mnt_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  206) 		INIT_LIST_HEAD(&mnt->mnt_expire);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  207) 		INIT_LIST_HEAD(&mnt->mnt_share);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  208) 		INIT_LIST_HEAD(&mnt->mnt_slave_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  209) 		INIT_LIST_HEAD(&mnt->mnt_slave);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  210) 		INIT_HLIST_NODE(&mnt->mnt_mp_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  211) 		INIT_LIST_HEAD(&mnt->mnt_umounting);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  212) 		INIT_HLIST_HEAD(&mnt->mnt_stuck_children);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  213) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  214) 	return mnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  215) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  216) #ifdef CONFIG_SMP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  217) out_free_devname:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  218) 	kfree_const(mnt->mnt_devname);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  219) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  220) out_free_id:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  221) 	mnt_free_id(mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  222) out_free_cache:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  223) 	kmem_cache_free(mnt_cache, mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  224) 	return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  225) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  226) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  227) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  228)  * Most r/o checks on a fs are for operations that take
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  229)  * discrete amounts of time, like a write() or unlink().
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  230)  * We must keep track of when those operations start
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  231)  * (for permission checks) and when they end, so that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  232)  * we can determine when writes are able to occur to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  233)  * a filesystem.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  234)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  235) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  236)  * __mnt_is_readonly: check whether a mount is read-only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  237)  * @mnt: the mount to check for its write status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  238)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  239)  * This shouldn't be used directly ouside of the VFS.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  240)  * It does not guarantee that the filesystem will stay
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  241)  * r/w, just that it is right *now*.  This can not and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  242)  * should not be used in place of IS_RDONLY(inode).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  243)  * mnt_want/drop_write() will _keep_ the filesystem
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  244)  * r/w.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  245)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  246) bool __mnt_is_readonly(struct vfsmount *mnt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  247) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  248) 	return (mnt->mnt_flags & MNT_READONLY) || sb_rdonly(mnt->mnt_sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  249) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  250) EXPORT_SYMBOL_GPL(__mnt_is_readonly);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  251) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  252) static inline void mnt_inc_writers(struct mount *mnt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  253) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  254) #ifdef CONFIG_SMP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  255) 	this_cpu_inc(mnt->mnt_pcp->mnt_writers);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  256) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  257) 	mnt->mnt_writers++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  258) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  259) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  260) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  261) static inline void mnt_dec_writers(struct mount *mnt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  262) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  263) #ifdef CONFIG_SMP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  264) 	this_cpu_dec(mnt->mnt_pcp->mnt_writers);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  265) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  266) 	mnt->mnt_writers--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  267) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  268) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  269) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  270) static unsigned int mnt_get_writers(struct mount *mnt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  271) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  272) #ifdef CONFIG_SMP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  273) 	unsigned int count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  274) 	int cpu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  275) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  276) 	for_each_possible_cpu(cpu) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  277) 		count += per_cpu_ptr(mnt->mnt_pcp, cpu)->mnt_writers;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  278) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  279) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  280) 	return count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  281) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  282) 	return mnt->mnt_writers;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  283) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  284) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  285) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  286) static int mnt_is_readonly(struct vfsmount *mnt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  287) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  288) 	if (mnt->mnt_sb->s_readonly_remount)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  289) 		return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  290) 	/* Order wrt setting s_flags/s_readonly_remount in do_remount() */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  291) 	smp_rmb();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  292) 	return __mnt_is_readonly(mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  293) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  294) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  295) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  296)  * Most r/o & frozen checks on a fs are for operations that take discrete
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  297)  * amounts of time, like a write() or unlink().  We must keep track of when
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  298)  * those operations start (for permission checks) and when they end, so that we
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  299)  * can determine when writes are able to occur to a filesystem.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  300)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  301) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  302)  * __mnt_want_write - get write access to a mount without freeze protection
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  303)  * @m: the mount on which to take a write
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  304)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  305)  * This tells the low-level filesystem that a write is about to be performed to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  306)  * it, and makes sure that writes are allowed (mnt it read-write) before
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  307)  * returning success. This operation does not protect against filesystem being
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  308)  * frozen. When the write operation is finished, __mnt_drop_write() must be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  309)  * called. This is effectively a refcount.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  310)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  311) int __mnt_want_write(struct vfsmount *m)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  312) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  313) 	struct mount *mnt = real_mount(m);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  314) 	int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  315) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  316) 	preempt_disable();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  317) 	mnt_inc_writers(mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  318) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  319) 	 * The store to mnt_inc_writers must be visible before we pass
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  320) 	 * MNT_WRITE_HOLD loop below, so that the slowpath can see our
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  321) 	 * incremented count after it has set MNT_WRITE_HOLD.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  322) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  323) 	smp_mb();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  324) 	while (READ_ONCE(mnt->mnt.mnt_flags) & MNT_WRITE_HOLD)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  325) 		cpu_relax();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  326) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  327) 	 * After the slowpath clears MNT_WRITE_HOLD, mnt_is_readonly will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  328) 	 * be set to match its requirements. So we must not load that until
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  329) 	 * MNT_WRITE_HOLD is cleared.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  330) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  331) 	smp_rmb();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  332) 	if (mnt_is_readonly(m)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  333) 		mnt_dec_writers(mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  334) 		ret = -EROFS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  335) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  336) 	preempt_enable();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  337) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  338) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  339) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  340) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  341) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  342)  * mnt_want_write - get write access to a mount
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  343)  * @m: the mount on which to take a write
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  344)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  345)  * This tells the low-level filesystem that a write is about to be performed to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  346)  * it, and makes sure that writes are allowed (mount is read-write, filesystem
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  347)  * is not frozen) before returning success.  When the write operation is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  348)  * finished, mnt_drop_write() must be called.  This is effectively a refcount.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  349)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  350) int mnt_want_write(struct vfsmount *m)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  351) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  352) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  353) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  354) 	sb_start_write(m->mnt_sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  355) 	ret = __mnt_want_write(m);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  356) 	if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  357) 		sb_end_write(m->mnt_sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  358) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  359) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  360) EXPORT_SYMBOL_GPL(mnt_want_write);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  361) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  362) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  363)  * mnt_clone_write - get write access to a mount
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  364)  * @mnt: the mount on which to take a write
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  365)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  366)  * This is effectively like mnt_want_write, except
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  367)  * it must only be used to take an extra write reference
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  368)  * on a mountpoint that we already know has a write reference
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  369)  * on it. This allows some optimisation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  370)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  371)  * After finished, mnt_drop_write must be called as usual to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  372)  * drop the reference.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  373)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  374) int mnt_clone_write(struct vfsmount *mnt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  375) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  376) 	/* superblock may be r/o */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  377) 	if (__mnt_is_readonly(mnt))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  378) 		return -EROFS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  379) 	preempt_disable();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  380) 	mnt_inc_writers(real_mount(mnt));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  381) 	preempt_enable();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  382) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  383) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  384) EXPORT_SYMBOL_GPL(mnt_clone_write);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  385) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  386) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  387)  * __mnt_want_write_file - get write access to a file's mount
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  388)  * @file: the file who's mount on which to take a write
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  389)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  390)  * This is like __mnt_want_write, but it takes a file and can
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  391)  * do some optimisations if the file is open for write already
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  392)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  393) int __mnt_want_write_file(struct file *file)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  394) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  395) 	if (!(file->f_mode & FMODE_WRITER))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  396) 		return __mnt_want_write(file->f_path.mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  397) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  398) 		return mnt_clone_write(file->f_path.mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  399) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  400) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  401) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  402)  * mnt_want_write_file - get write access to a file's mount
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  403)  * @file: the file who's mount on which to take a write
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  404)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  405)  * This is like mnt_want_write, but it takes a file and can
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  406)  * do some optimisations if the file is open for write already
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  407)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  408) int mnt_want_write_file(struct file *file)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  409) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  410) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  411) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  412) 	sb_start_write(file_inode(file)->i_sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  413) 	ret = __mnt_want_write_file(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  414) 	if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  415) 		sb_end_write(file_inode(file)->i_sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  416) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  417) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  418) EXPORT_SYMBOL_NS_GPL(mnt_want_write_file, ANDROID_GKI_VFS_EXPORT_ONLY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  419) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  420) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  421)  * __mnt_drop_write - give up write access to a mount
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  422)  * @mnt: the mount on which to give up write access
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  423)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  424)  * Tells the low-level filesystem that we are done
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  425)  * performing writes to it.  Must be matched with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  426)  * __mnt_want_write() call above.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  427)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  428) void __mnt_drop_write(struct vfsmount *mnt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  429) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  430) 	preempt_disable();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  431) 	mnt_dec_writers(real_mount(mnt));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  432) 	preempt_enable();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  433) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  434) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  435) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  436)  * mnt_drop_write - give up write access to a mount
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  437)  * @mnt: the mount on which to give up write access
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  438)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  439)  * Tells the low-level filesystem that we are done performing writes to it and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  440)  * also allows filesystem to be frozen again.  Must be matched with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  441)  * mnt_want_write() call above.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  442)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  443) void mnt_drop_write(struct vfsmount *mnt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  444) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  445) 	__mnt_drop_write(mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  446) 	sb_end_write(mnt->mnt_sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  447) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  448) EXPORT_SYMBOL_GPL(mnt_drop_write);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  449) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  450) void __mnt_drop_write_file(struct file *file)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  451) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  452) 	__mnt_drop_write(file->f_path.mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  453) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  454) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  455) void mnt_drop_write_file(struct file *file)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  456) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  457) 	__mnt_drop_write_file(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  458) 	sb_end_write(file_inode(file)->i_sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  459) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  460) EXPORT_SYMBOL_NS(mnt_drop_write_file, ANDROID_GKI_VFS_EXPORT_ONLY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  461) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  462) static int mnt_make_readonly(struct mount *mnt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  463) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  464) 	int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  465) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  466) 	lock_mount_hash();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  467) 	mnt->mnt.mnt_flags |= MNT_WRITE_HOLD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  468) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  469) 	 * After storing MNT_WRITE_HOLD, we'll read the counters. This store
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  470) 	 * should be visible before we do.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  471) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  472) 	smp_mb();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  473) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  474) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  475) 	 * With writers on hold, if this value is zero, then there are
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  476) 	 * definitely no active writers (although held writers may subsequently
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  477) 	 * increment the count, they'll have to wait, and decrement it after
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  478) 	 * seeing MNT_READONLY).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  479) 	 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  480) 	 * It is OK to have counter incremented on one CPU and decremented on
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  481) 	 * another: the sum will add up correctly. The danger would be when we
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  482) 	 * sum up each counter, if we read a counter before it is incremented,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  483) 	 * but then read another CPU's count which it has been subsequently
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  484) 	 * decremented from -- we would see more decrements than we should.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  485) 	 * MNT_WRITE_HOLD protects against this scenario, because
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  486) 	 * mnt_want_write first increments count, then smp_mb, then spins on
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  487) 	 * MNT_WRITE_HOLD, so it can't be decremented by another CPU while
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  488) 	 * we're counting up here.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  489) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  490) 	if (mnt_get_writers(mnt) > 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  491) 		ret = -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  492) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  493) 		mnt->mnt.mnt_flags |= MNT_READONLY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  494) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  495) 	 * MNT_READONLY must become visible before ~MNT_WRITE_HOLD, so writers
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  496) 	 * that become unheld will see MNT_READONLY.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  497) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  498) 	smp_wmb();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  499) 	mnt->mnt.mnt_flags &= ~MNT_WRITE_HOLD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  500) 	unlock_mount_hash();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  501) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  502) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  503) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  504) static int __mnt_unmake_readonly(struct mount *mnt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  505) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  506) 	lock_mount_hash();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  507) 	mnt->mnt.mnt_flags &= ~MNT_READONLY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  508) 	unlock_mount_hash();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  509) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  510) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  511) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  512) int sb_prepare_remount_readonly(struct super_block *sb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  513) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  514) 	struct mount *mnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  515) 	int err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  516) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  517) 	/* Racy optimization.  Recheck the counter under MNT_WRITE_HOLD */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  518) 	if (atomic_long_read(&sb->s_remove_count))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  519) 		return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  520) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  521) 	lock_mount_hash();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  522) 	list_for_each_entry(mnt, &sb->s_mounts, mnt_instance) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  523) 		if (!(mnt->mnt.mnt_flags & MNT_READONLY)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  524) 			mnt->mnt.mnt_flags |= MNT_WRITE_HOLD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  525) 			smp_mb();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  526) 			if (mnt_get_writers(mnt) > 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  527) 				err = -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  528) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  529) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  530) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  531) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  532) 	if (!err && atomic_long_read(&sb->s_remove_count))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  533) 		err = -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  534) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  535) 	if (!err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  536) 		sb->s_readonly_remount = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  537) 		smp_wmb();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  538) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  539) 	list_for_each_entry(mnt, &sb->s_mounts, mnt_instance) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  540) 		if (mnt->mnt.mnt_flags & MNT_WRITE_HOLD)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  541) 			mnt->mnt.mnt_flags &= ~MNT_WRITE_HOLD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  542) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  543) 	unlock_mount_hash();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  544) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  545) 	return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  546) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  547) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  548) static void free_vfsmnt(struct mount *mnt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  549) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  550) 	kfree_const(mnt->mnt_devname);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  551) #ifdef CONFIG_SMP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  552) 	free_percpu(mnt->mnt_pcp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  553) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  554) 	kmem_cache_free(mnt_cache, mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  555) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  556) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  557) static void delayed_free_vfsmnt(struct rcu_head *head)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  558) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  559) 	free_vfsmnt(container_of(head, struct mount, mnt_rcu));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  560) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  561) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  562) /* call under rcu_read_lock */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  563) int __legitimize_mnt(struct vfsmount *bastard, unsigned seq)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  564) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  565) 	struct mount *mnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  566) 	if (read_seqretry(&mount_lock, seq))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  567) 		return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  568) 	if (bastard == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  569) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  570) 	mnt = real_mount(bastard);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  571) 	mnt_add_count(mnt, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  572) 	smp_mb();			// see mntput_no_expire()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  573) 	if (likely(!read_seqretry(&mount_lock, seq)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  574) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  575) 	if (bastard->mnt_flags & MNT_SYNC_UMOUNT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  576) 		mnt_add_count(mnt, -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  577) 		return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  578) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  579) 	lock_mount_hash();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  580) 	if (unlikely(bastard->mnt_flags & MNT_DOOMED)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  581) 		mnt_add_count(mnt, -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  582) 		unlock_mount_hash();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  583) 		return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  584) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  585) 	unlock_mount_hash();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  586) 	/* caller will mntput() */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  587) 	return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  588) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  589) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  590) /* call under rcu_read_lock */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  591) bool legitimize_mnt(struct vfsmount *bastard, unsigned seq)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  592) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  593) 	int res = __legitimize_mnt(bastard, seq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  594) 	if (likely(!res))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  595) 		return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  596) 	if (unlikely(res < 0)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  597) 		rcu_read_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  598) 		mntput(bastard);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  599) 		rcu_read_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  600) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  601) 	return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  602) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  603) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  604) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  605)  * find the first mount at @dentry on vfsmount @mnt.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  606)  * call under rcu_read_lock()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  607)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  608) struct mount *__lookup_mnt(struct vfsmount *mnt, struct dentry *dentry)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  609) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  610) 	struct hlist_head *head = m_hash(mnt, dentry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  611) 	struct mount *p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  612) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  613) 	hlist_for_each_entry_rcu(p, head, mnt_hash)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  614) 		if (&p->mnt_parent->mnt == mnt && p->mnt_mountpoint == dentry)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  615) 			return p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  616) 	return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  617) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  618) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  619) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  620)  * lookup_mnt - Return the first child mount mounted at path
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  621)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  622)  * "First" means first mounted chronologically.  If you create the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  623)  * following mounts:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  624)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  625)  * mount /dev/sda1 /mnt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  626)  * mount /dev/sda2 /mnt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  627)  * mount /dev/sda3 /mnt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  628)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  629)  * Then lookup_mnt() on the base /mnt dentry in the root mount will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  630)  * return successively the root dentry and vfsmount of /dev/sda1, then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  631)  * /dev/sda2, then /dev/sda3, then NULL.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  632)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  633)  * lookup_mnt takes a reference to the found vfsmount.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  634)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  635) struct vfsmount *lookup_mnt(const struct path *path)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  636) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  637) 	struct mount *child_mnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  638) 	struct vfsmount *m;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  639) 	unsigned seq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  640) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  641) 	rcu_read_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  642) 	do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  643) 		seq = read_seqbegin(&mount_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  644) 		child_mnt = __lookup_mnt(path->mnt, path->dentry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  645) 		m = child_mnt ? &child_mnt->mnt : NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  646) 	} while (!legitimize_mnt(m, seq));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  647) 	rcu_read_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  648) 	return m;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  649) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  650) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  651) static inline void lock_ns_list(struct mnt_namespace *ns)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  652) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  653) 	spin_lock(&ns->ns_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  654) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  655) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  656) static inline void unlock_ns_list(struct mnt_namespace *ns)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  657) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  658) 	spin_unlock(&ns->ns_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  659) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  660) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  661) static inline bool mnt_is_cursor(struct mount *mnt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  662) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  663) 	return mnt->mnt.mnt_flags & MNT_CURSOR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  664) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  665) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  666) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  667)  * __is_local_mountpoint - Test to see if dentry is a mountpoint in the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  668)  *                         current mount namespace.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  669)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  670)  * The common case is dentries are not mountpoints at all and that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  671)  * test is handled inline.  For the slow case when we are actually
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  672)  * dealing with a mountpoint of some kind, walk through all of the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  673)  * mounts in the current mount namespace and test to see if the dentry
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  674)  * is a mountpoint.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  675)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  676)  * The mount_hashtable is not usable in the context because we
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  677)  * need to identify all mounts that may be in the current mount
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  678)  * namespace not just a mount that happens to have some specified
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  679)  * parent mount.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  680)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  681) bool __is_local_mountpoint(struct dentry *dentry)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  682) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  683) 	struct mnt_namespace *ns = current->nsproxy->mnt_ns;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  684) 	struct mount *mnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  685) 	bool is_covered = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  686) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  687) 	down_read(&namespace_sem);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  688) 	lock_ns_list(ns);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  689) 	list_for_each_entry(mnt, &ns->list, mnt_list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  690) 		if (mnt_is_cursor(mnt))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  691) 			continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  692) 		is_covered = (mnt->mnt_mountpoint == dentry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  693) 		if (is_covered)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  694) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  695) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  696) 	unlock_ns_list(ns);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  697) 	up_read(&namespace_sem);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  698) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  699) 	return is_covered;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  700) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  701) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  702) static struct mountpoint *lookup_mountpoint(struct dentry *dentry)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  703) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  704) 	struct hlist_head *chain = mp_hash(dentry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  705) 	struct mountpoint *mp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  706) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  707) 	hlist_for_each_entry(mp, chain, m_hash) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  708) 		if (mp->m_dentry == dentry) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  709) 			mp->m_count++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  710) 			return mp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  711) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  712) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  713) 	return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  714) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  715) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  716) static struct mountpoint *get_mountpoint(struct dentry *dentry)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  717) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  718) 	struct mountpoint *mp, *new = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  719) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  720) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  721) 	if (d_mountpoint(dentry)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  722) 		/* might be worth a WARN_ON() */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  723) 		if (d_unlinked(dentry))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  724) 			return ERR_PTR(-ENOENT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  725) mountpoint:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  726) 		read_seqlock_excl(&mount_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  727) 		mp = lookup_mountpoint(dentry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  728) 		read_sequnlock_excl(&mount_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  729) 		if (mp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  730) 			goto done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  731) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  732) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  733) 	if (!new)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  734) 		new = kmalloc(sizeof(struct mountpoint), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  735) 	if (!new)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  736) 		return ERR_PTR(-ENOMEM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  737) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  738) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  739) 	/* Exactly one processes may set d_mounted */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  740) 	ret = d_set_mounted(dentry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  741) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  742) 	/* Someone else set d_mounted? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  743) 	if (ret == -EBUSY)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  744) 		goto mountpoint;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  745) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  746) 	/* The dentry is not available as a mountpoint? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  747) 	mp = ERR_PTR(ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  748) 	if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  749) 		goto done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  750) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  751) 	/* Add the new mountpoint to the hash table */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  752) 	read_seqlock_excl(&mount_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  753) 	new->m_dentry = dget(dentry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  754) 	new->m_count = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  755) 	hlist_add_head(&new->m_hash, mp_hash(dentry));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  756) 	INIT_HLIST_HEAD(&new->m_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  757) 	read_sequnlock_excl(&mount_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  758) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  759) 	mp = new;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  760) 	new = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  761) done:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  762) 	kfree(new);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  763) 	return mp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  764) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  765) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  766) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  767)  * vfsmount lock must be held.  Additionally, the caller is responsible
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  768)  * for serializing calls for given disposal list.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  769)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  770) static void __put_mountpoint(struct mountpoint *mp, struct list_head *list)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  771) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  772) 	if (!--mp->m_count) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  773) 		struct dentry *dentry = mp->m_dentry;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  774) 		BUG_ON(!hlist_empty(&mp->m_list));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  775) 		spin_lock(&dentry->d_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  776) 		dentry->d_flags &= ~DCACHE_MOUNTED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  777) 		spin_unlock(&dentry->d_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  778) 		dput_to_list(dentry, list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  779) 		hlist_del(&mp->m_hash);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  780) 		kfree(mp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  781) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  782) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  783) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  784) /* called with namespace_lock and vfsmount lock */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  785) static void put_mountpoint(struct mountpoint *mp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  786) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  787) 	__put_mountpoint(mp, &ex_mountpoints);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  788) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  789) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  790) static inline int check_mnt(struct mount *mnt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  791) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  792) 	return mnt->mnt_ns == current->nsproxy->mnt_ns;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  793) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  794) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  795) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  796)  * vfsmount lock must be held for write
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  797)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  798) static void touch_mnt_namespace(struct mnt_namespace *ns)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  799) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  800) 	if (ns) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  801) 		ns->event = ++event;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  802) 		wake_up_interruptible(&ns->poll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  803) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  804) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  805) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  806) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  807)  * vfsmount lock must be held for write
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  808)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  809) static void __touch_mnt_namespace(struct mnt_namespace *ns)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  810) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  811) 	if (ns && ns->event != event) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  812) 		ns->event = event;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  813) 		wake_up_interruptible(&ns->poll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  814) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  815) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  816) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  817) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  818)  * vfsmount lock must be held for write
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  819)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  820) static struct mountpoint *unhash_mnt(struct mount *mnt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  821) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  822) 	struct mountpoint *mp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  823) 	mnt->mnt_parent = mnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  824) 	mnt->mnt_mountpoint = mnt->mnt.mnt_root;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  825) 	list_del_init(&mnt->mnt_child);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  826) 	hlist_del_init_rcu(&mnt->mnt_hash);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  827) 	hlist_del_init(&mnt->mnt_mp_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  828) 	mp = mnt->mnt_mp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  829) 	mnt->mnt_mp = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  830) 	return mp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  831) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  832) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  833) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  834)  * vfsmount lock must be held for write
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  835)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  836) static void umount_mnt(struct mount *mnt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  837) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  838) 	put_mountpoint(unhash_mnt(mnt));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  839) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  840) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  841) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  842)  * vfsmount lock must be held for write
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  843)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  844) void mnt_set_mountpoint(struct mount *mnt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  845) 			struct mountpoint *mp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  846) 			struct mount *child_mnt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  847) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  848) 	mp->m_count++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  849) 	mnt_add_count(mnt, 1);	/* essentially, that's mntget */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  850) 	child_mnt->mnt_mountpoint = mp->m_dentry;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  851) 	child_mnt->mnt_parent = mnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  852) 	child_mnt->mnt_mp = mp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  853) 	hlist_add_head(&child_mnt->mnt_mp_list, &mp->m_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  854) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  855) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  856) static void __attach_mnt(struct mount *mnt, struct mount *parent)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  857) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  858) 	hlist_add_head_rcu(&mnt->mnt_hash,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  859) 			   m_hash(&parent->mnt, mnt->mnt_mountpoint));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  860) 	list_add_tail(&mnt->mnt_child, &parent->mnt_mounts);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  861) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  862) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  863) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  864)  * vfsmount lock must be held for write
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  865)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  866) static void attach_mnt(struct mount *mnt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  867) 			struct mount *parent,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  868) 			struct mountpoint *mp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  869) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  870) 	mnt_set_mountpoint(parent, mp, mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  871) 	__attach_mnt(mnt, parent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  872) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  873) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  874) void mnt_change_mountpoint(struct mount *parent, struct mountpoint *mp, struct mount *mnt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  875) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  876) 	struct mountpoint *old_mp = mnt->mnt_mp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  877) 	struct mount *old_parent = mnt->mnt_parent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  878) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  879) 	list_del_init(&mnt->mnt_child);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  880) 	hlist_del_init(&mnt->mnt_mp_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  881) 	hlist_del_init_rcu(&mnt->mnt_hash);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  882) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  883) 	attach_mnt(mnt, parent, mp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  884) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  885) 	put_mountpoint(old_mp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  886) 	mnt_add_count(old_parent, -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  887) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  888) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  889) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  890)  * vfsmount lock must be held for write
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  891)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  892) static void commit_tree(struct mount *mnt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  893) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  894) 	struct mount *parent = mnt->mnt_parent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  895) 	struct mount *m;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  896) 	LIST_HEAD(head);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  897) 	struct mnt_namespace *n = parent->mnt_ns;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  898) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  899) 	BUG_ON(parent == mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  900) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  901) 	list_add_tail(&head, &mnt->mnt_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  902) 	list_for_each_entry(m, &head, mnt_list)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  903) 		m->mnt_ns = n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  904) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  905) 	list_splice(&head, n->list.prev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  906) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  907) 	n->mounts += n->pending_mounts;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  908) 	n->pending_mounts = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  909) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  910) 	__attach_mnt(mnt, parent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  911) 	touch_mnt_namespace(n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  912) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  913) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  914) static struct mount *next_mnt(struct mount *p, struct mount *root)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  915) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  916) 	struct list_head *next = p->mnt_mounts.next;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  917) 	if (next == &p->mnt_mounts) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  918) 		while (1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  919) 			if (p == root)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  920) 				return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  921) 			next = p->mnt_child.next;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  922) 			if (next != &p->mnt_parent->mnt_mounts)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  923) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  924) 			p = p->mnt_parent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  925) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  926) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  927) 	return list_entry(next, struct mount, mnt_child);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  928) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  929) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  930) static struct mount *skip_mnt_tree(struct mount *p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  931) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  932) 	struct list_head *prev = p->mnt_mounts.prev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  933) 	while (prev != &p->mnt_mounts) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  934) 		p = list_entry(prev, struct mount, mnt_child);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  935) 		prev = p->mnt_mounts.prev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  936) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  937) 	return p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  938) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  939) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  940) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  941)  * vfs_create_mount - Create a mount for a configured superblock
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  942)  * @fc: The configuration context with the superblock attached
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  943)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  944)  * Create a mount to an already configured superblock.  If necessary, the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  945)  * caller should invoke vfs_get_tree() before calling this.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  946)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  947)  * Note that this does not attach the mount to anything.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  948)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  949) struct vfsmount *vfs_create_mount(struct fs_context *fc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  950) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  951) 	struct mount *mnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  952) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  953) 	if (!fc->root)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  954) 		return ERR_PTR(-EINVAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  955) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  956) 	mnt = alloc_vfsmnt(fc->source ?: "none");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  957) 	if (!mnt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  958) 		return ERR_PTR(-ENOMEM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  959) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  960) 	if (fc->sb_flags & SB_KERNMOUNT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  961) 		mnt->mnt.mnt_flags = MNT_INTERNAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  962) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  963) 	atomic_inc(&fc->root->d_sb->s_active);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  964) 	mnt->mnt.mnt_sb		= fc->root->d_sb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  965) 	mnt->mnt.mnt_root	= dget(fc->root);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  966) 	mnt->mnt_mountpoint	= mnt->mnt.mnt_root;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  967) 	mnt->mnt_parent		= mnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  968) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  969) 	lock_mount_hash();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  970) 	list_add_tail(&mnt->mnt_instance, &mnt->mnt.mnt_sb->s_mounts);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  971) 	unlock_mount_hash();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  972) 	return &mnt->mnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  973) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  974) EXPORT_SYMBOL(vfs_create_mount);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  975) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  976) struct vfsmount *fc_mount(struct fs_context *fc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  977) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  978) 	int err = vfs_get_tree(fc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  979) 	if (!err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  980) 		up_write(&fc->root->d_sb->s_umount);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  981) 		return vfs_create_mount(fc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  982) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  983) 	return ERR_PTR(err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  984) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  985) EXPORT_SYMBOL(fc_mount);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  986) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  987) struct vfsmount *vfs_kern_mount(struct file_system_type *type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  988) 				int flags, const char *name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  989) 				void *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  990) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  991) 	struct fs_context *fc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  992) 	struct vfsmount *mnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  993) 	int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  994) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  995) 	if (!type)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  996) 		return ERR_PTR(-EINVAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  997) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  998) 	fc = fs_context_for_mount(type, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  999) 	if (IS_ERR(fc))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) 		return ERR_CAST(fc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) 	if (name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) 		ret = vfs_parse_fs_string(fc, "source",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) 					  name, strlen(name));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) 	if (!ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) 		ret = parse_monolithic_mount_data(fc, data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) 	if (!ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) 		mnt = fc_mount(fc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) 		mnt = ERR_PTR(ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) 	put_fs_context(fc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) 	return mnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) EXPORT_SYMBOL_GPL(vfs_kern_mount);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) struct vfsmount *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) vfs_submount(const struct dentry *mountpoint, struct file_system_type *type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) 	     const char *name, void *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) 	/* Until it is worked out how to pass the user namespace
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) 	 * through from the parent mount to the submount don't support
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) 	 * unprivileged mounts with submounts.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) 	if (mountpoint->d_sb->s_user_ns != &init_user_ns)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) 		return ERR_PTR(-EPERM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) 	return vfs_kern_mount(type, SB_SUBMOUNT, name, data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) EXPORT_SYMBOL_GPL(vfs_submount);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) static struct mount *clone_mnt(struct mount *old, struct dentry *root,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) 					int flag)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) 	struct super_block *sb = old->mnt.mnt_sb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) 	struct mount *mnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) 	mnt = alloc_vfsmnt(old->mnt_devname);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) 	if (!mnt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) 		return ERR_PTR(-ENOMEM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) 	if (flag & (CL_SLAVE | CL_PRIVATE | CL_SHARED_TO_SLAVE))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) 		mnt->mnt_group_id = 0; /* not a peer of original */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) 		mnt->mnt_group_id = old->mnt_group_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) 	if ((flag & CL_MAKE_SHARED) && !mnt->mnt_group_id) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) 		err = mnt_alloc_group_id(mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) 		if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) 			goto out_free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) 	mnt->mnt.mnt_flags = old->mnt.mnt_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) 	mnt->mnt.mnt_flags &= ~(MNT_WRITE_HOLD|MNT_MARKED|MNT_INTERNAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) 	atomic_inc(&sb->s_active);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) 	mnt->mnt.mnt_sb = sb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) 	mnt->mnt.mnt_root = dget(root);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) 	mnt->mnt_mountpoint = mnt->mnt.mnt_root;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) 	mnt->mnt_parent = mnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) 	lock_mount_hash();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) 	list_add_tail(&mnt->mnt_instance, &sb->s_mounts);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) 	unlock_mount_hash();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) 	if ((flag & CL_SLAVE) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) 	    ((flag & CL_SHARED_TO_SLAVE) && IS_MNT_SHARED(old))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) 		list_add(&mnt->mnt_slave, &old->mnt_slave_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) 		mnt->mnt_master = old;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) 		CLEAR_MNT_SHARED(mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) 	} else if (!(flag & CL_PRIVATE)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) 		if ((flag & CL_MAKE_SHARED) || IS_MNT_SHARED(old))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) 			list_add(&mnt->mnt_share, &old->mnt_share);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) 		if (IS_MNT_SLAVE(old))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) 			list_add(&mnt->mnt_slave, &old->mnt_slave);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) 		mnt->mnt_master = old->mnt_master;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) 		CLEAR_MNT_SHARED(mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) 	if (flag & CL_MAKE_SHARED)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) 		set_mnt_shared(mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) 	/* stick the duplicate mount on the same expiry list
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) 	 * as the original if that was on one */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) 	if (flag & CL_EXPIRE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) 		if (!list_empty(&old->mnt_expire))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) 			list_add(&mnt->mnt_expire, &old->mnt_expire);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) 	return mnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092)  out_free:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) 	mnt_free_id(mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) 	free_vfsmnt(mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) 	return ERR_PTR(err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) static void cleanup_mnt(struct mount *mnt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) 	struct hlist_node *p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) 	struct mount *m;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) 	 * The warning here probably indicates that somebody messed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) 	 * up a mnt_want/drop_write() pair.  If this happens, the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) 	 * filesystem was probably unable to make r/w->r/o transitions.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) 	 * The locking used to deal with mnt_count decrement provides barriers,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) 	 * so mnt_get_writers() below is safe.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) 	WARN_ON(mnt_get_writers(mnt));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) 	if (unlikely(mnt->mnt_pins.first))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) 		mnt_pin_kill(mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) 	hlist_for_each_entry_safe(m, p, &mnt->mnt_stuck_children, mnt_umount) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) 		hlist_del(&m->mnt_umount);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) 		mntput(&m->mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) 	fsnotify_vfsmount_delete(&mnt->mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) 	dput(mnt->mnt.mnt_root);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) 	deactivate_super(mnt->mnt.mnt_sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) 	mnt_free_id(mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) 	call_rcu(&mnt->mnt_rcu, delayed_free_vfsmnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) static void __cleanup_mnt(struct rcu_head *head)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) 	cleanup_mnt(container_of(head, struct mount, mnt_rcu));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) static LLIST_HEAD(delayed_mntput_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) static void delayed_mntput(struct work_struct *unused)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) 	struct llist_node *node = llist_del_all(&delayed_mntput_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) 	struct mount *m, *t;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) 	llist_for_each_entry_safe(m, t, node, mnt_llist)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) 		cleanup_mnt(m);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) static DECLARE_DELAYED_WORK(delayed_mntput_work, delayed_mntput);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) static void mntput_no_expire(struct mount *mnt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) 	LIST_HEAD(list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) 	int count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) 	rcu_read_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) 	if (likely(READ_ONCE(mnt->mnt_ns))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) 		/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) 		 * Since we don't do lock_mount_hash() here,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) 		 * ->mnt_ns can change under us.  However, if it's
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) 		 * non-NULL, then there's a reference that won't
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) 		 * be dropped until after an RCU delay done after
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) 		 * turning ->mnt_ns NULL.  So if we observe it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) 		 * non-NULL under rcu_read_lock(), the reference
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153) 		 * we are dropping is not the final one.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) 		mnt_add_count(mnt, -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) 		rcu_read_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) 	lock_mount_hash();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) 	 * make sure that if __legitimize_mnt() has not seen us grab
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) 	 * mount_lock, we'll see their refcount increment here.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) 	smp_mb();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) 	mnt_add_count(mnt, -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) 	count = mnt_get_count(mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) 	if (count != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) 		WARN_ON(count < 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) 		rcu_read_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) 		unlock_mount_hash();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) 	if (unlikely(mnt->mnt.mnt_flags & MNT_DOOMED)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) 		rcu_read_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) 		unlock_mount_hash();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) 	mnt->mnt.mnt_flags |= MNT_DOOMED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) 	rcu_read_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) 	list_del(&mnt->mnt_instance);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) 	if (unlikely(!list_empty(&mnt->mnt_mounts))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) 		struct mount *p, *tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) 		list_for_each_entry_safe(p, tmp, &mnt->mnt_mounts,  mnt_child) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) 			__put_mountpoint(unhash_mnt(p), &list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) 			hlist_add_head(&p->mnt_umount, &mnt->mnt_stuck_children);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) 	unlock_mount_hash();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) 	shrink_dentry_list(&list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) 	if (likely(!(mnt->mnt.mnt_flags & MNT_INTERNAL))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) 		struct task_struct *task = current;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) 		if (likely(!(task->flags & PF_KTHREAD))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) 			init_task_work(&mnt->mnt_rcu, __cleanup_mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) 			if (!task_work_add(task, &mnt->mnt_rcu, TWA_RESUME))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) 				return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) 		if (llist_add(&mnt->mnt_llist, &delayed_mntput_list))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) 			schedule_delayed_work(&delayed_mntput_work, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) 	cleanup_mnt(mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) void mntput(struct vfsmount *mnt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) 	if (mnt) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) 		struct mount *m = real_mount(mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) 		/* avoid cacheline pingpong, hope gcc doesn't get "smart" */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) 		if (unlikely(m->mnt_expiry_mark))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) 			m->mnt_expiry_mark = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214) 		mntput_no_expire(m);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) EXPORT_SYMBOL(mntput);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) struct vfsmount *mntget(struct vfsmount *mnt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) 	if (mnt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) 		mnt_add_count(real_mount(mnt), 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) 	return mnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225) EXPORT_SYMBOL(mntget);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227) /* path_is_mountpoint() - Check if path is a mount in the current
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228)  *                          namespace.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230)  *  d_mountpoint() can only be used reliably to establish if a dentry is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231)  *  not mounted in any namespace and that common case is handled inline.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232)  *  d_mountpoint() isn't aware of the possibility there may be multiple
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233)  *  mounts using a given dentry in a different namespace. This function
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234)  *  checks if the passed in path is a mountpoint rather than the dentry
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235)  *  alone.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) bool path_is_mountpoint(const struct path *path)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) 	unsigned seq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) 	bool res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) 	if (!d_mountpoint(path->dentry))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) 		return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) 	rcu_read_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) 	do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247) 		seq = read_seqbegin(&mount_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) 		res = __path_is_mountpoint(path);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249) 	} while (read_seqretry(&mount_lock, seq));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250) 	rcu_read_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) 	return res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) EXPORT_SYMBOL(path_is_mountpoint);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) struct vfsmount *mnt_clone_internal(const struct path *path)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258) 	struct mount *p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) 	p = clone_mnt(real_mount(path->mnt), path->dentry, CL_PRIVATE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260) 	if (IS_ERR(p))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) 		return ERR_CAST(p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) 	p->mnt.mnt_flags |= MNT_INTERNAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) 	return &p->mnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266) #ifdef CONFIG_PROC_FS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) static struct mount *mnt_list_next(struct mnt_namespace *ns,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) 				   struct list_head *p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) 	struct mount *mnt, *ret = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) 	lock_ns_list(ns);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273) 	list_for_each_continue(p, &ns->list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274) 		mnt = list_entry(p, typeof(*mnt), mnt_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) 		if (!mnt_is_cursor(mnt)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) 			ret = mnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280) 	unlock_ns_list(ns);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285) /* iterator; we want it to have access to namespace_sem, thus here... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286) static void *m_start(struct seq_file *m, loff_t *pos)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288) 	struct proc_mounts *p = m->private;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289) 	struct list_head *prev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291) 	down_read(&namespace_sem);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292) 	if (!*pos) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293) 		prev = &p->ns->list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295) 		prev = &p->cursor.mnt_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297) 		/* Read after we'd reached the end? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298) 		if (list_empty(prev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299) 			return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302) 	return mnt_list_next(p->ns, prev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305) static void *m_next(struct seq_file *m, void *v, loff_t *pos)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307) 	struct proc_mounts *p = m->private;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308) 	struct mount *mnt = v;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310) 	++*pos;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311) 	return mnt_list_next(p->ns, &mnt->mnt_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) static void m_stop(struct seq_file *m, void *v)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316) 	struct proc_mounts *p = m->private;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317) 	struct mount *mnt = v;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319) 	lock_ns_list(p->ns);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320) 	if (mnt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321) 		list_move_tail(&p->cursor.mnt_list, &mnt->mnt_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323) 		list_del_init(&p->cursor.mnt_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324) 	unlock_ns_list(p->ns);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325) 	up_read(&namespace_sem);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328) static int m_show(struct seq_file *m, void *v)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) 	struct proc_mounts *p = m->private;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331) 	struct mount *r = v;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332) 	return p->show(m, &r->mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335) const struct seq_operations mounts_op = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336) 	.start	= m_start,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337) 	.next	= m_next,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338) 	.stop	= m_stop,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339) 	.show	= m_show,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342) void mnt_cursor_del(struct mnt_namespace *ns, struct mount *cursor)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344) 	down_read(&namespace_sem);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) 	lock_ns_list(ns);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) 	list_del(&cursor->mnt_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347) 	unlock_ns_list(ns);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) 	up_read(&namespace_sem);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350) #endif  /* CONFIG_PROC_FS */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353)  * may_umount_tree - check if a mount tree is busy
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354)  * @mnt: root of mount tree
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356)  * This is called to check if a tree of mounts has any
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357)  * open files, pwds, chroots or sub mounts that are
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358)  * busy.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360) int may_umount_tree(struct vfsmount *m)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362) 	struct mount *mnt = real_mount(m);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363) 	int actual_refs = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364) 	int minimum_refs = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) 	struct mount *p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) 	BUG_ON(!m);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368) 	/* write lock needed for mnt_get_count */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369) 	lock_mount_hash();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370) 	for (p = mnt; p; p = next_mnt(p, mnt)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371) 		actual_refs += mnt_get_count(p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372) 		minimum_refs += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374) 	unlock_mount_hash();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376) 	if (actual_refs > minimum_refs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379) 	return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) EXPORT_SYMBOL(may_umount_tree);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385)  * may_umount - check if a mount point is busy
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386)  * @mnt: root of mount
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388)  * This is called to check if a mount point has any
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389)  * open files, pwds, chroots or sub mounts. If the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390)  * mount has sub mounts this will return busy
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391)  * regardless of whether the sub mounts are busy.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393)  * Doesn't take quota and stuff into account. IOW, in some cases it will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394)  * give false negatives. The main reason why it's here is that we need
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395)  * a non-destructive way to look for easily umountable filesystems.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397) int may_umount(struct vfsmount *mnt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399) 	int ret = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400) 	down_read(&namespace_sem);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401) 	lock_mount_hash();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402) 	if (propagate_mount_busy(real_mount(mnt), 2))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403) 		ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404) 	unlock_mount_hash();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405) 	up_read(&namespace_sem);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409) EXPORT_SYMBOL(may_umount);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411) static void namespace_unlock(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413) 	struct hlist_head head;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414) 	struct hlist_node *p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415) 	struct mount *m;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416) 	LIST_HEAD(list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418) 	hlist_move_list(&unmounted, &head);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419) 	list_splice_init(&ex_mountpoints, &list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421) 	up_write(&namespace_sem);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423) 	shrink_dentry_list(&list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425) 	if (likely(hlist_empty(&head)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428) 	synchronize_rcu_expedited();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430) 	hlist_for_each_entry_safe(m, p, &head, mnt_umount) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431) 		hlist_del(&m->mnt_umount);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432) 		mntput(&m->mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436) static inline void namespace_lock(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438) 	down_write(&namespace_sem);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441) enum umount_tree_flags {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442) 	UMOUNT_SYNC = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) 	UMOUNT_PROPAGATE = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444) 	UMOUNT_CONNECTED = 4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447) static bool disconnect_mount(struct mount *mnt, enum umount_tree_flags how)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449) 	/* Leaving mounts connected is only valid for lazy umounts */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450) 	if (how & UMOUNT_SYNC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451) 		return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453) 	/* A mount without a parent has nothing to be connected to */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454) 	if (!mnt_has_parent(mnt))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455) 		return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457) 	/* Because the reference counting rules change when mounts are
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458) 	 * unmounted and connected, umounted mounts may not be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459) 	 * connected to mounted mounts.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461) 	if (!(mnt->mnt_parent->mnt.mnt_flags & MNT_UMOUNT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462) 		return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464) 	/* Has it been requested that the mount remain connected? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465) 	if (how & UMOUNT_CONNECTED)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466) 		return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468) 	/* Is the mount locked such that it needs to remain connected? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469) 	if (IS_MNT_LOCKED(mnt))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470) 		return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472) 	/* By default disconnect the mount */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473) 	return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477)  * mount_lock must be held
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478)  * namespace_sem must be held for write
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480) static void umount_tree(struct mount *mnt, enum umount_tree_flags how)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482) 	LIST_HEAD(tmp_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483) 	struct mount *p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485) 	if (how & UMOUNT_PROPAGATE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486) 		propagate_mount_unlock(mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488) 	/* Gather the mounts to umount */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489) 	for (p = mnt; p; p = next_mnt(p, mnt)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490) 		p->mnt.mnt_flags |= MNT_UMOUNT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491) 		list_move(&p->mnt_list, &tmp_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494) 	/* Hide the mounts from mnt_mounts */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495) 	list_for_each_entry(p, &tmp_list, mnt_list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496) 		list_del_init(&p->mnt_child);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499) 	/* Add propogated mounts to the tmp_list */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500) 	if (how & UMOUNT_PROPAGATE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501) 		propagate_umount(&tmp_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503) 	while (!list_empty(&tmp_list)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504) 		struct mnt_namespace *ns;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505) 		bool disconnect;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506) 		p = list_first_entry(&tmp_list, struct mount, mnt_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507) 		list_del_init(&p->mnt_expire);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508) 		list_del_init(&p->mnt_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509) 		ns = p->mnt_ns;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510) 		if (ns) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511) 			ns->mounts--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512) 			__touch_mnt_namespace(ns);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514) 		p->mnt_ns = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515) 		if (how & UMOUNT_SYNC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516) 			p->mnt.mnt_flags |= MNT_SYNC_UMOUNT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518) 		disconnect = disconnect_mount(p, how);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519) 		if (mnt_has_parent(p)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520) 			mnt_add_count(p->mnt_parent, -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521) 			if (!disconnect) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522) 				/* Don't forget about p */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523) 				list_add_tail(&p->mnt_child, &p->mnt_parent->mnt_mounts);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524) 			} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1525) 				umount_mnt(p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1526) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1527) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1528) 		change_mnt_propagation(p, MS_PRIVATE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1529) 		if (disconnect)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1530) 			hlist_add_head(&p->mnt_umount, &unmounted);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1531) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1532) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1533) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1534) static void shrink_submounts(struct mount *mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1535) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1536) static int do_umount_root(struct super_block *sb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1537) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1538) 	int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1539) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1540) 	down_write(&sb->s_umount);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1541) 	if (!sb_rdonly(sb)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1542) 		struct fs_context *fc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1543) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1544) 		fc = fs_context_for_reconfigure(sb->s_root, SB_RDONLY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1545) 						SB_RDONLY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1546) 		if (IS_ERR(fc)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1547) 			ret = PTR_ERR(fc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1548) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1549) 			ret = parse_monolithic_mount_data(fc, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1550) 			if (!ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1551) 				ret = reconfigure_super(fc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1552) 			put_fs_context(fc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1553) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1554) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1555) 	up_write(&sb->s_umount);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1556) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1557) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1558) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1559) static int do_umount(struct mount *mnt, int flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1560) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1561) 	struct super_block *sb = mnt->mnt.mnt_sb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1562) 	int retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1563) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1564) 	retval = security_sb_umount(&mnt->mnt, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1565) 	if (retval)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1566) 		return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1567) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1568) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1569) 	 * Allow userspace to request a mountpoint be expired rather than
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1570) 	 * unmounting unconditionally. Unmount only happens if:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1571) 	 *  (1) the mark is already set (the mark is cleared by mntput())
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1572) 	 *  (2) the usage count == 1 [parent vfsmount] + 1 [sys_umount]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1573) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1574) 	if (flags & MNT_EXPIRE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1575) 		if (&mnt->mnt == current->fs->root.mnt ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1576) 		    flags & (MNT_FORCE | MNT_DETACH))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1577) 			return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1578) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1579) 		/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1580) 		 * probably don't strictly need the lock here if we examined
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1581) 		 * all race cases, but it's a slowpath.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1582) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1583) 		lock_mount_hash();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1584) 		if (mnt_get_count(mnt) != 2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1585) 			unlock_mount_hash();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1586) 			return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1587) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1588) 		unlock_mount_hash();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1589) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1590) 		if (!xchg(&mnt->mnt_expiry_mark, 1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1591) 			return -EAGAIN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1592) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1593) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1594) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1595) 	 * If we may have to abort operations to get out of this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1596) 	 * mount, and they will themselves hold resources we must
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1597) 	 * allow the fs to do things. In the Unix tradition of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1598) 	 * 'Gee thats tricky lets do it in userspace' the umount_begin
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1599) 	 * might fail to complete on the first run through as other tasks
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1600) 	 * must return, and the like. Thats for the mount program to worry
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1601) 	 * about for the moment.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1602) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1603) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1604) 	if (flags & MNT_FORCE && sb->s_op->umount_begin) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1605) 		sb->s_op->umount_begin(sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1606) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1607) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1608) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1609) 	 * No sense to grab the lock for this test, but test itself looks
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1610) 	 * somewhat bogus. Suggestions for better replacement?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1611) 	 * Ho-hum... In principle, we might treat that as umount + switch
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1612) 	 * to rootfs. GC would eventually take care of the old vfsmount.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1613) 	 * Actually it makes sense, especially if rootfs would contain a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1614) 	 * /reboot - static binary that would close all descriptors and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1615) 	 * call reboot(9). Then init(8) could umount root and exec /reboot.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1616) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1617) 	if (&mnt->mnt == current->fs->root.mnt && !(flags & MNT_DETACH)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1618) 		/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1619) 		 * Special case for "unmounting" root ...
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1620) 		 * we just try to remount it readonly.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1621) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1622) 		if (!ns_capable(sb->s_user_ns, CAP_SYS_ADMIN))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1623) 			return -EPERM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1624) 		return do_umount_root(sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1625) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1626) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1627) 	namespace_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1628) 	lock_mount_hash();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1629) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1630) 	/* Recheck MNT_LOCKED with the locks held */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1631) 	retval = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1632) 	if (mnt->mnt.mnt_flags & MNT_LOCKED)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1633) 		goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1634) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1635) 	event++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1636) 	if (flags & MNT_DETACH) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1637) 		if (!list_empty(&mnt->mnt_list))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1638) 			umount_tree(mnt, UMOUNT_PROPAGATE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1639) 		retval = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1640) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1641) 		shrink_submounts(mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1642) 		retval = -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1643) 		if (!propagate_mount_busy(mnt, 2)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1644) 			if (!list_empty(&mnt->mnt_list))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1645) 				umount_tree(mnt, UMOUNT_PROPAGATE|UMOUNT_SYNC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1646) 			retval = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1647) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1648) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1649) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1650) 	unlock_mount_hash();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1651) 	namespace_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1652) 	return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1653) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1654) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1655) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1656)  * __detach_mounts - lazily unmount all mounts on the specified dentry
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1657)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1658)  * During unlink, rmdir, and d_drop it is possible to loose the path
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1659)  * to an existing mountpoint, and wind up leaking the mount.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1660)  * detach_mounts allows lazily unmounting those mounts instead of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1661)  * leaking them.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1662)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1663)  * The caller may hold dentry->d_inode->i_mutex.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1664)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1665) void __detach_mounts(struct dentry *dentry)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1666) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1667) 	struct mountpoint *mp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1668) 	struct mount *mnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1669) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1670) 	namespace_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1671) 	lock_mount_hash();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1672) 	mp = lookup_mountpoint(dentry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1673) 	if (!mp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1674) 		goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1675) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1676) 	event++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1677) 	while (!hlist_empty(&mp->m_list)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1678) 		mnt = hlist_entry(mp->m_list.first, struct mount, mnt_mp_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1679) 		if (mnt->mnt.mnt_flags & MNT_UMOUNT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1680) 			umount_mnt(mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1681) 			hlist_add_head(&mnt->mnt_umount, &unmounted);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1682) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1683) 		else umount_tree(mnt, UMOUNT_CONNECTED);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1684) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1685) 	put_mountpoint(mp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1686) out_unlock:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1687) 	unlock_mount_hash();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1688) 	namespace_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1689) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1690) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1691) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1692)  * Is the caller allowed to modify his namespace?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1693)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1694) static inline bool may_mount(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1695) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1696) 	return ns_capable(current->nsproxy->mnt_ns->user_ns, CAP_SYS_ADMIN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1697) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1698) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1699) #ifdef	CONFIG_MANDATORY_FILE_LOCKING
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1700) static bool may_mandlock(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1701) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1702) 	pr_warn_once("======================================================\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1703) 		     "WARNING: the mand mount option is being deprecated and\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1704) 		     "         will be removed in v5.15!\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1705) 		     "======================================================\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1706) 	return capable(CAP_SYS_ADMIN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1707) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1708) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1709) static inline bool may_mandlock(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1710) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1711) 	pr_warn("VFS: \"mand\" mount option not supported");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1712) 	return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1713) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1714) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1715) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1716) static int can_umount(const struct path *path, int flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1717) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1718) 	struct mount *mnt = real_mount(path->mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1719) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1720) 	if (!may_mount())
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1721) 		return -EPERM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1722) 	if (path->dentry != path->mnt->mnt_root)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1723) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1724) 	if (!check_mnt(mnt))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1725) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1726) 	if (mnt->mnt.mnt_flags & MNT_LOCKED) /* Check optimistically */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1727) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1728) 	if (flags & MNT_FORCE && !capable(CAP_SYS_ADMIN))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1729) 		return -EPERM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1730) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1731) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1732) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1733) // caller is responsible for flags being sane
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1734) int path_umount(struct path *path, int flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1735) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1736) 	struct mount *mnt = real_mount(path->mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1737) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1738) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1739) 	ret = can_umount(path, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1740) 	if (!ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1741) 		ret = do_umount(mnt, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1742) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1743) 	/* we mustn't call path_put() as that would clear mnt_expiry_mark */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1744) 	dput(path->dentry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1745) 	mntput_no_expire(mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1746) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1747) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1748) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1749) static int ksys_umount(char __user *name, int flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1750) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1751) 	int lookup_flags = LOOKUP_MOUNTPOINT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1752) 	struct path path;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1753) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1754) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1755) 	// basic validity checks done first
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1756) 	if (flags & ~(MNT_FORCE | MNT_DETACH | MNT_EXPIRE | UMOUNT_NOFOLLOW))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1757) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1758) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1759) 	if (!(flags & UMOUNT_NOFOLLOW))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1760) 		lookup_flags |= LOOKUP_FOLLOW;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1761) 	ret = user_path_at(AT_FDCWD, name, lookup_flags, &path);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1762) 	if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1763) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1764) 	return path_umount(&path, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1765) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1766) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1767) SYSCALL_DEFINE2(umount, char __user *, name, int, flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1768) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1769) 	return ksys_umount(name, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1770) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1771) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1772) #ifdef __ARCH_WANT_SYS_OLDUMOUNT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1773) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1774) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1775)  *	The 2.0 compatible umount. No flags.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1776)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1777) SYSCALL_DEFINE1(oldumount, char __user *, name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1778) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1779) 	return ksys_umount(name, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1780) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1781) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1782) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1783) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1784) static bool is_mnt_ns_file(struct dentry *dentry)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1785) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1786) 	/* Is this a proxy for a mount namespace? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1787) 	return dentry->d_op == &ns_dentry_operations &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1788) 	       dentry->d_fsdata == &mntns_operations;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1789) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1790) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1791) static struct mnt_namespace *to_mnt_ns(struct ns_common *ns)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1792) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1793) 	return container_of(ns, struct mnt_namespace, ns);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1794) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1795) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1796) struct ns_common *from_mnt_ns(struct mnt_namespace *mnt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1797) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1798) 	return &mnt->ns;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1799) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1800) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1801) static bool mnt_ns_loop(struct dentry *dentry)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1802) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1803) 	/* Could bind mounting the mount namespace inode cause a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1804) 	 * mount namespace loop?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1805) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1806) 	struct mnt_namespace *mnt_ns;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1807) 	if (!is_mnt_ns_file(dentry))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1808) 		return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1809) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1810) 	mnt_ns = to_mnt_ns(get_proc_ns(dentry->d_inode));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1811) 	return current->nsproxy->mnt_ns->seq >= mnt_ns->seq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1812) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1813) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1814) struct mount *copy_tree(struct mount *mnt, struct dentry *dentry,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1815) 					int flag)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1816) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1817) 	struct mount *res, *p, *q, *r, *parent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1818) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1819) 	if (!(flag & CL_COPY_UNBINDABLE) && IS_MNT_UNBINDABLE(mnt))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1820) 		return ERR_PTR(-EINVAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1821) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1822) 	if (!(flag & CL_COPY_MNT_NS_FILE) && is_mnt_ns_file(dentry))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1823) 		return ERR_PTR(-EINVAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1824) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1825) 	res = q = clone_mnt(mnt, dentry, flag);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1826) 	if (IS_ERR(q))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1827) 		return q;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1828) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1829) 	q->mnt_mountpoint = mnt->mnt_mountpoint;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1830) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1831) 	p = mnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1832) 	list_for_each_entry(r, &mnt->mnt_mounts, mnt_child) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1833) 		struct mount *s;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1834) 		if (!is_subdir(r->mnt_mountpoint, dentry))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1835) 			continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1836) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1837) 		for (s = r; s; s = next_mnt(s, r)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1838) 			if (!(flag & CL_COPY_UNBINDABLE) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1839) 			    IS_MNT_UNBINDABLE(s)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1840) 				if (s->mnt.mnt_flags & MNT_LOCKED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1841) 					/* Both unbindable and locked. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1842) 					q = ERR_PTR(-EPERM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1843) 					goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1844) 				} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1845) 					s = skip_mnt_tree(s);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1846) 					continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1847) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1848) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1849) 			if (!(flag & CL_COPY_MNT_NS_FILE) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1850) 			    is_mnt_ns_file(s->mnt.mnt_root)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1851) 				s = skip_mnt_tree(s);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1852) 				continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1853) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1854) 			while (p != s->mnt_parent) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1855) 				p = p->mnt_parent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1856) 				q = q->mnt_parent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1857) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1858) 			p = s;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1859) 			parent = q;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1860) 			q = clone_mnt(p, p->mnt.mnt_root, flag);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1861) 			if (IS_ERR(q))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1862) 				goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1863) 			lock_mount_hash();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1864) 			list_add_tail(&q->mnt_list, &res->mnt_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1865) 			attach_mnt(q, parent, p->mnt_mp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1866) 			unlock_mount_hash();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1867) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1868) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1869) 	return res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1870) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1871) 	if (res) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1872) 		lock_mount_hash();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1873) 		umount_tree(res, UMOUNT_SYNC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1874) 		unlock_mount_hash();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1875) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1876) 	return q;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1877) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1878) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1879) /* Caller should check returned pointer for errors */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1880) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1881) struct vfsmount *collect_mounts(const struct path *path)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1882) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1883) 	struct mount *tree;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1884) 	namespace_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1885) 	if (!check_mnt(real_mount(path->mnt)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1886) 		tree = ERR_PTR(-EINVAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1887) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1888) 		tree = copy_tree(real_mount(path->mnt), path->dentry,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1889) 				 CL_COPY_ALL | CL_PRIVATE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1890) 	namespace_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1891) 	if (IS_ERR(tree))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1892) 		return ERR_CAST(tree);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1893) 	return &tree->mnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1894) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1895) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1896) static void free_mnt_ns(struct mnt_namespace *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1897) static struct mnt_namespace *alloc_mnt_ns(struct user_namespace *, bool);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1898) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1899) void dissolve_on_fput(struct vfsmount *mnt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1900) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1901) 	struct mnt_namespace *ns;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1902) 	namespace_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1903) 	lock_mount_hash();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1904) 	ns = real_mount(mnt)->mnt_ns;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1905) 	if (ns) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1906) 		if (is_anon_ns(ns))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1907) 			umount_tree(real_mount(mnt), UMOUNT_CONNECTED);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1908) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1909) 			ns = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1910) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1911) 	unlock_mount_hash();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1912) 	namespace_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1913) 	if (ns)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1914) 		free_mnt_ns(ns);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1915) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1916) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1917) void drop_collected_mounts(struct vfsmount *mnt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1918) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1919) 	namespace_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1920) 	lock_mount_hash();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1921) 	umount_tree(real_mount(mnt), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1922) 	unlock_mount_hash();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1923) 	namespace_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1924) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1925) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1926) static bool has_locked_children(struct mount *mnt, struct dentry *dentry)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1927) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1928) 	struct mount *child;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1929) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1930) 	list_for_each_entry(child, &mnt->mnt_mounts, mnt_child) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1931) 		if (!is_subdir(child->mnt_mountpoint, dentry))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1932) 			continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1933) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1934) 		if (child->mnt.mnt_flags & MNT_LOCKED)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1935) 			return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1936) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1937) 	return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1938) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1939) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1940) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1941)  * clone_private_mount - create a private clone of a path
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1942)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1943)  * This creates a new vfsmount, which will be the clone of @path.  The new will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1944)  * not be attached anywhere in the namespace and will be private (i.e. changes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1945)  * to the originating mount won't be propagated into this).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1946)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1947)  * Release with mntput().
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1948)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1949) struct vfsmount *clone_private_mount(const struct path *path)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1950) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1951) 	struct mount *old_mnt = real_mount(path->mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1952) 	struct mount *new_mnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1953) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1954) 	down_read(&namespace_sem);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1955) 	if (IS_MNT_UNBINDABLE(old_mnt))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1956) 		goto invalid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1957) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1958) 	if (!check_mnt(old_mnt))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1959) 		goto invalid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1960) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1961) 	if (has_locked_children(old_mnt, path->dentry))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1962) 		goto invalid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1963) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1964) 	new_mnt = clone_mnt(old_mnt, path->dentry, CL_PRIVATE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1965) 	up_read(&namespace_sem);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1966) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1967) 	if (IS_ERR(new_mnt))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1968) 		return ERR_CAST(new_mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1969) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1970) 	/* Longterm mount to be removed by kern_unmount*() */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1971) 	new_mnt->mnt_ns = MNT_NS_INTERNAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1972) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1973) 	return &new_mnt->mnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1974) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1975) invalid:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1976) 	up_read(&namespace_sem);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1977) 	return ERR_PTR(-EINVAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1978) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1979) EXPORT_SYMBOL_GPL(clone_private_mount);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1980) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1981) int iterate_mounts(int (*f)(struct vfsmount *, void *), void *arg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1982) 		   struct vfsmount *root)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1983) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1984) 	struct mount *mnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1985) 	int res = f(root, arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1986) 	if (res)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1987) 		return res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1988) 	list_for_each_entry(mnt, &real_mount(root)->mnt_list, mnt_list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1989) 		res = f(&mnt->mnt, arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1990) 		if (res)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1991) 			return res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1992) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1993) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1994) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1995) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1996) static void lock_mnt_tree(struct mount *mnt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1997) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1998) 	struct mount *p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1999) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2000) 	for (p = mnt; p; p = next_mnt(p, mnt)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2001) 		int flags = p->mnt.mnt_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2002) 		/* Don't allow unprivileged users to change mount flags */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2003) 		flags |= MNT_LOCK_ATIME;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2004) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2005) 		if (flags & MNT_READONLY)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2006) 			flags |= MNT_LOCK_READONLY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2007) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2008) 		if (flags & MNT_NODEV)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2009) 			flags |= MNT_LOCK_NODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2010) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2011) 		if (flags & MNT_NOSUID)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2012) 			flags |= MNT_LOCK_NOSUID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2013) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2014) 		if (flags & MNT_NOEXEC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2015) 			flags |= MNT_LOCK_NOEXEC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2016) 		/* Don't allow unprivileged users to reveal what is under a mount */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2017) 		if (list_empty(&p->mnt_expire))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2018) 			flags |= MNT_LOCKED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2019) 		p->mnt.mnt_flags = flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2020) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2021) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2022) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2023) static void cleanup_group_ids(struct mount *mnt, struct mount *end)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2024) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2025) 	struct mount *p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2026) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2027) 	for (p = mnt; p != end; p = next_mnt(p, mnt)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2028) 		if (p->mnt_group_id && !IS_MNT_SHARED(p))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2029) 			mnt_release_group_id(p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2030) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2031) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2032) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2033) static int invent_group_ids(struct mount *mnt, bool recurse)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2034) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2035) 	struct mount *p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2036) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2037) 	for (p = mnt; p; p = recurse ? next_mnt(p, mnt) : NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2038) 		if (!p->mnt_group_id && !IS_MNT_SHARED(p)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2039) 			int err = mnt_alloc_group_id(p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2040) 			if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2041) 				cleanup_group_ids(mnt, p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2042) 				return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2043) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2044) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2045) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2046) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2047) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2048) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2049) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2050) int count_mounts(struct mnt_namespace *ns, struct mount *mnt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2051) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2052) 	unsigned int max = READ_ONCE(sysctl_mount_max);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2053) 	unsigned int mounts = 0, old, pending, sum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2054) 	struct mount *p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2055) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2056) 	for (p = mnt; p; p = next_mnt(p, mnt))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2057) 		mounts++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2058) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2059) 	old = ns->mounts;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2060) 	pending = ns->pending_mounts;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2061) 	sum = old + pending;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2062) 	if ((old > sum) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2063) 	    (pending > sum) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2064) 	    (max < sum) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2065) 	    (mounts > (max - sum)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2066) 		return -ENOSPC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2067) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2068) 	ns->pending_mounts = pending + mounts;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2069) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2070) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2071) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2072) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2073)  *  @source_mnt : mount tree to be attached
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2074)  *  @nd         : place the mount tree @source_mnt is attached
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2075)  *  @parent_nd  : if non-null, detach the source_mnt from its parent and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2076)  *  		   store the parent mount and mountpoint dentry.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2077)  *  		   (done when source_mnt is moved)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2078)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2079)  *  NOTE: in the table below explains the semantics when a source mount
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2080)  *  of a given type is attached to a destination mount of a given type.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2081)  * ---------------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2082)  * |         BIND MOUNT OPERATION                                            |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2083)  * |**************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2084)  * | source-->| shared        |       private  |       slave    | unbindable |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2085)  * | dest     |               |                |                |            |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2086)  * |   |      |               |                |                |            |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2087)  * |   v      |               |                |                |            |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2088)  * |**************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2089)  * |  shared  | shared (++)   |     shared (+) |     shared(+++)|  invalid   |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2090)  * |          |               |                |                |            |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2091)  * |non-shared| shared (+)    |      private   |      slave (*) |  invalid   |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2092)  * ***************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2093)  * A bind operation clones the source mount and mounts the clone on the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2094)  * destination mount.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2095)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2096)  * (++)  the cloned mount is propagated to all the mounts in the propagation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2097)  * 	 tree of the destination mount and the cloned mount is added to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2098)  * 	 the peer group of the source mount.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2099)  * (+)   the cloned mount is created under the destination mount and is marked
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2100)  *       as shared. The cloned mount is added to the peer group of the source
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2101)  *       mount.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2102)  * (+++) the mount is propagated to all the mounts in the propagation tree
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2103)  *       of the destination mount and the cloned mount is made slave
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2104)  *       of the same master as that of the source mount. The cloned mount
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2105)  *       is marked as 'shared and slave'.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2106)  * (*)   the cloned mount is made a slave of the same master as that of the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2107)  * 	 source mount.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2108)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2109)  * ---------------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2110)  * |         		MOVE MOUNT OPERATION                                 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2111)  * |**************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2112)  * | source-->| shared        |       private  |       slave    | unbindable |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2113)  * | dest     |               |                |                |            |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2114)  * |   |      |               |                |                |            |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2115)  * |   v      |               |                |                |            |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2116)  * |**************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2117)  * |  shared  | shared (+)    |     shared (+) |    shared(+++) |  invalid   |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2118)  * |          |               |                |                |            |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2119)  * |non-shared| shared (+*)   |      private   |    slave (*)   | unbindable |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2120)  * ***************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2121)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2122)  * (+)  the mount is moved to the destination. And is then propagated to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2123)  * 	all the mounts in the propagation tree of the destination mount.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2124)  * (+*)  the mount is moved to the destination.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2125)  * (+++)  the mount is moved to the destination and is then propagated to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2126)  * 	all the mounts belonging to the destination mount's propagation tree.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2127)  * 	the mount is marked as 'shared and slave'.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2128)  * (*)	the mount continues to be a slave at the new location.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2129)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2130)  * if the source mount is a tree, the operations explained above is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2131)  * applied to each mount in the tree.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2132)  * Must be called without spinlocks held, since this function can sleep
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2133)  * in allocations.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2134)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2135) static int attach_recursive_mnt(struct mount *source_mnt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2136) 			struct mount *dest_mnt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2137) 			struct mountpoint *dest_mp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2138) 			bool moving)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2139) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2140) 	struct user_namespace *user_ns = current->nsproxy->mnt_ns->user_ns;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2141) 	HLIST_HEAD(tree_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2142) 	struct mnt_namespace *ns = dest_mnt->mnt_ns;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2143) 	struct mountpoint *smp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2144) 	struct mount *child, *p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2145) 	struct hlist_node *n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2146) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2147) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2148) 	/* Preallocate a mountpoint in case the new mounts need
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2149) 	 * to be tucked under other mounts.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2150) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2151) 	smp = get_mountpoint(source_mnt->mnt.mnt_root);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2152) 	if (IS_ERR(smp))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2153) 		return PTR_ERR(smp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2154) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2155) 	/* Is there space to add these mounts to the mount namespace? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2156) 	if (!moving) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2157) 		err = count_mounts(ns, source_mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2158) 		if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2159) 			goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2160) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2161) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2162) 	if (IS_MNT_SHARED(dest_mnt)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2163) 		err = invent_group_ids(source_mnt, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2164) 		if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2165) 			goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2166) 		err = propagate_mnt(dest_mnt, dest_mp, source_mnt, &tree_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2167) 		lock_mount_hash();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2168) 		if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2169) 			goto out_cleanup_ids;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2170) 		for (p = source_mnt; p; p = next_mnt(p, source_mnt))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2171) 			set_mnt_shared(p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2172) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2173) 		lock_mount_hash();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2174) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2175) 	if (moving) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2176) 		unhash_mnt(source_mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2177) 		attach_mnt(source_mnt, dest_mnt, dest_mp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2178) 		touch_mnt_namespace(source_mnt->mnt_ns);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2179) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2180) 		if (source_mnt->mnt_ns) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2181) 			/* move from anon - the caller will destroy */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2182) 			list_del_init(&source_mnt->mnt_ns->list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2183) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2184) 		mnt_set_mountpoint(dest_mnt, dest_mp, source_mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2185) 		commit_tree(source_mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2186) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2187) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2188) 	hlist_for_each_entry_safe(child, n, &tree_list, mnt_hash) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2189) 		struct mount *q;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2190) 		hlist_del_init(&child->mnt_hash);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2191) 		q = __lookup_mnt(&child->mnt_parent->mnt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2192) 				 child->mnt_mountpoint);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2193) 		if (q)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2194) 			mnt_change_mountpoint(child, smp, q);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2195) 		/* Notice when we are propagating across user namespaces */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2196) 		if (child->mnt_parent->mnt_ns->user_ns != user_ns)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2197) 			lock_mnt_tree(child);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2198) 		child->mnt.mnt_flags &= ~MNT_LOCKED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2199) 		commit_tree(child);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2200) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2201) 	put_mountpoint(smp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2202) 	unlock_mount_hash();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2203) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2204) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2205) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2206)  out_cleanup_ids:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2207) 	while (!hlist_empty(&tree_list)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2208) 		child = hlist_entry(tree_list.first, struct mount, mnt_hash);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2209) 		child->mnt_parent->mnt_ns->pending_mounts = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2210) 		umount_tree(child, UMOUNT_SYNC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2211) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2212) 	unlock_mount_hash();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2213) 	cleanup_group_ids(source_mnt, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2214)  out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2215) 	ns->pending_mounts = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2216) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2217) 	read_seqlock_excl(&mount_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2218) 	put_mountpoint(smp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2219) 	read_sequnlock_excl(&mount_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2220) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2221) 	return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2222) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2223) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2224) static struct mountpoint *lock_mount(struct path *path)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2225) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2226) 	struct vfsmount *mnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2227) 	struct dentry *dentry = path->dentry;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2228) retry:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2229) 	inode_lock(dentry->d_inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2230) 	if (unlikely(cant_mount(dentry))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2231) 		inode_unlock(dentry->d_inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2232) 		return ERR_PTR(-ENOENT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2233) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2234) 	namespace_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2235) 	mnt = lookup_mnt(path);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2236) 	if (likely(!mnt)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2237) 		struct mountpoint *mp = get_mountpoint(dentry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2238) 		if (IS_ERR(mp)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2239) 			namespace_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2240) 			inode_unlock(dentry->d_inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2241) 			return mp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2242) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2243) 		return mp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2244) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2245) 	namespace_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2246) 	inode_unlock(path->dentry->d_inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2247) 	path_put(path);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2248) 	path->mnt = mnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2249) 	dentry = path->dentry = dget(mnt->mnt_root);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2250) 	goto retry;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2251) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2252) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2253) static void unlock_mount(struct mountpoint *where)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2254) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2255) 	struct dentry *dentry = where->m_dentry;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2256) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2257) 	read_seqlock_excl(&mount_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2258) 	put_mountpoint(where);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2259) 	read_sequnlock_excl(&mount_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2260) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2261) 	namespace_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2262) 	inode_unlock(dentry->d_inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2263) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2264) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2265) static int graft_tree(struct mount *mnt, struct mount *p, struct mountpoint *mp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2266) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2267) 	if (mnt->mnt.mnt_sb->s_flags & SB_NOUSER)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2268) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2269) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2270) 	if (d_is_dir(mp->m_dentry) !=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2271) 	      d_is_dir(mnt->mnt.mnt_root))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2272) 		return -ENOTDIR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2273) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2274) 	return attach_recursive_mnt(mnt, p, mp, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2275) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2276) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2277) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2278)  * Sanity check the flags to change_mnt_propagation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2279)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2280) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2281) static int flags_to_propagation_type(int ms_flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2282) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2283) 	int type = ms_flags & ~(MS_REC | MS_SILENT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2284) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2285) 	/* Fail if any non-propagation flags are set */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2286) 	if (type & ~(MS_SHARED | MS_PRIVATE | MS_SLAVE | MS_UNBINDABLE))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2287) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2288) 	/* Only one propagation flag should be set */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2289) 	if (!is_power_of_2(type))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2290) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2291) 	return type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2292) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2293) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2294) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2295)  * recursively change the type of the mountpoint.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2296)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2297) static int do_change_type(struct path *path, int ms_flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2298) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2299) 	struct mount *m;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2300) 	struct mount *mnt = real_mount(path->mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2301) 	int recurse = ms_flags & MS_REC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2302) 	int type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2303) 	int err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2304) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2305) 	if (path->dentry != path->mnt->mnt_root)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2306) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2307) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2308) 	type = flags_to_propagation_type(ms_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2309) 	if (!type)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2310) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2311) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2312) 	namespace_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2313) 	if (type == MS_SHARED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2314) 		err = invent_group_ids(mnt, recurse);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2315) 		if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2316) 			goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2317) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2318) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2319) 	lock_mount_hash();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2320) 	for (m = mnt; m; m = (recurse ? next_mnt(m, mnt) : NULL))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2321) 		change_mnt_propagation(m, type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2322) 	unlock_mount_hash();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2323) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2324)  out_unlock:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2325) 	namespace_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2326) 	return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2327) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2328) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2329) static struct mount *__do_loopback(struct path *old_path, int recurse)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2330) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2331) 	struct mount *mnt = ERR_PTR(-EINVAL), *old = real_mount(old_path->mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2332) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2333) 	if (IS_MNT_UNBINDABLE(old))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2334) 		return mnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2335) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2336) 	if (!check_mnt(old) && old_path->dentry->d_op != &ns_dentry_operations)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2337) 		return mnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2338) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2339) 	if (!recurse && has_locked_children(old, old_path->dentry))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2340) 		return mnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2341) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2342) 	if (recurse)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2343) 		mnt = copy_tree(old, old_path->dentry, CL_COPY_MNT_NS_FILE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2344) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2345) 		mnt = clone_mnt(old, old_path->dentry, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2346) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2347) 	if (!IS_ERR(mnt))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2348) 		mnt->mnt.mnt_flags &= ~MNT_LOCKED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2349) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2350) 	return mnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2351) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2352) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2353) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2354)  * do loopback mount.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2355)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2356) static int do_loopback(struct path *path, const char *old_name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2357) 				int recurse)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2358) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2359) 	struct path old_path;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2360) 	struct mount *mnt = NULL, *parent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2361) 	struct mountpoint *mp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2362) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2363) 	if (!old_name || !*old_name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2364) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2365) 	err = kern_path(old_name, LOOKUP_FOLLOW|LOOKUP_AUTOMOUNT, &old_path);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2366) 	if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2367) 		return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2368) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2369) 	err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2370) 	if (mnt_ns_loop(old_path.dentry))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2371) 		goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2372) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2373) 	mp = lock_mount(path);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2374) 	if (IS_ERR(mp)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2375) 		err = PTR_ERR(mp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2376) 		goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2377) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2378) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2379) 	parent = real_mount(path->mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2380) 	if (!check_mnt(parent))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2381) 		goto out2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2382) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2383) 	mnt = __do_loopback(&old_path, recurse);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2384) 	if (IS_ERR(mnt)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2385) 		err = PTR_ERR(mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2386) 		goto out2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2387) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2388) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2389) 	err = graft_tree(mnt, parent, mp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2390) 	if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2391) 		lock_mount_hash();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2392) 		umount_tree(mnt, UMOUNT_SYNC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2393) 		unlock_mount_hash();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2394) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2395) out2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2396) 	unlock_mount(mp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2397) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2398) 	path_put(&old_path);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2399) 	return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2400) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2401) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2402) static struct file *open_detached_copy(struct path *path, bool recursive)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2403) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2404) 	struct user_namespace *user_ns = current->nsproxy->mnt_ns->user_ns;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2405) 	struct mnt_namespace *ns = alloc_mnt_ns(user_ns, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2406) 	struct mount *mnt, *p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2407) 	struct file *file;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2408) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2409) 	if (IS_ERR(ns))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2410) 		return ERR_CAST(ns);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2411) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2412) 	namespace_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2413) 	mnt = __do_loopback(path, recursive);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2414) 	if (IS_ERR(mnt)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2415) 		namespace_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2416) 		free_mnt_ns(ns);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2417) 		return ERR_CAST(mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2418) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2419) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2420) 	lock_mount_hash();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2421) 	for (p = mnt; p; p = next_mnt(p, mnt)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2422) 		p->mnt_ns = ns;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2423) 		ns->mounts++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2424) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2425) 	ns->root = mnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2426) 	list_add_tail(&ns->list, &mnt->mnt_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2427) 	mntget(&mnt->mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2428) 	unlock_mount_hash();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2429) 	namespace_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2430) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2431) 	mntput(path->mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2432) 	path->mnt = &mnt->mnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2433) 	file = dentry_open(path, O_PATH, current_cred());
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2434) 	if (IS_ERR(file))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2435) 		dissolve_on_fput(path->mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2436) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2437) 		file->f_mode |= FMODE_NEED_UNMOUNT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2438) 	return file;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2439) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2440) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2441) SYSCALL_DEFINE3(open_tree, int, dfd, const char __user *, filename, unsigned, flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2442) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2443) 	struct file *file;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2444) 	struct path path;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2445) 	int lookup_flags = LOOKUP_AUTOMOUNT | LOOKUP_FOLLOW;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2446) 	bool detached = flags & OPEN_TREE_CLONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2447) 	int error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2448) 	int fd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2449) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2450) 	BUILD_BUG_ON(OPEN_TREE_CLOEXEC != O_CLOEXEC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2451) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2452) 	if (flags & ~(AT_EMPTY_PATH | AT_NO_AUTOMOUNT | AT_RECURSIVE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2453) 		      AT_SYMLINK_NOFOLLOW | OPEN_TREE_CLONE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2454) 		      OPEN_TREE_CLOEXEC))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2455) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2456) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2457) 	if ((flags & (AT_RECURSIVE | OPEN_TREE_CLONE)) == AT_RECURSIVE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2458) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2459) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2460) 	if (flags & AT_NO_AUTOMOUNT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2461) 		lookup_flags &= ~LOOKUP_AUTOMOUNT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2462) 	if (flags & AT_SYMLINK_NOFOLLOW)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2463) 		lookup_flags &= ~LOOKUP_FOLLOW;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2464) 	if (flags & AT_EMPTY_PATH)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2465) 		lookup_flags |= LOOKUP_EMPTY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2466) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2467) 	if (detached && !may_mount())
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2468) 		return -EPERM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2469) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2470) 	fd = get_unused_fd_flags(flags & O_CLOEXEC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2471) 	if (fd < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2472) 		return fd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2473) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2474) 	error = user_path_at(dfd, filename, lookup_flags, &path);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2475) 	if (unlikely(error)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2476) 		file = ERR_PTR(error);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2477) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2478) 		if (detached)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2479) 			file = open_detached_copy(&path, flags & AT_RECURSIVE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2480) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2481) 			file = dentry_open(&path, O_PATH, current_cred());
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2482) 		path_put(&path);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2483) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2484) 	if (IS_ERR(file)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2485) 		put_unused_fd(fd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2486) 		return PTR_ERR(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2487) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2488) 	fd_install(fd, file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2489) 	return fd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2490) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2491) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2492) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2493)  * Don't allow locked mount flags to be cleared.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2494)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2495)  * No locks need to be held here while testing the various MNT_LOCK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2496)  * flags because those flags can never be cleared once they are set.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2497)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2498) static bool can_change_locked_flags(struct mount *mnt, unsigned int mnt_flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2499) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2500) 	unsigned int fl = mnt->mnt.mnt_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2501) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2502) 	if ((fl & MNT_LOCK_READONLY) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2503) 	    !(mnt_flags & MNT_READONLY))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2504) 		return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2505) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2506) 	if ((fl & MNT_LOCK_NODEV) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2507) 	    !(mnt_flags & MNT_NODEV))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2508) 		return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2509) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2510) 	if ((fl & MNT_LOCK_NOSUID) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2511) 	    !(mnt_flags & MNT_NOSUID))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2512) 		return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2513) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2514) 	if ((fl & MNT_LOCK_NOEXEC) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2515) 	    !(mnt_flags & MNT_NOEXEC))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2516) 		return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2517) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2518) 	if ((fl & MNT_LOCK_ATIME) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2519) 	    ((fl & MNT_ATIME_MASK) != (mnt_flags & MNT_ATIME_MASK)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2520) 		return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2521) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2522) 	return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2523) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2524) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2525) static int change_mount_ro_state(struct mount *mnt, unsigned int mnt_flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2526) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2527) 	bool readonly_request = (mnt_flags & MNT_READONLY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2528) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2529) 	if (readonly_request == __mnt_is_readonly(&mnt->mnt))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2530) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2531) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2532) 	if (readonly_request)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2533) 		return mnt_make_readonly(mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2534) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2535) 	return __mnt_unmake_readonly(mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2536) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2537) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2538) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2539)  * Update the user-settable attributes on a mount.  The caller must hold
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2540)  * sb->s_umount for writing.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2541)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2542) static void set_mount_attributes(struct mount *mnt, unsigned int mnt_flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2543) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2544) 	lock_mount_hash();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2545) 	mnt_flags |= mnt->mnt.mnt_flags & ~MNT_USER_SETTABLE_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2546) 	mnt->mnt.mnt_flags = mnt_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2547) 	touch_mnt_namespace(mnt->mnt_ns);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2548) 	unlock_mount_hash();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2549) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2550) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2551) static void mnt_warn_timestamp_expiry(struct path *mountpoint, struct vfsmount *mnt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2552) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2553) 	struct super_block *sb = mnt->mnt_sb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2554) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2555) 	if (!__mnt_is_readonly(mnt) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2556) 	   (ktime_get_real_seconds() + TIME_UPTIME_SEC_MAX > sb->s_time_max)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2557) 		char *buf = (char *)__get_free_page(GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2558) 		char *mntpath = buf ? d_path(mountpoint, buf, PAGE_SIZE) : ERR_PTR(-ENOMEM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2559) 		struct tm tm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2560) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2561) 		time64_to_tm(sb->s_time_max, 0, &tm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2562) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2563) 		pr_warn("%s filesystem being %s at %s supports timestamps until %04ld (0x%llx)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2564) 			sb->s_type->name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2565) 			is_mounted(mnt) ? "remounted" : "mounted",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2566) 			mntpath,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2567) 			tm.tm_year+1900, (unsigned long long)sb->s_time_max);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2568) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2569) 		free_page((unsigned long)buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2570) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2571) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2572) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2573) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2574)  * Handle reconfiguration of the mountpoint only without alteration of the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2575)  * superblock it refers to.  This is triggered by specifying MS_REMOUNT|MS_BIND
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2576)  * to mount(2).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2577)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2578) static int do_reconfigure_mnt(struct path *path, unsigned int mnt_flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2579) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2580) 	struct super_block *sb = path->mnt->mnt_sb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2581) 	struct mount *mnt = real_mount(path->mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2582) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2583) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2584) 	if (!check_mnt(mnt))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2585) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2586) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2587) 	if (path->dentry != mnt->mnt.mnt_root)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2588) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2589) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2590) 	if (!can_change_locked_flags(mnt, mnt_flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2591) 		return -EPERM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2592) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2593) 	down_write(&sb->s_umount);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2594) 	ret = change_mount_ro_state(mnt, mnt_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2595) 	if (ret == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2596) 		set_mount_attributes(mnt, mnt_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2597) 	up_write(&sb->s_umount);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2598) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2599) 	mnt_warn_timestamp_expiry(path, &mnt->mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2600) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2601) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2602) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2603) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2604) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2605)  * change filesystem flags. dir should be a physical root of filesystem.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2606)  * If you've mounted a non-root directory somewhere and want to do remount
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2607)  * on it - tough luck.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2608)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2609) static int do_remount(struct path *path, int ms_flags, int sb_flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2610) 		      int mnt_flags, void *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2611) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2612) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2613) 	struct super_block *sb = path->mnt->mnt_sb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2614) 	struct mount *mnt = real_mount(path->mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2615) 	struct fs_context *fc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2616) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2617) 	if (!check_mnt(mnt))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2618) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2619) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2620) 	if (path->dentry != path->mnt->mnt_root)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2621) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2622) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2623) 	if (!can_change_locked_flags(mnt, mnt_flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2624) 		return -EPERM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2625) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2626) 	fc = fs_context_for_reconfigure(path->dentry, sb_flags, MS_RMT_MASK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2627) 	if (IS_ERR(fc))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2628) 		return PTR_ERR(fc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2629) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2630) 	fc->oldapi = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2631) 	err = parse_monolithic_mount_data(fc, data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2632) 	if (!err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2633) 		down_write(&sb->s_umount);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2634) 		err = -EPERM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2635) 		if (ns_capable(sb->s_user_ns, CAP_SYS_ADMIN)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2636) 			err = reconfigure_super(fc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2637) 			if (!err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2638) 				set_mount_attributes(mnt, mnt_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2639) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2640) 		up_write(&sb->s_umount);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2641) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2642) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2643) 	mnt_warn_timestamp_expiry(path, &mnt->mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2644) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2645) 	put_fs_context(fc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2646) 	return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2647) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2648) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2649) static inline int tree_contains_unbindable(struct mount *mnt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2650) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2651) 	struct mount *p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2652) 	for (p = mnt; p; p = next_mnt(p, mnt)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2653) 		if (IS_MNT_UNBINDABLE(p))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2654) 			return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2655) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2656) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2657) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2658) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2659) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2660)  * Check that there aren't references to earlier/same mount namespaces in the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2661)  * specified subtree.  Such references can act as pins for mount namespaces
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2662)  * that aren't checked by the mount-cycle checking code, thereby allowing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2663)  * cycles to be made.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2664)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2665) static bool check_for_nsfs_mounts(struct mount *subtree)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2666) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2667) 	struct mount *p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2668) 	bool ret = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2669) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2670) 	lock_mount_hash();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2671) 	for (p = subtree; p; p = next_mnt(p, subtree))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2672) 		if (mnt_ns_loop(p->mnt.mnt_root))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2673) 			goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2674) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2675) 	ret = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2676) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2677) 	unlock_mount_hash();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2678) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2679) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2680) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2681) static int do_move_mount(struct path *old_path, struct path *new_path)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2682) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2683) 	struct mnt_namespace *ns;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2684) 	struct mount *p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2685) 	struct mount *old;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2686) 	struct mount *parent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2687) 	struct mountpoint *mp, *old_mp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2688) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2689) 	bool attached;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2690) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2691) 	mp = lock_mount(new_path);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2692) 	if (IS_ERR(mp))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2693) 		return PTR_ERR(mp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2694) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2695) 	old = real_mount(old_path->mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2696) 	p = real_mount(new_path->mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2697) 	parent = old->mnt_parent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2698) 	attached = mnt_has_parent(old);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2699) 	old_mp = old->mnt_mp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2700) 	ns = old->mnt_ns;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2701) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2702) 	err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2703) 	/* The mountpoint must be in our namespace. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2704) 	if (!check_mnt(p))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2705) 		goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2706) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2707) 	/* The thing moved must be mounted... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2708) 	if (!is_mounted(&old->mnt))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2709) 		goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2710) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2711) 	/* ... and either ours or the root of anon namespace */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2712) 	if (!(attached ? check_mnt(old) : is_anon_ns(ns)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2713) 		goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2714) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2715) 	if (old->mnt.mnt_flags & MNT_LOCKED)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2716) 		goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2717) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2718) 	if (old_path->dentry != old_path->mnt->mnt_root)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2719) 		goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2720) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2721) 	if (d_is_dir(new_path->dentry) !=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2722) 	    d_is_dir(old_path->dentry))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2723) 		goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2724) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2725) 	 * Don't move a mount residing in a shared parent.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2726) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2727) 	if (attached && IS_MNT_SHARED(parent))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2728) 		goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2729) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2730) 	 * Don't move a mount tree containing unbindable mounts to a destination
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2731) 	 * mount which is shared.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2732) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2733) 	if (IS_MNT_SHARED(p) && tree_contains_unbindable(old))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2734) 		goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2735) 	err = -ELOOP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2736) 	if (!check_for_nsfs_mounts(old))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2737) 		goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2738) 	for (; mnt_has_parent(p); p = p->mnt_parent)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2739) 		if (p == old)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2740) 			goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2741) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2742) 	err = attach_recursive_mnt(old, real_mount(new_path->mnt), mp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2743) 				   attached);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2744) 	if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2745) 		goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2746) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2747) 	/* if the mount is moved, it should no longer be expire
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2748) 	 * automatically */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2749) 	list_del_init(&old->mnt_expire);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2750) 	if (attached)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2751) 		put_mountpoint(old_mp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2752) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2753) 	unlock_mount(mp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2754) 	if (!err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2755) 		if (attached)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2756) 			mntput_no_expire(parent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2757) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2758) 			free_mnt_ns(ns);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2759) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2760) 	return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2761) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2762) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2763) static int do_move_mount_old(struct path *path, const char *old_name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2764) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2765) 	struct path old_path;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2766) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2767) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2768) 	if (!old_name || !*old_name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2769) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2770) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2771) 	err = kern_path(old_name, LOOKUP_FOLLOW, &old_path);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2772) 	if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2773) 		return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2774) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2775) 	err = do_move_mount(&old_path, path);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2776) 	path_put(&old_path);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2777) 	return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2778) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2779) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2780) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2781)  * add a mount into a namespace's mount tree
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2782)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2783) static int do_add_mount(struct mount *newmnt, struct mountpoint *mp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2784) 			struct path *path, int mnt_flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2785) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2786) 	struct mount *parent = real_mount(path->mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2787) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2788) 	mnt_flags &= ~MNT_INTERNAL_FLAGS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2789) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2790) 	if (unlikely(!check_mnt(parent))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2791) 		/* that's acceptable only for automounts done in private ns */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2792) 		if (!(mnt_flags & MNT_SHRINKABLE))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2793) 			return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2794) 		/* ... and for those we'd better have mountpoint still alive */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2795) 		if (!parent->mnt_ns)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2796) 			return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2797) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2798) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2799) 	/* Refuse the same filesystem on the same mount point */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2800) 	if (path->mnt->mnt_sb == newmnt->mnt.mnt_sb &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2801) 	    path->mnt->mnt_root == path->dentry)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2802) 		return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2803) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2804) 	if (d_is_symlink(newmnt->mnt.mnt_root))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2805) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2806) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2807) 	newmnt->mnt.mnt_flags = mnt_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2808) 	return graft_tree(newmnt, parent, mp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2809) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2810) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2811) static bool mount_too_revealing(const struct super_block *sb, int *new_mnt_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2812) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2813) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2814)  * Create a new mount using a superblock configuration and request it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2815)  * be added to the namespace tree.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2816)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2817) static int do_new_mount_fc(struct fs_context *fc, struct path *mountpoint,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2818) 			   unsigned int mnt_flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2819) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2820) 	struct vfsmount *mnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2821) 	struct mountpoint *mp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2822) 	struct super_block *sb = fc->root->d_sb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2823) 	int error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2824) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2825) 	error = security_sb_kern_mount(sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2826) 	if (!error && mount_too_revealing(sb, &mnt_flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2827) 		error = -EPERM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2828) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2829) 	if (unlikely(error)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2830) 		fc_drop_locked(fc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2831) 		return error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2832) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2833) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2834) 	up_write(&sb->s_umount);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2835) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2836) 	mnt = vfs_create_mount(fc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2837) 	if (IS_ERR(mnt))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2838) 		return PTR_ERR(mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2839) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2840) 	mnt_warn_timestamp_expiry(mountpoint, mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2841) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2842) 	mp = lock_mount(mountpoint);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2843) 	if (IS_ERR(mp)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2844) 		mntput(mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2845) 		return PTR_ERR(mp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2846) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2847) 	error = do_add_mount(real_mount(mnt), mp, mountpoint, mnt_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2848) 	unlock_mount(mp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2849) 	if (error < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2850) 		mntput(mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2851) 	return error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2852) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2853) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2854) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2855)  * create a new mount for userspace and request it to be added into the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2856)  * namespace's tree
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2857)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2858) static int do_new_mount(struct path *path, const char *fstype, int sb_flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2859) 			int mnt_flags, const char *name, void *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2860) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2861) 	struct file_system_type *type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2862) 	struct fs_context *fc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2863) 	const char *subtype = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2864) 	int err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2865) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2866) 	if (!fstype)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2867) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2868) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2869) 	type = get_fs_type(fstype);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2870) 	if (!type)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2871) 		return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2872) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2873) 	if (type->fs_flags & FS_HAS_SUBTYPE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2874) 		subtype = strchr(fstype, '.');
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2875) 		if (subtype) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2876) 			subtype++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2877) 			if (!*subtype) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2878) 				put_filesystem(type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2879) 				return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2880) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2881) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2882) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2883) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2884) 	fc = fs_context_for_mount(type, sb_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2885) 	put_filesystem(type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2886) 	if (IS_ERR(fc))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2887) 		return PTR_ERR(fc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2888) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2889) 	if (subtype)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2890) 		err = vfs_parse_fs_string(fc, "subtype",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2891) 					  subtype, strlen(subtype));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2892) 	if (!err && name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2893) 		err = vfs_parse_fs_string(fc, "source", name, strlen(name));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2894) 	if (!err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2895) 		err = parse_monolithic_mount_data(fc, data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2896) 	if (!err && !mount_capable(fc))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2897) 		err = -EPERM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2898) 	if (!err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2899) 		err = vfs_get_tree(fc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2900) 	if (!err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2901) 		err = do_new_mount_fc(fc, path, mnt_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2902) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2903) 	put_fs_context(fc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2904) 	return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2905) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2906) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2907) int finish_automount(struct vfsmount *m, struct path *path)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2908) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2909) 	struct dentry *dentry = path->dentry;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2910) 	struct mountpoint *mp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2911) 	struct mount *mnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2912) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2913) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2914) 	if (!m)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2915) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2916) 	if (IS_ERR(m))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2917) 		return PTR_ERR(m);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2918) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2919) 	mnt = real_mount(m);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2920) 	/* The new mount record should have at least 2 refs to prevent it being
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2921) 	 * expired before we get a chance to add it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2922) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2923) 	BUG_ON(mnt_get_count(mnt) < 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2924) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2925) 	if (m->mnt_sb == path->mnt->mnt_sb &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2926) 	    m->mnt_root == dentry) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2927) 		err = -ELOOP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2928) 		goto discard;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2929) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2930) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2931) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2932) 	 * we don't want to use lock_mount() - in this case finding something
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2933) 	 * that overmounts our mountpoint to be means "quitely drop what we've
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2934) 	 * got", not "try to mount it on top".
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2935) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2936) 	inode_lock(dentry->d_inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2937) 	namespace_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2938) 	if (unlikely(cant_mount(dentry))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2939) 		err = -ENOENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2940) 		goto discard_locked;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2941) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2942) 	rcu_read_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2943) 	if (unlikely(__lookup_mnt(path->mnt, dentry))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2944) 		rcu_read_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2945) 		err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2946) 		goto discard_locked;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2947) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2948) 	rcu_read_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2949) 	mp = get_mountpoint(dentry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2950) 	if (IS_ERR(mp)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2951) 		err = PTR_ERR(mp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2952) 		goto discard_locked;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2953) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2954) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2955) 	err = do_add_mount(mnt, mp, path, path->mnt->mnt_flags | MNT_SHRINKABLE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2956) 	unlock_mount(mp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2957) 	if (unlikely(err))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2958) 		goto discard;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2959) 	mntput(m);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2960) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2961) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2962) discard_locked:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2963) 	namespace_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2964) 	inode_unlock(dentry->d_inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2965) discard:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2966) 	/* remove m from any expiration list it may be on */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2967) 	if (!list_empty(&mnt->mnt_expire)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2968) 		namespace_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2969) 		list_del_init(&mnt->mnt_expire);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2970) 		namespace_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2971) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2972) 	mntput(m);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2973) 	mntput(m);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2974) 	return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2975) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2976) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2977) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2978)  * mnt_set_expiry - Put a mount on an expiration list
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2979)  * @mnt: The mount to list.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2980)  * @expiry_list: The list to add the mount to.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2981)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2982) void mnt_set_expiry(struct vfsmount *mnt, struct list_head *expiry_list)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2983) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2984) 	namespace_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2985) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2986) 	list_add_tail(&real_mount(mnt)->mnt_expire, expiry_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2987) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2988) 	namespace_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2989) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2990) EXPORT_SYMBOL(mnt_set_expiry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2991) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2992) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2993)  * process a list of expirable mountpoints with the intent of discarding any
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2994)  * mountpoints that aren't in use and haven't been touched since last we came
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2995)  * here
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2996)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2997) void mark_mounts_for_expiry(struct list_head *mounts)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2998) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2999) 	struct mount *mnt, *next;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3000) 	LIST_HEAD(graveyard);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3001) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3002) 	if (list_empty(mounts))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3003) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3004) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3005) 	namespace_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3006) 	lock_mount_hash();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3007) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3008) 	/* extract from the expiration list every vfsmount that matches the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3009) 	 * following criteria:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3010) 	 * - only referenced by its parent vfsmount
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3011) 	 * - still marked for expiry (marked on the last call here; marks are
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3012) 	 *   cleared by mntput())
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3013) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3014) 	list_for_each_entry_safe(mnt, next, mounts, mnt_expire) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3015) 		if (!xchg(&mnt->mnt_expiry_mark, 1) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3016) 			propagate_mount_busy(mnt, 1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3017) 			continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3018) 		list_move(&mnt->mnt_expire, &graveyard);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3019) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3020) 	while (!list_empty(&graveyard)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3021) 		mnt = list_first_entry(&graveyard, struct mount, mnt_expire);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3022) 		touch_mnt_namespace(mnt->mnt_ns);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3023) 		umount_tree(mnt, UMOUNT_PROPAGATE|UMOUNT_SYNC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3024) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3025) 	unlock_mount_hash();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3026) 	namespace_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3027) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3028) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3029) EXPORT_SYMBOL_GPL(mark_mounts_for_expiry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3030) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3031) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3032)  * Ripoff of 'select_parent()'
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3033)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3034)  * search the list of submounts for a given mountpoint, and move any
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3035)  * shrinkable submounts to the 'graveyard' list.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3036)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3037) static int select_submounts(struct mount *parent, struct list_head *graveyard)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3038) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3039) 	struct mount *this_parent = parent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3040) 	struct list_head *next;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3041) 	int found = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3042) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3043) repeat:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3044) 	next = this_parent->mnt_mounts.next;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3045) resume:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3046) 	while (next != &this_parent->mnt_mounts) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3047) 		struct list_head *tmp = next;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3048) 		struct mount *mnt = list_entry(tmp, struct mount, mnt_child);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3049) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3050) 		next = tmp->next;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3051) 		if (!(mnt->mnt.mnt_flags & MNT_SHRINKABLE))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3052) 			continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3053) 		/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3054) 		 * Descend a level if the d_mounts list is non-empty.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3055) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3056) 		if (!list_empty(&mnt->mnt_mounts)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3057) 			this_parent = mnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3058) 			goto repeat;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3059) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3060) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3061) 		if (!propagate_mount_busy(mnt, 1)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3062) 			list_move_tail(&mnt->mnt_expire, graveyard);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3063) 			found++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3064) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3065) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3066) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3067) 	 * All done at this level ... ascend and resume the search
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3068) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3069) 	if (this_parent != parent) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3070) 		next = this_parent->mnt_child.next;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3071) 		this_parent = this_parent->mnt_parent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3072) 		goto resume;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3073) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3074) 	return found;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3075) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3076) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3077) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3078)  * process a list of expirable mountpoints with the intent of discarding any
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3079)  * submounts of a specific parent mountpoint
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3080)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3081)  * mount_lock must be held for write
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3082)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3083) static void shrink_submounts(struct mount *mnt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3084) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3085) 	LIST_HEAD(graveyard);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3086) 	struct mount *m;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3087) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3088) 	/* extract submounts of 'mountpoint' from the expiration list */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3089) 	while (select_submounts(mnt, &graveyard)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3090) 		while (!list_empty(&graveyard)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3091) 			m = list_first_entry(&graveyard, struct mount,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3092) 						mnt_expire);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3093) 			touch_mnt_namespace(m->mnt_ns);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3094) 			umount_tree(m, UMOUNT_PROPAGATE|UMOUNT_SYNC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3095) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3096) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3097) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3098) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3099) static void *copy_mount_options(const void __user * data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3100) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3101) 	char *copy;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3102) 	unsigned left, offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3103) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3104) 	if (!data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3105) 		return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3106) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3107) 	copy = kmalloc(PAGE_SIZE, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3108) 	if (!copy)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3109) 		return ERR_PTR(-ENOMEM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3110) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3111) 	left = copy_from_user(copy, data, PAGE_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3112) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3113) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3114) 	 * Not all architectures have an exact copy_from_user(). Resort to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3115) 	 * byte at a time.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3116) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3117) 	offset = PAGE_SIZE - left;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3118) 	while (left) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3119) 		char c;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3120) 		if (get_user(c, (const char __user *)data + offset))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3121) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3122) 		copy[offset] = c;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3123) 		left--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3124) 		offset++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3125) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3126) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3127) 	if (left == PAGE_SIZE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3128) 		kfree(copy);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3129) 		return ERR_PTR(-EFAULT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3130) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3131) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3132) 	return copy;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3133) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3134) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3135) static char *copy_mount_string(const void __user *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3136) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3137) 	return data ? strndup_user(data, PATH_MAX) : NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3138) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3139) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3140) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3141)  * Flags is a 32-bit value that allows up to 31 non-fs dependent flags to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3142)  * be given to the mount() call (ie: read-only, no-dev, no-suid etc).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3143)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3144)  * data is a (void *) that can point to any structure up to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3145)  * PAGE_SIZE-1 bytes, which can contain arbitrary fs-dependent
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3146)  * information (or be NULL).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3147)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3148)  * Pre-0.97 versions of mount() didn't have a flags word.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3149)  * When the flags word was introduced its top half was required
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3150)  * to have the magic value 0xC0ED, and this remained so until 2.4.0-test9.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3151)  * Therefore, if this magic number is present, it carries no information
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3152)  * and must be discarded.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3153)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3154) int path_mount(const char *dev_name, struct path *path,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3155) 		const char *type_page, unsigned long flags, void *data_page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3156) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3157) 	unsigned int mnt_flags = 0, sb_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3158) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3159) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3160) 	/* Discard magic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3161) 	if ((flags & MS_MGC_MSK) == MS_MGC_VAL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3162) 		flags &= ~MS_MGC_MSK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3163) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3164) 	/* Basic sanity checks */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3165) 	if (data_page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3166) 		((char *)data_page)[PAGE_SIZE - 1] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3167) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3168) 	if (flags & MS_NOUSER)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3169) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3170) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3171) 	ret = security_sb_mount(dev_name, path, type_page, flags, data_page);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3172) 	if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3173) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3174) 	if (!may_mount())
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3175) 		return -EPERM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3176) 	if ((flags & SB_MANDLOCK) && !may_mandlock())
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3177) 		return -EPERM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3178) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3179) 	/* Default to relatime unless overriden */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3180) 	if (!(flags & MS_NOATIME))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3181) 		mnt_flags |= MNT_RELATIME;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3182) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3183) 	/* Separate the per-mountpoint flags */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3184) 	if (flags & MS_NOSUID)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3185) 		mnt_flags |= MNT_NOSUID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3186) 	if (flags & MS_NODEV)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3187) 		mnt_flags |= MNT_NODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3188) 	if (flags & MS_NOEXEC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3189) 		mnt_flags |= MNT_NOEXEC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3190) 	if (flags & MS_NOATIME)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3191) 		mnt_flags |= MNT_NOATIME;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3192) 	if (flags & MS_NODIRATIME)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3193) 		mnt_flags |= MNT_NODIRATIME;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3194) 	if (flags & MS_STRICTATIME)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3195) 		mnt_flags &= ~(MNT_RELATIME | MNT_NOATIME);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3196) 	if (flags & MS_RDONLY)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3197) 		mnt_flags |= MNT_READONLY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3198) 	if (flags & MS_NOSYMFOLLOW)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3199) 		mnt_flags |= MNT_NOSYMFOLLOW;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3200) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3201) 	/* The default atime for remount is preservation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3202) 	if ((flags & MS_REMOUNT) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3203) 	    ((flags & (MS_NOATIME | MS_NODIRATIME | MS_RELATIME |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3204) 		       MS_STRICTATIME)) == 0)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3205) 		mnt_flags &= ~MNT_ATIME_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3206) 		mnt_flags |= path->mnt->mnt_flags & MNT_ATIME_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3207) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3208) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3209) 	sb_flags = flags & (SB_RDONLY |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3210) 			    SB_SYNCHRONOUS |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3211) 			    SB_MANDLOCK |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3212) 			    SB_DIRSYNC |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3213) 			    SB_SILENT |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3214) 			    SB_POSIXACL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3215) 			    SB_LAZYTIME |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3216) 			    SB_I_VERSION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3217) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3218) 	if ((flags & (MS_REMOUNT | MS_BIND)) == (MS_REMOUNT | MS_BIND))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3219) 		return do_reconfigure_mnt(path, mnt_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3220) 	if (flags & MS_REMOUNT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3221) 		return do_remount(path, flags, sb_flags, mnt_flags, data_page);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3222) 	if (flags & MS_BIND)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3223) 		return do_loopback(path, dev_name, flags & MS_REC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3224) 	if (flags & (MS_SHARED | MS_PRIVATE | MS_SLAVE | MS_UNBINDABLE))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3225) 		return do_change_type(path, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3226) 	if (flags & MS_MOVE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3227) 		return do_move_mount_old(path, dev_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3228) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3229) 	return do_new_mount(path, type_page, sb_flags, mnt_flags, dev_name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3230) 			    data_page);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3231) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3232) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3233) long do_mount(const char *dev_name, const char __user *dir_name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3234) 		const char *type_page, unsigned long flags, void *data_page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3235) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3236) 	struct path path;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3237) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3238) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3239) 	ret = user_path_at(AT_FDCWD, dir_name, LOOKUP_FOLLOW, &path);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3240) 	if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3241) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3242) 	ret = path_mount(dev_name, &path, type_page, flags, data_page);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3243) 	path_put(&path);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3244) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3245) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3246) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3247) static struct ucounts *inc_mnt_namespaces(struct user_namespace *ns)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3248) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3249) 	return inc_ucount(ns, current_euid(), UCOUNT_MNT_NAMESPACES);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3250) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3251) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3252) static void dec_mnt_namespaces(struct ucounts *ucounts)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3253) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3254) 	dec_ucount(ucounts, UCOUNT_MNT_NAMESPACES);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3255) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3256) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3257) static void free_mnt_ns(struct mnt_namespace *ns)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3258) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3259) 	if (!is_anon_ns(ns))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3260) 		ns_free_inum(&ns->ns);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3261) 	dec_mnt_namespaces(ns->ucounts);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3262) 	put_user_ns(ns->user_ns);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3263) 	kfree(ns);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3264) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3265) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3266) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3267)  * Assign a sequence number so we can detect when we attempt to bind
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3268)  * mount a reference to an older mount namespace into the current
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3269)  * mount namespace, preventing reference counting loops.  A 64bit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3270)  * number incrementing at 10Ghz will take 12,427 years to wrap which
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3271)  * is effectively never, so we can ignore the possibility.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3272)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3273) static atomic64_t mnt_ns_seq = ATOMIC64_INIT(1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3274) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3275) static struct mnt_namespace *alloc_mnt_ns(struct user_namespace *user_ns, bool anon)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3276) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3277) 	struct mnt_namespace *new_ns;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3278) 	struct ucounts *ucounts;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3279) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3280) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3281) 	ucounts = inc_mnt_namespaces(user_ns);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3282) 	if (!ucounts)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3283) 		return ERR_PTR(-ENOSPC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3284) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3285) 	new_ns = kzalloc(sizeof(struct mnt_namespace), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3286) 	if (!new_ns) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3287) 		dec_mnt_namespaces(ucounts);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3288) 		return ERR_PTR(-ENOMEM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3289) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3290) 	if (!anon) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3291) 		ret = ns_alloc_inum(&new_ns->ns);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3292) 		if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3293) 			kfree(new_ns);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3294) 			dec_mnt_namespaces(ucounts);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3295) 			return ERR_PTR(ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3296) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3297) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3298) 	new_ns->ns.ops = &mntns_operations;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3299) 	if (!anon)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3300) 		new_ns->seq = atomic64_add_return(1, &mnt_ns_seq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3301) 	atomic_set(&new_ns->count, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3302) 	INIT_LIST_HEAD(&new_ns->list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3303) 	init_waitqueue_head(&new_ns->poll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3304) 	spin_lock_init(&new_ns->ns_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3305) 	new_ns->user_ns = get_user_ns(user_ns);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3306) 	new_ns->ucounts = ucounts;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3307) 	return new_ns;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3308) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3309) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3310) __latent_entropy
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3311) struct mnt_namespace *copy_mnt_ns(unsigned long flags, struct mnt_namespace *ns,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3312) 		struct user_namespace *user_ns, struct fs_struct *new_fs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3313) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3314) 	struct mnt_namespace *new_ns;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3315) 	struct vfsmount *rootmnt = NULL, *pwdmnt = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3316) 	struct mount *p, *q;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3317) 	struct mount *old;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3318) 	struct mount *new;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3319) 	int copy_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3320) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3321) 	BUG_ON(!ns);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3322) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3323) 	if (likely(!(flags & CLONE_NEWNS))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3324) 		get_mnt_ns(ns);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3325) 		return ns;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3326) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3327) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3328) 	old = ns->root;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3329) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3330) 	new_ns = alloc_mnt_ns(user_ns, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3331) 	if (IS_ERR(new_ns))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3332) 		return new_ns;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3333) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3334) 	namespace_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3335) 	/* First pass: copy the tree topology */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3336) 	copy_flags = CL_COPY_UNBINDABLE | CL_EXPIRE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3337) 	if (user_ns != ns->user_ns)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3338) 		copy_flags |= CL_SHARED_TO_SLAVE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3339) 	new = copy_tree(old, old->mnt.mnt_root, copy_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3340) 	if (IS_ERR(new)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3341) 		namespace_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3342) 		free_mnt_ns(new_ns);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3343) 		return ERR_CAST(new);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3344) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3345) 	if (user_ns != ns->user_ns) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3346) 		lock_mount_hash();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3347) 		lock_mnt_tree(new);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3348) 		unlock_mount_hash();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3349) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3350) 	new_ns->root = new;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3351) 	list_add_tail(&new_ns->list, &new->mnt_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3352) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3353) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3354) 	 * Second pass: switch the tsk->fs->* elements and mark new vfsmounts
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3355) 	 * as belonging to new namespace.  We have already acquired a private
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3356) 	 * fs_struct, so tsk->fs->lock is not needed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3357) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3358) 	p = old;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3359) 	q = new;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3360) 	while (p) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3361) 		q->mnt_ns = new_ns;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3362) 		new_ns->mounts++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3363) 		if (new_fs) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3364) 			if (&p->mnt == new_fs->root.mnt) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3365) 				new_fs->root.mnt = mntget(&q->mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3366) 				rootmnt = &p->mnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3367) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3368) 			if (&p->mnt == new_fs->pwd.mnt) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3369) 				new_fs->pwd.mnt = mntget(&q->mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3370) 				pwdmnt = &p->mnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3371) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3372) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3373) 		p = next_mnt(p, old);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3374) 		q = next_mnt(q, new);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3375) 		if (!q)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3376) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3377) 		while (p->mnt.mnt_root != q->mnt.mnt_root)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3378) 			p = next_mnt(p, old);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3379) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3380) 	namespace_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3381) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3382) 	if (rootmnt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3383) 		mntput(rootmnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3384) 	if (pwdmnt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3385) 		mntput(pwdmnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3386) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3387) 	return new_ns;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3388) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3389) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3390) struct dentry *mount_subtree(struct vfsmount *m, const char *name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3391) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3392) 	struct mount *mnt = real_mount(m);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3393) 	struct mnt_namespace *ns;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3394) 	struct super_block *s;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3395) 	struct path path;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3396) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3397) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3398) 	ns = alloc_mnt_ns(&init_user_ns, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3399) 	if (IS_ERR(ns)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3400) 		mntput(m);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3401) 		return ERR_CAST(ns);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3402) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3403) 	mnt->mnt_ns = ns;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3404) 	ns->root = mnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3405) 	ns->mounts++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3406) 	list_add(&mnt->mnt_list, &ns->list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3407) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3408) 	err = vfs_path_lookup(m->mnt_root, m,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3409) 			name, LOOKUP_FOLLOW|LOOKUP_AUTOMOUNT, &path);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3410) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3411) 	put_mnt_ns(ns);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3412) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3413) 	if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3414) 		return ERR_PTR(err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3415) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3416) 	/* trade a vfsmount reference for active sb one */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3417) 	s = path.mnt->mnt_sb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3418) 	atomic_inc(&s->s_active);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3419) 	mntput(path.mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3420) 	/* lock the sucker */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3421) 	down_write(&s->s_umount);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3422) 	/* ... and return the root of (sub)tree on it */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3423) 	return path.dentry;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3424) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3425) EXPORT_SYMBOL(mount_subtree);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3426) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3427) SYSCALL_DEFINE5(mount, char __user *, dev_name, char __user *, dir_name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3428) 		char __user *, type, unsigned long, flags, void __user *, data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3429) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3430) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3431) 	char *kernel_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3432) 	char *kernel_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3433) 	void *options;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3434) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3435) 	kernel_type = copy_mount_string(type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3436) 	ret = PTR_ERR(kernel_type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3437) 	if (IS_ERR(kernel_type))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3438) 		goto out_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3439) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3440) 	kernel_dev = copy_mount_string(dev_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3441) 	ret = PTR_ERR(kernel_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3442) 	if (IS_ERR(kernel_dev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3443) 		goto out_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3444) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3445) 	options = copy_mount_options(data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3446) 	ret = PTR_ERR(options);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3447) 	if (IS_ERR(options))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3448) 		goto out_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3449) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3450) 	ret = do_mount(kernel_dev, dir_name, kernel_type, flags, options);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3451) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3452) 	kfree(options);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3453) out_data:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3454) 	kfree(kernel_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3455) out_dev:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3456) 	kfree(kernel_type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3457) out_type:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3458) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3459) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3460) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3461) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3462)  * Create a kernel mount representation for a new, prepared superblock
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3463)  * (specified by fs_fd) and attach to an open_tree-like file descriptor.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3464)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3465) SYSCALL_DEFINE3(fsmount, int, fs_fd, unsigned int, flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3466) 		unsigned int, attr_flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3467) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3468) 	struct mnt_namespace *ns;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3469) 	struct fs_context *fc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3470) 	struct file *file;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3471) 	struct path newmount;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3472) 	struct mount *mnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3473) 	struct fd f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3474) 	unsigned int mnt_flags = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3475) 	long ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3476) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3477) 	if (!may_mount())
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3478) 		return -EPERM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3479) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3480) 	if ((flags & ~(FSMOUNT_CLOEXEC)) != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3481) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3482) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3483) 	if (attr_flags & ~(MOUNT_ATTR_RDONLY |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3484) 			   MOUNT_ATTR_NOSUID |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3485) 			   MOUNT_ATTR_NODEV |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3486) 			   MOUNT_ATTR_NOEXEC |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3487) 			   MOUNT_ATTR__ATIME |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3488) 			   MOUNT_ATTR_NODIRATIME))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3489) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3490) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3491) 	if (attr_flags & MOUNT_ATTR_RDONLY)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3492) 		mnt_flags |= MNT_READONLY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3493) 	if (attr_flags & MOUNT_ATTR_NOSUID)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3494) 		mnt_flags |= MNT_NOSUID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3495) 	if (attr_flags & MOUNT_ATTR_NODEV)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3496) 		mnt_flags |= MNT_NODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3497) 	if (attr_flags & MOUNT_ATTR_NOEXEC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3498) 		mnt_flags |= MNT_NOEXEC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3499) 	if (attr_flags & MOUNT_ATTR_NODIRATIME)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3500) 		mnt_flags |= MNT_NODIRATIME;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3501) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3502) 	switch (attr_flags & MOUNT_ATTR__ATIME) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3503) 	case MOUNT_ATTR_STRICTATIME:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3504) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3505) 	case MOUNT_ATTR_NOATIME:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3506) 		mnt_flags |= MNT_NOATIME;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3507) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3508) 	case MOUNT_ATTR_RELATIME:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3509) 		mnt_flags |= MNT_RELATIME;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3510) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3511) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3512) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3513) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3514) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3515) 	f = fdget(fs_fd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3516) 	if (!f.file)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3517) 		return -EBADF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3518) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3519) 	ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3520) 	if (f.file->f_op != &fscontext_fops)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3521) 		goto err_fsfd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3522) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3523) 	fc = f.file->private_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3524) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3525) 	ret = mutex_lock_interruptible(&fc->uapi_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3526) 	if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3527) 		goto err_fsfd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3528) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3529) 	/* There must be a valid superblock or we can't mount it */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3530) 	ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3531) 	if (!fc->root)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3532) 		goto err_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3533) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3534) 	ret = -EPERM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3535) 	if (mount_too_revealing(fc->root->d_sb, &mnt_flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3536) 		pr_warn("VFS: Mount too revealing\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3537) 		goto err_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3538) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3539) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3540) 	ret = -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3541) 	if (fc->phase != FS_CONTEXT_AWAITING_MOUNT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3542) 		goto err_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3543) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3544) 	ret = -EPERM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3545) 	if ((fc->sb_flags & SB_MANDLOCK) && !may_mandlock())
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3546) 		goto err_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3547) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3548) 	newmount.mnt = vfs_create_mount(fc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3549) 	if (IS_ERR(newmount.mnt)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3550) 		ret = PTR_ERR(newmount.mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3551) 		goto err_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3552) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3553) 	newmount.dentry = dget(fc->root);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3554) 	newmount.mnt->mnt_flags = mnt_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3555) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3556) 	/* We've done the mount bit - now move the file context into more or
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3557) 	 * less the same state as if we'd done an fspick().  We don't want to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3558) 	 * do any memory allocation or anything like that at this point as we
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3559) 	 * don't want to have to handle any errors incurred.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3560) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3561) 	vfs_clean_context(fc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3562) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3563) 	ns = alloc_mnt_ns(current->nsproxy->mnt_ns->user_ns, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3564) 	if (IS_ERR(ns)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3565) 		ret = PTR_ERR(ns);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3566) 		goto err_path;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3567) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3568) 	mnt = real_mount(newmount.mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3569) 	mnt->mnt_ns = ns;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3570) 	ns->root = mnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3571) 	ns->mounts = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3572) 	list_add(&mnt->mnt_list, &ns->list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3573) 	mntget(newmount.mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3574) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3575) 	/* Attach to an apparent O_PATH fd with a note that we need to unmount
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3576) 	 * it, not just simply put it.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3577) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3578) 	file = dentry_open(&newmount, O_PATH, fc->cred);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3579) 	if (IS_ERR(file)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3580) 		dissolve_on_fput(newmount.mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3581) 		ret = PTR_ERR(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3582) 		goto err_path;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3583) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3584) 	file->f_mode |= FMODE_NEED_UNMOUNT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3585) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3586) 	ret = get_unused_fd_flags((flags & FSMOUNT_CLOEXEC) ? O_CLOEXEC : 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3587) 	if (ret >= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3588) 		fd_install(ret, file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3589) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3590) 		fput(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3591) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3592) err_path:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3593) 	path_put(&newmount);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3594) err_unlock:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3595) 	mutex_unlock(&fc->uapi_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3596) err_fsfd:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3597) 	fdput(f);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3598) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3599) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3600) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3601) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3602)  * Move a mount from one place to another.  In combination with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3603)  * fsopen()/fsmount() this is used to install a new mount and in combination
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3604)  * with open_tree(OPEN_TREE_CLONE [| AT_RECURSIVE]) it can be used to copy
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3605)  * a mount subtree.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3606)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3607)  * Note the flags value is a combination of MOVE_MOUNT_* flags.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3608)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3609) SYSCALL_DEFINE5(move_mount,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3610) 		int, from_dfd, const char __user *, from_pathname,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3611) 		int, to_dfd, const char __user *, to_pathname,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3612) 		unsigned int, flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3613) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3614) 	struct path from_path, to_path;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3615) 	unsigned int lflags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3616) 	int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3617) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3618) 	if (!may_mount())
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3619) 		return -EPERM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3620) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3621) 	if (flags & ~MOVE_MOUNT__MASK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3622) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3623) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3624) 	/* If someone gives a pathname, they aren't permitted to move
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3625) 	 * from an fd that requires unmount as we can't get at the flag
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3626) 	 * to clear it afterwards.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3627) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3628) 	lflags = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3629) 	if (flags & MOVE_MOUNT_F_SYMLINKS)	lflags |= LOOKUP_FOLLOW;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3630) 	if (flags & MOVE_MOUNT_F_AUTOMOUNTS)	lflags |= LOOKUP_AUTOMOUNT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3631) 	if (flags & MOVE_MOUNT_F_EMPTY_PATH)	lflags |= LOOKUP_EMPTY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3632) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3633) 	ret = user_path_at(from_dfd, from_pathname, lflags, &from_path);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3634) 	if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3635) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3636) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3637) 	lflags = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3638) 	if (flags & MOVE_MOUNT_T_SYMLINKS)	lflags |= LOOKUP_FOLLOW;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3639) 	if (flags & MOVE_MOUNT_T_AUTOMOUNTS)	lflags |= LOOKUP_AUTOMOUNT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3640) 	if (flags & MOVE_MOUNT_T_EMPTY_PATH)	lflags |= LOOKUP_EMPTY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3641) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3642) 	ret = user_path_at(to_dfd, to_pathname, lflags, &to_path);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3643) 	if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3644) 		goto out_from;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3645) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3646) 	ret = security_move_mount(&from_path, &to_path);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3647) 	if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3648) 		goto out_to;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3649) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3650) 	ret = do_move_mount(&from_path, &to_path);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3651) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3652) out_to:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3653) 	path_put(&to_path);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3654) out_from:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3655) 	path_put(&from_path);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3656) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3657) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3658) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3659) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3660)  * Return true if path is reachable from root
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3661)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3662)  * namespace_sem or mount_lock is held
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3663)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3664) bool is_path_reachable(struct mount *mnt, struct dentry *dentry,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3665) 			 const struct path *root)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3666) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3667) 	while (&mnt->mnt != root->mnt && mnt_has_parent(mnt)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3668) 		dentry = mnt->mnt_mountpoint;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3669) 		mnt = mnt->mnt_parent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3670) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3671) 	return &mnt->mnt == root->mnt && is_subdir(dentry, root->dentry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3672) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3673) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3674) bool path_is_under(const struct path *path1, const struct path *path2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3675) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3676) 	bool res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3677) 	read_seqlock_excl(&mount_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3678) 	res = is_path_reachable(real_mount(path1->mnt), path1->dentry, path2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3679) 	read_sequnlock_excl(&mount_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3680) 	return res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3681) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3682) EXPORT_SYMBOL(path_is_under);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3683) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3684) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3685)  * pivot_root Semantics:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3686)  * Moves the root file system of the current process to the directory put_old,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3687)  * makes new_root as the new root file system of the current process, and sets
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3688)  * root/cwd of all processes which had them on the current root to new_root.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3689)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3690)  * Restrictions:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3691)  * The new_root and put_old must be directories, and  must not be on the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3692)  * same file  system as the current process root. The put_old  must  be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3693)  * underneath new_root,  i.e. adding a non-zero number of /.. to the string
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3694)  * pointed to by put_old must yield the same directory as new_root. No other
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3695)  * file system may be mounted on put_old. After all, new_root is a mountpoint.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3696)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3697)  * Also, the current root cannot be on the 'rootfs' (initial ramfs) filesystem.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3698)  * See Documentation/filesystems/ramfs-rootfs-initramfs.rst for alternatives
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3699)  * in this situation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3700)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3701)  * Notes:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3702)  *  - we don't move root/cwd if they are not at the root (reason: if something
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3703)  *    cared enough to change them, it's probably wrong to force them elsewhere)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3704)  *  - it's okay to pick a root that isn't the root of a file system, e.g.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3705)  *    /nfs/my_root where /nfs is the mount point. It must be a mountpoint,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3706)  *    though, so you may need to say mount --bind /nfs/my_root /nfs/my_root
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3707)  *    first.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3708)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3709) SYSCALL_DEFINE2(pivot_root, const char __user *, new_root,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3710) 		const char __user *, put_old)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3711) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3712) 	struct path new, old, root;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3713) 	struct mount *new_mnt, *root_mnt, *old_mnt, *root_parent, *ex_parent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3714) 	struct mountpoint *old_mp, *root_mp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3715) 	int error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3716) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3717) 	if (!may_mount())
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3718) 		return -EPERM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3719) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3720) 	error = user_path_at(AT_FDCWD, new_root,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3721) 			     LOOKUP_FOLLOW | LOOKUP_DIRECTORY, &new);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3722) 	if (error)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3723) 		goto out0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3724) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3725) 	error = user_path_at(AT_FDCWD, put_old,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3726) 			     LOOKUP_FOLLOW | LOOKUP_DIRECTORY, &old);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3727) 	if (error)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3728) 		goto out1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3729) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3730) 	error = security_sb_pivotroot(&old, &new);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3731) 	if (error)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3732) 		goto out2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3733) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3734) 	get_fs_root(current->fs, &root);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3735) 	old_mp = lock_mount(&old);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3736) 	error = PTR_ERR(old_mp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3737) 	if (IS_ERR(old_mp))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3738) 		goto out3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3739) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3740) 	error = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3741) 	new_mnt = real_mount(new.mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3742) 	root_mnt = real_mount(root.mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3743) 	old_mnt = real_mount(old.mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3744) 	ex_parent = new_mnt->mnt_parent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3745) 	root_parent = root_mnt->mnt_parent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3746) 	if (IS_MNT_SHARED(old_mnt) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3747) 		IS_MNT_SHARED(ex_parent) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3748) 		IS_MNT_SHARED(root_parent))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3749) 		goto out4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3750) 	if (!check_mnt(root_mnt) || !check_mnt(new_mnt))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3751) 		goto out4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3752) 	if (new_mnt->mnt.mnt_flags & MNT_LOCKED)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3753) 		goto out4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3754) 	error = -ENOENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3755) 	if (d_unlinked(new.dentry))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3756) 		goto out4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3757) 	error = -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3758) 	if (new_mnt == root_mnt || old_mnt == root_mnt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3759) 		goto out4; /* loop, on the same file system  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3760) 	error = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3761) 	if (root.mnt->mnt_root != root.dentry)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3762) 		goto out4; /* not a mountpoint */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3763) 	if (!mnt_has_parent(root_mnt))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3764) 		goto out4; /* not attached */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3765) 	if (new.mnt->mnt_root != new.dentry)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3766) 		goto out4; /* not a mountpoint */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3767) 	if (!mnt_has_parent(new_mnt))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3768) 		goto out4; /* not attached */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3769) 	/* make sure we can reach put_old from new_root */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3770) 	if (!is_path_reachable(old_mnt, old.dentry, &new))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3771) 		goto out4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3772) 	/* make certain new is below the root */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3773) 	if (!is_path_reachable(new_mnt, new.dentry, &root))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3774) 		goto out4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3775) 	lock_mount_hash();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3776) 	umount_mnt(new_mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3777) 	root_mp = unhash_mnt(root_mnt);  /* we'll need its mountpoint */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3778) 	if (root_mnt->mnt.mnt_flags & MNT_LOCKED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3779) 		new_mnt->mnt.mnt_flags |= MNT_LOCKED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3780) 		root_mnt->mnt.mnt_flags &= ~MNT_LOCKED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3781) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3782) 	/* mount old root on put_old */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3783) 	attach_mnt(root_mnt, old_mnt, old_mp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3784) 	/* mount new_root on / */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3785) 	attach_mnt(new_mnt, root_parent, root_mp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3786) 	mnt_add_count(root_parent, -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3787) 	touch_mnt_namespace(current->nsproxy->mnt_ns);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3788) 	/* A moved mount should not expire automatically */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3789) 	list_del_init(&new_mnt->mnt_expire);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3790) 	put_mountpoint(root_mp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3791) 	unlock_mount_hash();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3792) 	chroot_fs_refs(&root, &new);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3793) 	error = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3794) out4:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3795) 	unlock_mount(old_mp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3796) 	if (!error)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3797) 		mntput_no_expire(ex_parent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3798) out3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3799) 	path_put(&root);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3800) out2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3801) 	path_put(&old);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3802) out1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3803) 	path_put(&new);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3804) out0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3805) 	return error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3806) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3807) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3808) static void __init init_mount_tree(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3809) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3810) 	struct vfsmount *mnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3811) 	struct mount *m;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3812) 	struct mnt_namespace *ns;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3813) 	struct path root;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3814) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3815) 	mnt = vfs_kern_mount(&rootfs_fs_type, 0, "rootfs", NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3816) 	if (IS_ERR(mnt))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3817) 		panic("Can't create rootfs");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3818) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3819) 	ns = alloc_mnt_ns(&init_user_ns, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3820) 	if (IS_ERR(ns))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3821) 		panic("Can't allocate initial namespace");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3822) 	m = real_mount(mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3823) 	m->mnt_ns = ns;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3824) 	ns->root = m;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3825) 	ns->mounts = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3826) 	list_add(&m->mnt_list, &ns->list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3827) 	init_task.nsproxy->mnt_ns = ns;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3828) 	get_mnt_ns(ns);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3829) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3830) 	root.mnt = mnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3831) 	root.dentry = mnt->mnt_root;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3832) 	mnt->mnt_flags |= MNT_LOCKED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3833) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3834) 	set_fs_pwd(current->fs, &root);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3835) 	set_fs_root(current->fs, &root);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3836) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3837) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3838) void __init mnt_init(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3839) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3840) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3841) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3842) 	mnt_cache = kmem_cache_create("mnt_cache", sizeof(struct mount),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3843) 			0, SLAB_HWCACHE_ALIGN | SLAB_PANIC, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3844) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3845) 	mount_hashtable = alloc_large_system_hash("Mount-cache",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3846) 				sizeof(struct hlist_head),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3847) 				mhash_entries, 19,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3848) 				HASH_ZERO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3849) 				&m_hash_shift, &m_hash_mask, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3850) 	mountpoint_hashtable = alloc_large_system_hash("Mountpoint-cache",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3851) 				sizeof(struct hlist_head),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3852) 				mphash_entries, 19,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3853) 				HASH_ZERO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3854) 				&mp_hash_shift, &mp_hash_mask, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3855) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3856) 	if (!mount_hashtable || !mountpoint_hashtable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3857) 		panic("Failed to allocate mount hash table\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3858) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3859) 	kernfs_init();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3860) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3861) 	err = sysfs_init();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3862) 	if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3863) 		printk(KERN_WARNING "%s: sysfs_init error: %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3864) 			__func__, err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3865) 	fs_kobj = kobject_create_and_add("fs", NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3866) 	if (!fs_kobj)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3867) 		printk(KERN_WARNING "%s: kobj create error\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3868) 	shmem_init();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3869) 	init_rootfs();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3870) 	init_mount_tree();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3871) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3872) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3873) void put_mnt_ns(struct mnt_namespace *ns)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3874) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3875) 	if (!atomic_dec_and_test(&ns->count))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3876) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3877) 	drop_collected_mounts(&ns->root->mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3878) 	free_mnt_ns(ns);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3879) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3880) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3881) struct vfsmount *kern_mount(struct file_system_type *type)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3882) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3883) 	struct vfsmount *mnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3884) 	mnt = vfs_kern_mount(type, SB_KERNMOUNT, type->name, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3885) 	if (!IS_ERR(mnt)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3886) 		/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3887) 		 * it is a longterm mount, don't release mnt until
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3888) 		 * we unmount before file sys is unregistered
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3889) 		*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3890) 		real_mount(mnt)->mnt_ns = MNT_NS_INTERNAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3891) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3892) 	return mnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3893) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3894) EXPORT_SYMBOL_GPL(kern_mount);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3895) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3896) void kern_unmount(struct vfsmount *mnt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3897) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3898) 	/* release long term mount so mount point can be released */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3899) 	if (!IS_ERR_OR_NULL(mnt)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3900) 		real_mount(mnt)->mnt_ns = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3901) 		synchronize_rcu();	/* yecchhh... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3902) 		mntput(mnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3903) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3904) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3905) EXPORT_SYMBOL(kern_unmount);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3906) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3907) void kern_unmount_array(struct vfsmount *mnt[], unsigned int num)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3908) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3909) 	unsigned int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3910) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3911) 	for (i = 0; i < num; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3912) 		if (mnt[i])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3913) 			real_mount(mnt[i])->mnt_ns = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3914) 	synchronize_rcu_expedited();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3915) 	for (i = 0; i < num; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3916) 		mntput(mnt[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3917) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3918) EXPORT_SYMBOL(kern_unmount_array);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3919) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3920) bool our_mnt(struct vfsmount *mnt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3921) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3922) 	return check_mnt(real_mount(mnt));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3923) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3924) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3925) bool current_chrooted(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3926) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3927) 	/* Does the current process have a non-standard root */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3928) 	struct path ns_root;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3929) 	struct path fs_root;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3930) 	bool chrooted;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3931) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3932) 	/* Find the namespace root */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3933) 	ns_root.mnt = &current->nsproxy->mnt_ns->root->mnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3934) 	ns_root.dentry = ns_root.mnt->mnt_root;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3935) 	path_get(&ns_root);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3936) 	while (d_mountpoint(ns_root.dentry) && follow_down_one(&ns_root))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3937) 		;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3938) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3939) 	get_fs_root(current->fs, &fs_root);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3940) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3941) 	chrooted = !path_equal(&fs_root, &ns_root);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3942) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3943) 	path_put(&fs_root);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3944) 	path_put(&ns_root);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3945) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3946) 	return chrooted;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3947) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3948) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3949) static bool mnt_already_visible(struct mnt_namespace *ns,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3950) 				const struct super_block *sb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3951) 				int *new_mnt_flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3952) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3953) 	int new_flags = *new_mnt_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3954) 	struct mount *mnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3955) 	bool visible = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3956) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3957) 	down_read(&namespace_sem);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3958) 	lock_ns_list(ns);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3959) 	list_for_each_entry(mnt, &ns->list, mnt_list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3960) 		struct mount *child;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3961) 		int mnt_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3962) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3963) 		if (mnt_is_cursor(mnt))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3964) 			continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3965) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3966) 		if (mnt->mnt.mnt_sb->s_type != sb->s_type)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3967) 			continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3968) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3969) 		/* This mount is not fully visible if it's root directory
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3970) 		 * is not the root directory of the filesystem.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3971) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3972) 		if (mnt->mnt.mnt_root != mnt->mnt.mnt_sb->s_root)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3973) 			continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3974) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3975) 		/* A local view of the mount flags */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3976) 		mnt_flags = mnt->mnt.mnt_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3977) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3978) 		/* Don't miss readonly hidden in the superblock flags */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3979) 		if (sb_rdonly(mnt->mnt.mnt_sb))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3980) 			mnt_flags |= MNT_LOCK_READONLY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3981) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3982) 		/* Verify the mount flags are equal to or more permissive
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3983) 		 * than the proposed new mount.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3984) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3985) 		if ((mnt_flags & MNT_LOCK_READONLY) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3986) 		    !(new_flags & MNT_READONLY))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3987) 			continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3988) 		if ((mnt_flags & MNT_LOCK_ATIME) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3989) 		    ((mnt_flags & MNT_ATIME_MASK) != (new_flags & MNT_ATIME_MASK)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3990) 			continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3991) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3992) 		/* This mount is not fully visible if there are any
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3993) 		 * locked child mounts that cover anything except for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3994) 		 * empty directories.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3995) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3996) 		list_for_each_entry(child, &mnt->mnt_mounts, mnt_child) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3997) 			struct inode *inode = child->mnt_mountpoint->d_inode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3998) 			/* Only worry about locked mounts */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3999) 			if (!(child->mnt.mnt_flags & MNT_LOCKED))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4000) 				continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4001) 			/* Is the directory permanetly empty? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4002) 			if (!is_empty_dir_inode(inode))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4003) 				goto next;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4004) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4005) 		/* Preserve the locked attributes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4006) 		*new_mnt_flags |= mnt_flags & (MNT_LOCK_READONLY | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4007) 					       MNT_LOCK_ATIME);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4008) 		visible = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4009) 		goto found;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4010) 	next:	;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4011) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4012) found:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4013) 	unlock_ns_list(ns);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4014) 	up_read(&namespace_sem);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4015) 	return visible;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4016) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4017) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4018) static bool mount_too_revealing(const struct super_block *sb, int *new_mnt_flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4019) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4020) 	const unsigned long required_iflags = SB_I_NOEXEC | SB_I_NODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4021) 	struct mnt_namespace *ns = current->nsproxy->mnt_ns;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4022) 	unsigned long s_iflags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4023) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4024) 	if (ns->user_ns == &init_user_ns)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4025) 		return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4026) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4027) 	/* Can this filesystem be too revealing? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4028) 	s_iflags = sb->s_iflags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4029) 	if (!(s_iflags & SB_I_USERNS_VISIBLE))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4030) 		return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4031) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4032) 	if ((s_iflags & required_iflags) != required_iflags) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4033) 		WARN_ONCE(1, "Expected s_iflags to contain 0x%lx\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4034) 			  required_iflags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4035) 		return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4036) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4037) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4038) 	return !mnt_already_visible(ns, sb, new_mnt_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4039) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4040) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4041) bool mnt_may_suid(struct vfsmount *mnt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4042) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4043) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4044) 	 * Foreign mounts (accessed via fchdir or through /proc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4045) 	 * symlinks) are always treated as if they are nosuid.  This
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4046) 	 * prevents namespaces from trusting potentially unsafe
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4047) 	 * suid/sgid bits, file caps, or security labels that originate
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4048) 	 * in other namespaces.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4049) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4050) 	return !(mnt->mnt_flags & MNT_NOSUID) && check_mnt(real_mount(mnt)) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4051) 	       current_in_userns(mnt->mnt_sb->s_user_ns);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4052) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4053) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4054) static struct ns_common *mntns_get(struct task_struct *task)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4055) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4056) 	struct ns_common *ns = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4057) 	struct nsproxy *nsproxy;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4058) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4059) 	task_lock(task);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4060) 	nsproxy = task->nsproxy;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4061) 	if (nsproxy) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4062) 		ns = &nsproxy->mnt_ns->ns;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4063) 		get_mnt_ns(to_mnt_ns(ns));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4064) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4065) 	task_unlock(task);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4066) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4067) 	return ns;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4068) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4069) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4070) static void mntns_put(struct ns_common *ns)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4071) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4072) 	put_mnt_ns(to_mnt_ns(ns));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4073) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4074) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4075) static int mntns_install(struct nsset *nsset, struct ns_common *ns)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4076) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4077) 	struct nsproxy *nsproxy = nsset->nsproxy;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4078) 	struct fs_struct *fs = nsset->fs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4079) 	struct mnt_namespace *mnt_ns = to_mnt_ns(ns), *old_mnt_ns;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4080) 	struct user_namespace *user_ns = nsset->cred->user_ns;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4081) 	struct path root;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4082) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4083) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4084) 	if (!ns_capable(mnt_ns->user_ns, CAP_SYS_ADMIN) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4085) 	    !ns_capable(user_ns, CAP_SYS_CHROOT) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4086) 	    !ns_capable(user_ns, CAP_SYS_ADMIN))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4087) 		return -EPERM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4088) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4089) 	if (is_anon_ns(mnt_ns))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4090) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4091) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4092) 	if (fs->users != 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4093) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4094) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4095) 	get_mnt_ns(mnt_ns);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4096) 	old_mnt_ns = nsproxy->mnt_ns;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4097) 	nsproxy->mnt_ns = mnt_ns;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4098) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4099) 	/* Find the root */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4100) 	err = vfs_path_lookup(mnt_ns->root->mnt.mnt_root, &mnt_ns->root->mnt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4101) 				"/", LOOKUP_DOWN, &root);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4102) 	if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4103) 		/* revert to old namespace */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4104) 		nsproxy->mnt_ns = old_mnt_ns;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4105) 		put_mnt_ns(mnt_ns);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4106) 		return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4107) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4108) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4109) 	put_mnt_ns(old_mnt_ns);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4110) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4111) 	/* Update the pwd and root */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4112) 	set_fs_pwd(fs, &root);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4113) 	set_fs_root(fs, &root);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4114) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4115) 	path_put(&root);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4116) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4117) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4118) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4119) static struct user_namespace *mntns_owner(struct ns_common *ns)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4120) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4121) 	return to_mnt_ns(ns)->user_ns;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4122) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4123) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4124) const struct proc_ns_operations mntns_operations = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4125) 	.name		= "mnt",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4126) 	.type		= CLONE_NEWNS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4127) 	.get		= mntns_get,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4128) 	.put		= mntns_put,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4129) 	.install	= mntns_install,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4130) 	.owner		= mntns_owner,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4131) };