162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci *  linux/fs/super.c
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci *  Copyright (C) 1991, 1992  Linus Torvalds
662306a36Sopenharmony_ci *
762306a36Sopenharmony_ci *  super.c contains code to handle: - mount structures
862306a36Sopenharmony_ci *                                   - super-block tables
962306a36Sopenharmony_ci *                                   - filesystem drivers list
1062306a36Sopenharmony_ci *                                   - mount system call
1162306a36Sopenharmony_ci *                                   - umount system call
1262306a36Sopenharmony_ci *                                   - ustat system call
1362306a36Sopenharmony_ci *
1462306a36Sopenharmony_ci * GK 2/5/95  -  Changed to support mounting the root fs via NFS
1562306a36Sopenharmony_ci *
1662306a36Sopenharmony_ci *  Added kerneld support: Jacques Gelinas and Bjorn Ekwall
1762306a36Sopenharmony_ci *  Added change_root: Werner Almesberger & Hans Lermen, Feb '96
1862306a36Sopenharmony_ci *  Added options to /proc/mounts:
1962306a36Sopenharmony_ci *    Torbjörn Lindh (torbjorn.lindh@gopta.se), April 14, 1996.
2062306a36Sopenharmony_ci *  Added devfs support: Richard Gooch <rgooch@atnf.csiro.au>, 13-JAN-1998
2162306a36Sopenharmony_ci *  Heavily rewritten for 'one fs - one tree' dcache architecture. AV, Mar 2000
2262306a36Sopenharmony_ci */
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci#include <linux/export.h>
2562306a36Sopenharmony_ci#include <linux/slab.h>
2662306a36Sopenharmony_ci#include <linux/blkdev.h>
2762306a36Sopenharmony_ci#include <linux/mount.h>
2862306a36Sopenharmony_ci#include <linux/security.h>
2962306a36Sopenharmony_ci#include <linux/writeback.h>		/* for the emergency remount stuff */
3062306a36Sopenharmony_ci#include <linux/idr.h>
3162306a36Sopenharmony_ci#include <linux/mutex.h>
3262306a36Sopenharmony_ci#include <linux/backing-dev.h>
3362306a36Sopenharmony_ci#include <linux/rculist_bl.h>
3462306a36Sopenharmony_ci#include <linux/fscrypt.h>
3562306a36Sopenharmony_ci#include <linux/fsnotify.h>
3662306a36Sopenharmony_ci#include <linux/lockdep.h>
3762306a36Sopenharmony_ci#include <linux/user_namespace.h>
3862306a36Sopenharmony_ci#include <linux/fs_context.h>
3962306a36Sopenharmony_ci#include <uapi/linux/mount.h>
4062306a36Sopenharmony_ci#include "internal.h"
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_cistatic int thaw_super_locked(struct super_block *sb, enum freeze_holder who);
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_cistatic LIST_HEAD(super_blocks);
4562306a36Sopenharmony_cistatic DEFINE_SPINLOCK(sb_lock);
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_cistatic char *sb_writers_name[SB_FREEZE_LEVELS] = {
4862306a36Sopenharmony_ci	"sb_writers",
4962306a36Sopenharmony_ci	"sb_pagefaults",
5062306a36Sopenharmony_ci	"sb_internal",
5162306a36Sopenharmony_ci};
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_cistatic inline void __super_lock(struct super_block *sb, bool excl)
5462306a36Sopenharmony_ci{
5562306a36Sopenharmony_ci	if (excl)
5662306a36Sopenharmony_ci		down_write(&sb->s_umount);
5762306a36Sopenharmony_ci	else
5862306a36Sopenharmony_ci		down_read(&sb->s_umount);
5962306a36Sopenharmony_ci}
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_cistatic inline void super_unlock(struct super_block *sb, bool excl)
6262306a36Sopenharmony_ci{
6362306a36Sopenharmony_ci	if (excl)
6462306a36Sopenharmony_ci		up_write(&sb->s_umount);
6562306a36Sopenharmony_ci	else
6662306a36Sopenharmony_ci		up_read(&sb->s_umount);
6762306a36Sopenharmony_ci}
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_cistatic inline void __super_lock_excl(struct super_block *sb)
7062306a36Sopenharmony_ci{
7162306a36Sopenharmony_ci	__super_lock(sb, true);
7262306a36Sopenharmony_ci}
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_cistatic inline void super_unlock_excl(struct super_block *sb)
7562306a36Sopenharmony_ci{
7662306a36Sopenharmony_ci	super_unlock(sb, true);
7762306a36Sopenharmony_ci}
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_cistatic inline void super_unlock_shared(struct super_block *sb)
8062306a36Sopenharmony_ci{
8162306a36Sopenharmony_ci	super_unlock(sb, false);
8262306a36Sopenharmony_ci}
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_cistatic inline bool wait_born(struct super_block *sb)
8562306a36Sopenharmony_ci{
8662306a36Sopenharmony_ci	unsigned int flags;
8762306a36Sopenharmony_ci
8862306a36Sopenharmony_ci	/*
8962306a36Sopenharmony_ci	 * Pairs with smp_store_release() in super_wake() and ensures
9062306a36Sopenharmony_ci	 * that we see SB_BORN or SB_DYING after we're woken.
9162306a36Sopenharmony_ci	 */
9262306a36Sopenharmony_ci	flags = smp_load_acquire(&sb->s_flags);
9362306a36Sopenharmony_ci	return flags & (SB_BORN | SB_DYING);
9462306a36Sopenharmony_ci}
9562306a36Sopenharmony_ci
9662306a36Sopenharmony_ci/**
9762306a36Sopenharmony_ci * super_lock - wait for superblock to become ready and lock it
9862306a36Sopenharmony_ci * @sb: superblock to wait for
9962306a36Sopenharmony_ci * @excl: whether exclusive access is required
10062306a36Sopenharmony_ci *
10162306a36Sopenharmony_ci * If the superblock has neither passed through vfs_get_tree() or
10262306a36Sopenharmony_ci * generic_shutdown_super() yet wait for it to happen. Either superblock
10362306a36Sopenharmony_ci * creation will succeed and SB_BORN is set by vfs_get_tree() or we're
10462306a36Sopenharmony_ci * woken and we'll see SB_DYING.
10562306a36Sopenharmony_ci *
10662306a36Sopenharmony_ci * The caller must have acquired a temporary reference on @sb->s_count.
10762306a36Sopenharmony_ci *
10862306a36Sopenharmony_ci * Return: This returns true if SB_BORN was set, false if SB_DYING was
10962306a36Sopenharmony_ci *         set. The function acquires s_umount and returns with it held.
11062306a36Sopenharmony_ci */
11162306a36Sopenharmony_cistatic __must_check bool super_lock(struct super_block *sb, bool excl)
11262306a36Sopenharmony_ci{
11362306a36Sopenharmony_ci
11462306a36Sopenharmony_ci	lockdep_assert_not_held(&sb->s_umount);
11562306a36Sopenharmony_ci
11662306a36Sopenharmony_cirelock:
11762306a36Sopenharmony_ci	__super_lock(sb, excl);
11862306a36Sopenharmony_ci
11962306a36Sopenharmony_ci	/*
12062306a36Sopenharmony_ci	 * Has gone through generic_shutdown_super() in the meantime.
12162306a36Sopenharmony_ci	 * @sb->s_root is NULL and @sb->s_active is 0. No one needs to
12262306a36Sopenharmony_ci	 * grab a reference to this. Tell them so.
12362306a36Sopenharmony_ci	 */
12462306a36Sopenharmony_ci	if (sb->s_flags & SB_DYING)
12562306a36Sopenharmony_ci		return false;
12662306a36Sopenharmony_ci
12762306a36Sopenharmony_ci	/* Has called ->get_tree() successfully. */
12862306a36Sopenharmony_ci	if (sb->s_flags & SB_BORN)
12962306a36Sopenharmony_ci		return true;
13062306a36Sopenharmony_ci
13162306a36Sopenharmony_ci	super_unlock(sb, excl);
13262306a36Sopenharmony_ci
13362306a36Sopenharmony_ci	/* wait until the superblock is ready or dying */
13462306a36Sopenharmony_ci	wait_var_event(&sb->s_flags, wait_born(sb));
13562306a36Sopenharmony_ci
13662306a36Sopenharmony_ci	/*
13762306a36Sopenharmony_ci	 * Neither SB_BORN nor SB_DYING are ever unset so we never loop.
13862306a36Sopenharmony_ci	 * Just reacquire @sb->s_umount for the caller.
13962306a36Sopenharmony_ci	 */
14062306a36Sopenharmony_ci	goto relock;
14162306a36Sopenharmony_ci}
14262306a36Sopenharmony_ci
14362306a36Sopenharmony_ci/* wait and acquire read-side of @sb->s_umount */
14462306a36Sopenharmony_cistatic inline bool super_lock_shared(struct super_block *sb)
14562306a36Sopenharmony_ci{
14662306a36Sopenharmony_ci	return super_lock(sb, false);
14762306a36Sopenharmony_ci}
14862306a36Sopenharmony_ci
14962306a36Sopenharmony_ci/* wait and acquire write-side of @sb->s_umount */
15062306a36Sopenharmony_cistatic inline bool super_lock_excl(struct super_block *sb)
15162306a36Sopenharmony_ci{
15262306a36Sopenharmony_ci	return super_lock(sb, true);
15362306a36Sopenharmony_ci}
15462306a36Sopenharmony_ci
15562306a36Sopenharmony_ci/* wake waiters */
15662306a36Sopenharmony_ci#define SUPER_WAKE_FLAGS (SB_BORN | SB_DYING | SB_DEAD)
15762306a36Sopenharmony_cistatic void super_wake(struct super_block *sb, unsigned int flag)
15862306a36Sopenharmony_ci{
15962306a36Sopenharmony_ci	WARN_ON_ONCE((flag & ~SUPER_WAKE_FLAGS));
16062306a36Sopenharmony_ci	WARN_ON_ONCE(hweight32(flag & SUPER_WAKE_FLAGS) > 1);
16162306a36Sopenharmony_ci
16262306a36Sopenharmony_ci	/*
16362306a36Sopenharmony_ci	 * Pairs with smp_load_acquire() in super_lock() to make sure
16462306a36Sopenharmony_ci	 * all initializations in the superblock are seen by the user
16562306a36Sopenharmony_ci	 * seeing SB_BORN sent.
16662306a36Sopenharmony_ci	 */
16762306a36Sopenharmony_ci	smp_store_release(&sb->s_flags, sb->s_flags | flag);
16862306a36Sopenharmony_ci	/*
16962306a36Sopenharmony_ci	 * Pairs with the barrier in prepare_to_wait_event() to make sure
17062306a36Sopenharmony_ci	 * ___wait_var_event() either sees SB_BORN set or
17162306a36Sopenharmony_ci	 * waitqueue_active() check in wake_up_var() sees the waiter.
17262306a36Sopenharmony_ci	 */
17362306a36Sopenharmony_ci	smp_mb();
17462306a36Sopenharmony_ci	wake_up_var(&sb->s_flags);
17562306a36Sopenharmony_ci}
17662306a36Sopenharmony_ci
17762306a36Sopenharmony_ci/*
17862306a36Sopenharmony_ci * One thing we have to be careful of with a per-sb shrinker is that we don't
17962306a36Sopenharmony_ci * drop the last active reference to the superblock from within the shrinker.
18062306a36Sopenharmony_ci * If that happens we could trigger unregistering the shrinker from within the
18162306a36Sopenharmony_ci * shrinker path and that leads to deadlock on the shrinker_rwsem. Hence we
18262306a36Sopenharmony_ci * take a passive reference to the superblock to avoid this from occurring.
18362306a36Sopenharmony_ci */
18462306a36Sopenharmony_cistatic unsigned long super_cache_scan(struct shrinker *shrink,
18562306a36Sopenharmony_ci				      struct shrink_control *sc)
18662306a36Sopenharmony_ci{
18762306a36Sopenharmony_ci	struct super_block *sb;
18862306a36Sopenharmony_ci	long	fs_objects = 0;
18962306a36Sopenharmony_ci	long	total_objects;
19062306a36Sopenharmony_ci	long	freed = 0;
19162306a36Sopenharmony_ci	long	dentries;
19262306a36Sopenharmony_ci	long	inodes;
19362306a36Sopenharmony_ci
19462306a36Sopenharmony_ci	sb = container_of(shrink, struct super_block, s_shrink);
19562306a36Sopenharmony_ci
19662306a36Sopenharmony_ci	/*
19762306a36Sopenharmony_ci	 * Deadlock avoidance.  We may hold various FS locks, and we don't want
19862306a36Sopenharmony_ci	 * to recurse into the FS that called us in clear_inode() and friends..
19962306a36Sopenharmony_ci	 */
20062306a36Sopenharmony_ci	if (!(sc->gfp_mask & __GFP_FS))
20162306a36Sopenharmony_ci		return SHRINK_STOP;
20262306a36Sopenharmony_ci
20362306a36Sopenharmony_ci	if (!super_trylock_shared(sb))
20462306a36Sopenharmony_ci		return SHRINK_STOP;
20562306a36Sopenharmony_ci
20662306a36Sopenharmony_ci	if (sb->s_op->nr_cached_objects)
20762306a36Sopenharmony_ci		fs_objects = sb->s_op->nr_cached_objects(sb, sc);
20862306a36Sopenharmony_ci
20962306a36Sopenharmony_ci	inodes = list_lru_shrink_count(&sb->s_inode_lru, sc);
21062306a36Sopenharmony_ci	dentries = list_lru_shrink_count(&sb->s_dentry_lru, sc);
21162306a36Sopenharmony_ci	total_objects = dentries + inodes + fs_objects + 1;
21262306a36Sopenharmony_ci	if (!total_objects)
21362306a36Sopenharmony_ci		total_objects = 1;
21462306a36Sopenharmony_ci
21562306a36Sopenharmony_ci	/* proportion the scan between the caches */
21662306a36Sopenharmony_ci	dentries = mult_frac(sc->nr_to_scan, dentries, total_objects);
21762306a36Sopenharmony_ci	inodes = mult_frac(sc->nr_to_scan, inodes, total_objects);
21862306a36Sopenharmony_ci	fs_objects = mult_frac(sc->nr_to_scan, fs_objects, total_objects);
21962306a36Sopenharmony_ci
22062306a36Sopenharmony_ci	/*
22162306a36Sopenharmony_ci	 * prune the dcache first as the icache is pinned by it, then
22262306a36Sopenharmony_ci	 * prune the icache, followed by the filesystem specific caches
22362306a36Sopenharmony_ci	 *
22462306a36Sopenharmony_ci	 * Ensure that we always scan at least one object - memcg kmem
22562306a36Sopenharmony_ci	 * accounting uses this to fully empty the caches.
22662306a36Sopenharmony_ci	 */
22762306a36Sopenharmony_ci	sc->nr_to_scan = dentries + 1;
22862306a36Sopenharmony_ci	freed = prune_dcache_sb(sb, sc);
22962306a36Sopenharmony_ci	sc->nr_to_scan = inodes + 1;
23062306a36Sopenharmony_ci	freed += prune_icache_sb(sb, sc);
23162306a36Sopenharmony_ci
23262306a36Sopenharmony_ci	if (fs_objects) {
23362306a36Sopenharmony_ci		sc->nr_to_scan = fs_objects + 1;
23462306a36Sopenharmony_ci		freed += sb->s_op->free_cached_objects(sb, sc);
23562306a36Sopenharmony_ci	}
23662306a36Sopenharmony_ci
23762306a36Sopenharmony_ci	super_unlock_shared(sb);
23862306a36Sopenharmony_ci	return freed;
23962306a36Sopenharmony_ci}
24062306a36Sopenharmony_ci
24162306a36Sopenharmony_cistatic unsigned long super_cache_count(struct shrinker *shrink,
24262306a36Sopenharmony_ci				       struct shrink_control *sc)
24362306a36Sopenharmony_ci{
24462306a36Sopenharmony_ci	struct super_block *sb;
24562306a36Sopenharmony_ci	long	total_objects = 0;
24662306a36Sopenharmony_ci
24762306a36Sopenharmony_ci	sb = container_of(shrink, struct super_block, s_shrink);
24862306a36Sopenharmony_ci
24962306a36Sopenharmony_ci	/*
25062306a36Sopenharmony_ci	 * We don't call super_trylock_shared() here as it is a scalability
25162306a36Sopenharmony_ci	 * bottleneck, so we're exposed to partial setup state. The shrinker
25262306a36Sopenharmony_ci	 * rwsem does not protect filesystem operations backing
25362306a36Sopenharmony_ci	 * list_lru_shrink_count() or s_op->nr_cached_objects(). Counts can
25462306a36Sopenharmony_ci	 * change between super_cache_count and super_cache_scan, so we really
25562306a36Sopenharmony_ci	 * don't need locks here.
25662306a36Sopenharmony_ci	 *
25762306a36Sopenharmony_ci	 * However, if we are currently mounting the superblock, the underlying
25862306a36Sopenharmony_ci	 * filesystem might be in a state of partial construction and hence it
25962306a36Sopenharmony_ci	 * is dangerous to access it.  super_trylock_shared() uses a SB_BORN check
26062306a36Sopenharmony_ci	 * to avoid this situation, so do the same here. The memory barrier is
26162306a36Sopenharmony_ci	 * matched with the one in mount_fs() as we don't hold locks here.
26262306a36Sopenharmony_ci	 */
26362306a36Sopenharmony_ci	if (!(sb->s_flags & SB_BORN))
26462306a36Sopenharmony_ci		return 0;
26562306a36Sopenharmony_ci	smp_rmb();
26662306a36Sopenharmony_ci
26762306a36Sopenharmony_ci	if (sb->s_op && sb->s_op->nr_cached_objects)
26862306a36Sopenharmony_ci		total_objects = sb->s_op->nr_cached_objects(sb, sc);
26962306a36Sopenharmony_ci
27062306a36Sopenharmony_ci	total_objects += list_lru_shrink_count(&sb->s_dentry_lru, sc);
27162306a36Sopenharmony_ci	total_objects += list_lru_shrink_count(&sb->s_inode_lru, sc);
27262306a36Sopenharmony_ci
27362306a36Sopenharmony_ci	if (!total_objects)
27462306a36Sopenharmony_ci		return SHRINK_EMPTY;
27562306a36Sopenharmony_ci
27662306a36Sopenharmony_ci	total_objects = vfs_pressure_ratio(total_objects);
27762306a36Sopenharmony_ci	return total_objects;
27862306a36Sopenharmony_ci}
27962306a36Sopenharmony_ci
28062306a36Sopenharmony_cistatic void destroy_super_work(struct work_struct *work)
28162306a36Sopenharmony_ci{
28262306a36Sopenharmony_ci	struct super_block *s = container_of(work, struct super_block,
28362306a36Sopenharmony_ci							destroy_work);
28462306a36Sopenharmony_ci	int i;
28562306a36Sopenharmony_ci
28662306a36Sopenharmony_ci	for (i = 0; i < SB_FREEZE_LEVELS; i++)
28762306a36Sopenharmony_ci		percpu_free_rwsem(&s->s_writers.rw_sem[i]);
28862306a36Sopenharmony_ci	kfree(s);
28962306a36Sopenharmony_ci}
29062306a36Sopenharmony_ci
29162306a36Sopenharmony_cistatic void destroy_super_rcu(struct rcu_head *head)
29262306a36Sopenharmony_ci{
29362306a36Sopenharmony_ci	struct super_block *s = container_of(head, struct super_block, rcu);
29462306a36Sopenharmony_ci	INIT_WORK(&s->destroy_work, destroy_super_work);
29562306a36Sopenharmony_ci	schedule_work(&s->destroy_work);
29662306a36Sopenharmony_ci}
29762306a36Sopenharmony_ci
29862306a36Sopenharmony_ci/* Free a superblock that has never been seen by anyone */
29962306a36Sopenharmony_cistatic void destroy_unused_super(struct super_block *s)
30062306a36Sopenharmony_ci{
30162306a36Sopenharmony_ci	if (!s)
30262306a36Sopenharmony_ci		return;
30362306a36Sopenharmony_ci	super_unlock_excl(s);
30462306a36Sopenharmony_ci	list_lru_destroy(&s->s_dentry_lru);
30562306a36Sopenharmony_ci	list_lru_destroy(&s->s_inode_lru);
30662306a36Sopenharmony_ci	security_sb_free(s);
30762306a36Sopenharmony_ci	put_user_ns(s->s_user_ns);
30862306a36Sopenharmony_ci	kfree(s->s_subtype);
30962306a36Sopenharmony_ci	free_prealloced_shrinker(&s->s_shrink);
31062306a36Sopenharmony_ci	/* no delays needed */
31162306a36Sopenharmony_ci	destroy_super_work(&s->destroy_work);
31262306a36Sopenharmony_ci}
31362306a36Sopenharmony_ci
31462306a36Sopenharmony_ci/**
31562306a36Sopenharmony_ci *	alloc_super	-	create new superblock
31662306a36Sopenharmony_ci *	@type:	filesystem type superblock should belong to
31762306a36Sopenharmony_ci *	@flags: the mount flags
31862306a36Sopenharmony_ci *	@user_ns: User namespace for the super_block
31962306a36Sopenharmony_ci *
32062306a36Sopenharmony_ci *	Allocates and initializes a new &struct super_block.  alloc_super()
32162306a36Sopenharmony_ci *	returns a pointer new superblock or %NULL if allocation had failed.
32262306a36Sopenharmony_ci */
32362306a36Sopenharmony_cistatic struct super_block *alloc_super(struct file_system_type *type, int flags,
32462306a36Sopenharmony_ci				       struct user_namespace *user_ns)
32562306a36Sopenharmony_ci{
32662306a36Sopenharmony_ci	struct super_block *s = kzalloc(sizeof(struct super_block),  GFP_USER);
32762306a36Sopenharmony_ci	static const struct super_operations default_op;
32862306a36Sopenharmony_ci	int i;
32962306a36Sopenharmony_ci
33062306a36Sopenharmony_ci	if (!s)
33162306a36Sopenharmony_ci		return NULL;
33262306a36Sopenharmony_ci
33362306a36Sopenharmony_ci	INIT_LIST_HEAD(&s->s_mounts);
33462306a36Sopenharmony_ci	s->s_user_ns = get_user_ns(user_ns);
33562306a36Sopenharmony_ci	init_rwsem(&s->s_umount);
33662306a36Sopenharmony_ci	lockdep_set_class(&s->s_umount, &type->s_umount_key);
33762306a36Sopenharmony_ci	/*
33862306a36Sopenharmony_ci	 * sget() can have s_umount recursion.
33962306a36Sopenharmony_ci	 *
34062306a36Sopenharmony_ci	 * When it cannot find a suitable sb, it allocates a new
34162306a36Sopenharmony_ci	 * one (this one), and tries again to find a suitable old
34262306a36Sopenharmony_ci	 * one.
34362306a36Sopenharmony_ci	 *
34462306a36Sopenharmony_ci	 * In case that succeeds, it will acquire the s_umount
34562306a36Sopenharmony_ci	 * lock of the old one. Since these are clearly distrinct
34662306a36Sopenharmony_ci	 * locks, and this object isn't exposed yet, there's no
34762306a36Sopenharmony_ci	 * risk of deadlocks.
34862306a36Sopenharmony_ci	 *
34962306a36Sopenharmony_ci	 * Annotate this by putting this lock in a different
35062306a36Sopenharmony_ci	 * subclass.
35162306a36Sopenharmony_ci	 */
35262306a36Sopenharmony_ci	down_write_nested(&s->s_umount, SINGLE_DEPTH_NESTING);
35362306a36Sopenharmony_ci
35462306a36Sopenharmony_ci	if (security_sb_alloc(s))
35562306a36Sopenharmony_ci		goto fail;
35662306a36Sopenharmony_ci
35762306a36Sopenharmony_ci	for (i = 0; i < SB_FREEZE_LEVELS; i++) {
35862306a36Sopenharmony_ci		if (__percpu_init_rwsem(&s->s_writers.rw_sem[i],
35962306a36Sopenharmony_ci					sb_writers_name[i],
36062306a36Sopenharmony_ci					&type->s_writers_key[i]))
36162306a36Sopenharmony_ci			goto fail;
36262306a36Sopenharmony_ci	}
36362306a36Sopenharmony_ci	s->s_bdi = &noop_backing_dev_info;
36462306a36Sopenharmony_ci	s->s_flags = flags;
36562306a36Sopenharmony_ci	if (s->s_user_ns != &init_user_ns)
36662306a36Sopenharmony_ci		s->s_iflags |= SB_I_NODEV;
36762306a36Sopenharmony_ci	INIT_HLIST_NODE(&s->s_instances);
36862306a36Sopenharmony_ci	INIT_HLIST_BL_HEAD(&s->s_roots);
36962306a36Sopenharmony_ci	mutex_init(&s->s_sync_lock);
37062306a36Sopenharmony_ci	INIT_LIST_HEAD(&s->s_inodes);
37162306a36Sopenharmony_ci	spin_lock_init(&s->s_inode_list_lock);
37262306a36Sopenharmony_ci	INIT_LIST_HEAD(&s->s_inodes_wb);
37362306a36Sopenharmony_ci	spin_lock_init(&s->s_inode_wblist_lock);
37462306a36Sopenharmony_ci
37562306a36Sopenharmony_ci	s->s_count = 1;
37662306a36Sopenharmony_ci	atomic_set(&s->s_active, 1);
37762306a36Sopenharmony_ci	mutex_init(&s->s_vfs_rename_mutex);
37862306a36Sopenharmony_ci	lockdep_set_class(&s->s_vfs_rename_mutex, &type->s_vfs_rename_key);
37962306a36Sopenharmony_ci	init_rwsem(&s->s_dquot.dqio_sem);
38062306a36Sopenharmony_ci	s->s_maxbytes = MAX_NON_LFS;
38162306a36Sopenharmony_ci	s->s_op = &default_op;
38262306a36Sopenharmony_ci	s->s_time_gran = 1000000000;
38362306a36Sopenharmony_ci	s->s_time_min = TIME64_MIN;
38462306a36Sopenharmony_ci	s->s_time_max = TIME64_MAX;
38562306a36Sopenharmony_ci
38662306a36Sopenharmony_ci	s->s_shrink.seeks = DEFAULT_SEEKS;
38762306a36Sopenharmony_ci	s->s_shrink.scan_objects = super_cache_scan;
38862306a36Sopenharmony_ci	s->s_shrink.count_objects = super_cache_count;
38962306a36Sopenharmony_ci	s->s_shrink.batch = 1024;
39062306a36Sopenharmony_ci	s->s_shrink.flags = SHRINKER_NUMA_AWARE | SHRINKER_MEMCG_AWARE;
39162306a36Sopenharmony_ci	if (prealloc_shrinker(&s->s_shrink, "sb-%s", type->name))
39262306a36Sopenharmony_ci		goto fail;
39362306a36Sopenharmony_ci	if (list_lru_init_memcg(&s->s_dentry_lru, &s->s_shrink))
39462306a36Sopenharmony_ci		goto fail;
39562306a36Sopenharmony_ci	if (list_lru_init_memcg(&s->s_inode_lru, &s->s_shrink))
39662306a36Sopenharmony_ci		goto fail;
39762306a36Sopenharmony_ci	return s;
39862306a36Sopenharmony_ci
39962306a36Sopenharmony_cifail:
40062306a36Sopenharmony_ci	destroy_unused_super(s);
40162306a36Sopenharmony_ci	return NULL;
40262306a36Sopenharmony_ci}
40362306a36Sopenharmony_ci
40462306a36Sopenharmony_ci/* Superblock refcounting  */
40562306a36Sopenharmony_ci
40662306a36Sopenharmony_ci/*
40762306a36Sopenharmony_ci * Drop a superblock's refcount.  The caller must hold sb_lock.
40862306a36Sopenharmony_ci */
40962306a36Sopenharmony_cistatic void __put_super(struct super_block *s)
41062306a36Sopenharmony_ci{
41162306a36Sopenharmony_ci	if (!--s->s_count) {
41262306a36Sopenharmony_ci		list_del_init(&s->s_list);
41362306a36Sopenharmony_ci		WARN_ON(s->s_dentry_lru.node);
41462306a36Sopenharmony_ci		WARN_ON(s->s_inode_lru.node);
41562306a36Sopenharmony_ci		WARN_ON(!list_empty(&s->s_mounts));
41662306a36Sopenharmony_ci		security_sb_free(s);
41762306a36Sopenharmony_ci		put_user_ns(s->s_user_ns);
41862306a36Sopenharmony_ci		kfree(s->s_subtype);
41962306a36Sopenharmony_ci		call_rcu(&s->rcu, destroy_super_rcu);
42062306a36Sopenharmony_ci	}
42162306a36Sopenharmony_ci}
42262306a36Sopenharmony_ci
42362306a36Sopenharmony_ci/**
42462306a36Sopenharmony_ci *	put_super	-	drop a temporary reference to superblock
42562306a36Sopenharmony_ci *	@sb: superblock in question
42662306a36Sopenharmony_ci *
42762306a36Sopenharmony_ci *	Drops a temporary reference, frees superblock if there's no
42862306a36Sopenharmony_ci *	references left.
42962306a36Sopenharmony_ci */
43062306a36Sopenharmony_civoid put_super(struct super_block *sb)
43162306a36Sopenharmony_ci{
43262306a36Sopenharmony_ci	spin_lock(&sb_lock);
43362306a36Sopenharmony_ci	__put_super(sb);
43462306a36Sopenharmony_ci	spin_unlock(&sb_lock);
43562306a36Sopenharmony_ci}
43662306a36Sopenharmony_ci
43762306a36Sopenharmony_cistatic void kill_super_notify(struct super_block *sb)
43862306a36Sopenharmony_ci{
43962306a36Sopenharmony_ci	lockdep_assert_not_held(&sb->s_umount);
44062306a36Sopenharmony_ci
44162306a36Sopenharmony_ci	/* already notified earlier */
44262306a36Sopenharmony_ci	if (sb->s_flags & SB_DEAD)
44362306a36Sopenharmony_ci		return;
44462306a36Sopenharmony_ci
44562306a36Sopenharmony_ci	/*
44662306a36Sopenharmony_ci	 * Remove it from @fs_supers so it isn't found by new
44762306a36Sopenharmony_ci	 * sget{_fc}() walkers anymore. Any concurrent mounter still
44862306a36Sopenharmony_ci	 * managing to grab a temporary reference is guaranteed to
44962306a36Sopenharmony_ci	 * already see SB_DYING and will wait until we notify them about
45062306a36Sopenharmony_ci	 * SB_DEAD.
45162306a36Sopenharmony_ci	 */
45262306a36Sopenharmony_ci	spin_lock(&sb_lock);
45362306a36Sopenharmony_ci	hlist_del_init(&sb->s_instances);
45462306a36Sopenharmony_ci	spin_unlock(&sb_lock);
45562306a36Sopenharmony_ci
45662306a36Sopenharmony_ci	/*
45762306a36Sopenharmony_ci	 * Let concurrent mounts know that this thing is really dead.
45862306a36Sopenharmony_ci	 * We don't need @sb->s_umount here as every concurrent caller
45962306a36Sopenharmony_ci	 * will see SB_DYING and either discard the superblock or wait
46062306a36Sopenharmony_ci	 * for SB_DEAD.
46162306a36Sopenharmony_ci	 */
46262306a36Sopenharmony_ci	super_wake(sb, SB_DEAD);
46362306a36Sopenharmony_ci}
46462306a36Sopenharmony_ci
46562306a36Sopenharmony_ci/**
46662306a36Sopenharmony_ci *	deactivate_locked_super	-	drop an active reference to superblock
46762306a36Sopenharmony_ci *	@s: superblock to deactivate
46862306a36Sopenharmony_ci *
46962306a36Sopenharmony_ci *	Drops an active reference to superblock, converting it into a temporary
47062306a36Sopenharmony_ci *	one if there is no other active references left.  In that case we
47162306a36Sopenharmony_ci *	tell fs driver to shut it down and drop the temporary reference we
47262306a36Sopenharmony_ci *	had just acquired.
47362306a36Sopenharmony_ci *
47462306a36Sopenharmony_ci *	Caller holds exclusive lock on superblock; that lock is released.
47562306a36Sopenharmony_ci */
47662306a36Sopenharmony_civoid deactivate_locked_super(struct super_block *s)
47762306a36Sopenharmony_ci{
47862306a36Sopenharmony_ci	struct file_system_type *fs = s->s_type;
47962306a36Sopenharmony_ci	if (atomic_dec_and_test(&s->s_active)) {
48062306a36Sopenharmony_ci		unregister_shrinker(&s->s_shrink);
48162306a36Sopenharmony_ci		fs->kill_sb(s);
48262306a36Sopenharmony_ci
48362306a36Sopenharmony_ci		kill_super_notify(s);
48462306a36Sopenharmony_ci
48562306a36Sopenharmony_ci		/*
48662306a36Sopenharmony_ci		 * Since list_lru_destroy() may sleep, we cannot call it from
48762306a36Sopenharmony_ci		 * put_super(), where we hold the sb_lock. Therefore we destroy
48862306a36Sopenharmony_ci		 * the lru lists right now.
48962306a36Sopenharmony_ci		 */
49062306a36Sopenharmony_ci		list_lru_destroy(&s->s_dentry_lru);
49162306a36Sopenharmony_ci		list_lru_destroy(&s->s_inode_lru);
49262306a36Sopenharmony_ci
49362306a36Sopenharmony_ci		put_filesystem(fs);
49462306a36Sopenharmony_ci		put_super(s);
49562306a36Sopenharmony_ci	} else {
49662306a36Sopenharmony_ci		super_unlock_excl(s);
49762306a36Sopenharmony_ci	}
49862306a36Sopenharmony_ci}
49962306a36Sopenharmony_ci
50062306a36Sopenharmony_ciEXPORT_SYMBOL(deactivate_locked_super);
50162306a36Sopenharmony_ci
50262306a36Sopenharmony_ci/**
50362306a36Sopenharmony_ci *	deactivate_super	-	drop an active reference to superblock
50462306a36Sopenharmony_ci *	@s: superblock to deactivate
50562306a36Sopenharmony_ci *
50662306a36Sopenharmony_ci *	Variant of deactivate_locked_super(), except that superblock is *not*
50762306a36Sopenharmony_ci *	locked by caller.  If we are going to drop the final active reference,
50862306a36Sopenharmony_ci *	lock will be acquired prior to that.
50962306a36Sopenharmony_ci */
51062306a36Sopenharmony_civoid deactivate_super(struct super_block *s)
51162306a36Sopenharmony_ci{
51262306a36Sopenharmony_ci	if (!atomic_add_unless(&s->s_active, -1, 1)) {
51362306a36Sopenharmony_ci		__super_lock_excl(s);
51462306a36Sopenharmony_ci		deactivate_locked_super(s);
51562306a36Sopenharmony_ci	}
51662306a36Sopenharmony_ci}
51762306a36Sopenharmony_ci
51862306a36Sopenharmony_ciEXPORT_SYMBOL(deactivate_super);
51962306a36Sopenharmony_ci
52062306a36Sopenharmony_ci/**
52162306a36Sopenharmony_ci *	grab_super - acquire an active reference
52262306a36Sopenharmony_ci *	@s: reference we are trying to make active
52362306a36Sopenharmony_ci *
52462306a36Sopenharmony_ci *	Tries to acquire an active reference.  grab_super() is used when we
52562306a36Sopenharmony_ci * 	had just found a superblock in super_blocks or fs_type->fs_supers
52662306a36Sopenharmony_ci *	and want to turn it into a full-blown active reference.  grab_super()
52762306a36Sopenharmony_ci *	is called with sb_lock held and drops it.  Returns 1 in case of
52862306a36Sopenharmony_ci *	success, 0 if we had failed (superblock contents was already dead or
52962306a36Sopenharmony_ci *	dying when grab_super() had been called).  Note that this is only
53062306a36Sopenharmony_ci *	called for superblocks not in rundown mode (== ones still on ->fs_supers
53162306a36Sopenharmony_ci *	of their type), so increment of ->s_count is OK here.
53262306a36Sopenharmony_ci */
53362306a36Sopenharmony_cistatic int grab_super(struct super_block *s) __releases(sb_lock)
53462306a36Sopenharmony_ci{
53562306a36Sopenharmony_ci	bool born;
53662306a36Sopenharmony_ci
53762306a36Sopenharmony_ci	s->s_count++;
53862306a36Sopenharmony_ci	spin_unlock(&sb_lock);
53962306a36Sopenharmony_ci	born = super_lock_excl(s);
54062306a36Sopenharmony_ci	if (born && atomic_inc_not_zero(&s->s_active)) {
54162306a36Sopenharmony_ci		put_super(s);
54262306a36Sopenharmony_ci		return 1;
54362306a36Sopenharmony_ci	}
54462306a36Sopenharmony_ci	super_unlock_excl(s);
54562306a36Sopenharmony_ci	put_super(s);
54662306a36Sopenharmony_ci	return 0;
54762306a36Sopenharmony_ci}
54862306a36Sopenharmony_ci
54962306a36Sopenharmony_cistatic inline bool wait_dead(struct super_block *sb)
55062306a36Sopenharmony_ci{
55162306a36Sopenharmony_ci	unsigned int flags;
55262306a36Sopenharmony_ci
55362306a36Sopenharmony_ci	/*
55462306a36Sopenharmony_ci	 * Pairs with memory barrier in super_wake() and ensures
55562306a36Sopenharmony_ci	 * that we see SB_DEAD after we're woken.
55662306a36Sopenharmony_ci	 */
55762306a36Sopenharmony_ci	flags = smp_load_acquire(&sb->s_flags);
55862306a36Sopenharmony_ci	return flags & SB_DEAD;
55962306a36Sopenharmony_ci}
56062306a36Sopenharmony_ci
56162306a36Sopenharmony_ci/**
56262306a36Sopenharmony_ci * grab_super_dead - acquire an active reference to a superblock
56362306a36Sopenharmony_ci * @sb: superblock to acquire
56462306a36Sopenharmony_ci *
56562306a36Sopenharmony_ci * Acquire a temporary reference on a superblock and try to trade it for
56662306a36Sopenharmony_ci * an active reference. This is used in sget{_fc}() to wait for a
56762306a36Sopenharmony_ci * superblock to either become SB_BORN or for it to pass through
56862306a36Sopenharmony_ci * sb->kill() and be marked as SB_DEAD.
56962306a36Sopenharmony_ci *
57062306a36Sopenharmony_ci * Return: This returns true if an active reference could be acquired,
57162306a36Sopenharmony_ci *         false if not.
57262306a36Sopenharmony_ci */
57362306a36Sopenharmony_cistatic bool grab_super_dead(struct super_block *sb)
57462306a36Sopenharmony_ci{
57562306a36Sopenharmony_ci
57662306a36Sopenharmony_ci	sb->s_count++;
57762306a36Sopenharmony_ci	if (grab_super(sb)) {
57862306a36Sopenharmony_ci		put_super(sb);
57962306a36Sopenharmony_ci		lockdep_assert_held(&sb->s_umount);
58062306a36Sopenharmony_ci		return true;
58162306a36Sopenharmony_ci	}
58262306a36Sopenharmony_ci	wait_var_event(&sb->s_flags, wait_dead(sb));
58362306a36Sopenharmony_ci	lockdep_assert_not_held(&sb->s_umount);
58462306a36Sopenharmony_ci	put_super(sb);
58562306a36Sopenharmony_ci	return false;
58662306a36Sopenharmony_ci}
58762306a36Sopenharmony_ci
58862306a36Sopenharmony_ci/*
58962306a36Sopenharmony_ci *	super_trylock_shared - try to grab ->s_umount shared
59062306a36Sopenharmony_ci *	@sb: reference we are trying to grab
59162306a36Sopenharmony_ci *
59262306a36Sopenharmony_ci *	Try to prevent fs shutdown.  This is used in places where we
59362306a36Sopenharmony_ci *	cannot take an active reference but we need to ensure that the
59462306a36Sopenharmony_ci *	filesystem is not shut down while we are working on it. It returns
59562306a36Sopenharmony_ci *	false if we cannot acquire s_umount or if we lose the race and
59662306a36Sopenharmony_ci *	filesystem already got into shutdown, and returns true with the s_umount
59762306a36Sopenharmony_ci *	lock held in read mode in case of success. On successful return,
59862306a36Sopenharmony_ci *	the caller must drop the s_umount lock when done.
59962306a36Sopenharmony_ci *
60062306a36Sopenharmony_ci *	Note that unlike get_super() et.al. this one does *not* bump ->s_count.
60162306a36Sopenharmony_ci *	The reason why it's safe is that we are OK with doing trylock instead
60262306a36Sopenharmony_ci *	of down_read().  There's a couple of places that are OK with that, but
60362306a36Sopenharmony_ci *	it's very much not a general-purpose interface.
60462306a36Sopenharmony_ci */
60562306a36Sopenharmony_cibool super_trylock_shared(struct super_block *sb)
60662306a36Sopenharmony_ci{
60762306a36Sopenharmony_ci	if (down_read_trylock(&sb->s_umount)) {
60862306a36Sopenharmony_ci		if (!(sb->s_flags & SB_DYING) && sb->s_root &&
60962306a36Sopenharmony_ci		    (sb->s_flags & SB_BORN))
61062306a36Sopenharmony_ci			return true;
61162306a36Sopenharmony_ci		super_unlock_shared(sb);
61262306a36Sopenharmony_ci	}
61362306a36Sopenharmony_ci
61462306a36Sopenharmony_ci	return false;
61562306a36Sopenharmony_ci}
61662306a36Sopenharmony_ci
61762306a36Sopenharmony_ci/**
61862306a36Sopenharmony_ci *	retire_super	-	prevents superblock from being reused
61962306a36Sopenharmony_ci *	@sb: superblock to retire
62062306a36Sopenharmony_ci *
62162306a36Sopenharmony_ci *	The function marks superblock to be ignored in superblock test, which
62262306a36Sopenharmony_ci *	prevents it from being reused for any new mounts.  If the superblock has
62362306a36Sopenharmony_ci *	a private bdi, it also unregisters it, but doesn't reduce the refcount
62462306a36Sopenharmony_ci *	of the superblock to prevent potential races.  The refcount is reduced
62562306a36Sopenharmony_ci *	by generic_shutdown_super().  The function can not be called
62662306a36Sopenharmony_ci *	concurrently with generic_shutdown_super().  It is safe to call the
62762306a36Sopenharmony_ci *	function multiple times, subsequent calls have no effect.
62862306a36Sopenharmony_ci *
62962306a36Sopenharmony_ci *	The marker will affect the re-use only for block-device-based
63062306a36Sopenharmony_ci *	superblocks.  Other superblocks will still get marked if this function
63162306a36Sopenharmony_ci *	is used, but that will not affect their reusability.
63262306a36Sopenharmony_ci */
63362306a36Sopenharmony_civoid retire_super(struct super_block *sb)
63462306a36Sopenharmony_ci{
63562306a36Sopenharmony_ci	WARN_ON(!sb->s_bdev);
63662306a36Sopenharmony_ci	__super_lock_excl(sb);
63762306a36Sopenharmony_ci	if (sb->s_iflags & SB_I_PERSB_BDI) {
63862306a36Sopenharmony_ci		bdi_unregister(sb->s_bdi);
63962306a36Sopenharmony_ci		sb->s_iflags &= ~SB_I_PERSB_BDI;
64062306a36Sopenharmony_ci	}
64162306a36Sopenharmony_ci	sb->s_iflags |= SB_I_RETIRED;
64262306a36Sopenharmony_ci	super_unlock_excl(sb);
64362306a36Sopenharmony_ci}
64462306a36Sopenharmony_ciEXPORT_SYMBOL(retire_super);
64562306a36Sopenharmony_ci
64662306a36Sopenharmony_ci/**
64762306a36Sopenharmony_ci *	generic_shutdown_super	-	common helper for ->kill_sb()
64862306a36Sopenharmony_ci *	@sb: superblock to kill
64962306a36Sopenharmony_ci *
65062306a36Sopenharmony_ci *	generic_shutdown_super() does all fs-independent work on superblock
65162306a36Sopenharmony_ci *	shutdown.  Typical ->kill_sb() should pick all fs-specific objects
65262306a36Sopenharmony_ci *	that need destruction out of superblock, call generic_shutdown_super()
65362306a36Sopenharmony_ci *	and release aforementioned objects.  Note: dentries and inodes _are_
65462306a36Sopenharmony_ci *	taken care of and do not need specific handling.
65562306a36Sopenharmony_ci *
65662306a36Sopenharmony_ci *	Upon calling this function, the filesystem may no longer alter or
65762306a36Sopenharmony_ci *	rearrange the set of dentries belonging to this super_block, nor may it
65862306a36Sopenharmony_ci *	change the attachments of dentries to inodes.
65962306a36Sopenharmony_ci */
66062306a36Sopenharmony_civoid generic_shutdown_super(struct super_block *sb)
66162306a36Sopenharmony_ci{
66262306a36Sopenharmony_ci	const struct super_operations *sop = sb->s_op;
66362306a36Sopenharmony_ci
66462306a36Sopenharmony_ci	if (sb->s_root) {
66562306a36Sopenharmony_ci		shrink_dcache_for_umount(sb);
66662306a36Sopenharmony_ci		sync_filesystem(sb);
66762306a36Sopenharmony_ci		sb->s_flags &= ~SB_ACTIVE;
66862306a36Sopenharmony_ci
66962306a36Sopenharmony_ci		cgroup_writeback_umount();
67062306a36Sopenharmony_ci
67162306a36Sopenharmony_ci		/* Evict all inodes with zero refcount. */
67262306a36Sopenharmony_ci		evict_inodes(sb);
67362306a36Sopenharmony_ci
67462306a36Sopenharmony_ci		/*
67562306a36Sopenharmony_ci		 * Clean up and evict any inodes that still have references due
67662306a36Sopenharmony_ci		 * to fsnotify or the security policy.
67762306a36Sopenharmony_ci		 */
67862306a36Sopenharmony_ci		fsnotify_sb_delete(sb);
67962306a36Sopenharmony_ci		security_sb_delete(sb);
68062306a36Sopenharmony_ci
68162306a36Sopenharmony_ci		/*
68262306a36Sopenharmony_ci		 * Now that all potentially-encrypted inodes have been evicted,
68362306a36Sopenharmony_ci		 * the fscrypt keyring can be destroyed.
68462306a36Sopenharmony_ci		 */
68562306a36Sopenharmony_ci		fscrypt_destroy_keyring(sb);
68662306a36Sopenharmony_ci
68762306a36Sopenharmony_ci		if (sb->s_dio_done_wq) {
68862306a36Sopenharmony_ci			destroy_workqueue(sb->s_dio_done_wq);
68962306a36Sopenharmony_ci			sb->s_dio_done_wq = NULL;
69062306a36Sopenharmony_ci		}
69162306a36Sopenharmony_ci
69262306a36Sopenharmony_ci		if (sop->put_super)
69362306a36Sopenharmony_ci			sop->put_super(sb);
69462306a36Sopenharmony_ci
69562306a36Sopenharmony_ci		if (CHECK_DATA_CORRUPTION(!list_empty(&sb->s_inodes),
69662306a36Sopenharmony_ci				"VFS: Busy inodes after unmount of %s (%s)",
69762306a36Sopenharmony_ci				sb->s_id, sb->s_type->name)) {
69862306a36Sopenharmony_ci			/*
69962306a36Sopenharmony_ci			 * Adding a proper bailout path here would be hard, but
70062306a36Sopenharmony_ci			 * we can at least make it more likely that a later
70162306a36Sopenharmony_ci			 * iput_final() or such crashes cleanly.
70262306a36Sopenharmony_ci			 */
70362306a36Sopenharmony_ci			struct inode *inode;
70462306a36Sopenharmony_ci
70562306a36Sopenharmony_ci			spin_lock(&sb->s_inode_list_lock);
70662306a36Sopenharmony_ci			list_for_each_entry(inode, &sb->s_inodes, i_sb_list) {
70762306a36Sopenharmony_ci				inode->i_op = VFS_PTR_POISON;
70862306a36Sopenharmony_ci				inode->i_sb = VFS_PTR_POISON;
70962306a36Sopenharmony_ci				inode->i_mapping = VFS_PTR_POISON;
71062306a36Sopenharmony_ci			}
71162306a36Sopenharmony_ci			spin_unlock(&sb->s_inode_list_lock);
71262306a36Sopenharmony_ci		}
71362306a36Sopenharmony_ci	}
71462306a36Sopenharmony_ci	/*
71562306a36Sopenharmony_ci	 * Broadcast to everyone that grabbed a temporary reference to this
71662306a36Sopenharmony_ci	 * superblock before we removed it from @fs_supers that the superblock
71762306a36Sopenharmony_ci	 * is dying. Every walker of @fs_supers outside of sget{_fc}() will now
71862306a36Sopenharmony_ci	 * discard this superblock and treat it as dead.
71962306a36Sopenharmony_ci	 *
72062306a36Sopenharmony_ci	 * We leave the superblock on @fs_supers so it can be found by
72162306a36Sopenharmony_ci	 * sget{_fc}() until we passed sb->kill_sb().
72262306a36Sopenharmony_ci	 */
72362306a36Sopenharmony_ci	super_wake(sb, SB_DYING);
72462306a36Sopenharmony_ci	super_unlock_excl(sb);
72562306a36Sopenharmony_ci	if (sb->s_bdi != &noop_backing_dev_info) {
72662306a36Sopenharmony_ci		if (sb->s_iflags & SB_I_PERSB_BDI)
72762306a36Sopenharmony_ci			bdi_unregister(sb->s_bdi);
72862306a36Sopenharmony_ci		bdi_put(sb->s_bdi);
72962306a36Sopenharmony_ci		sb->s_bdi = &noop_backing_dev_info;
73062306a36Sopenharmony_ci	}
73162306a36Sopenharmony_ci}
73262306a36Sopenharmony_ci
73362306a36Sopenharmony_ciEXPORT_SYMBOL(generic_shutdown_super);
73462306a36Sopenharmony_ci
73562306a36Sopenharmony_cibool mount_capable(struct fs_context *fc)
73662306a36Sopenharmony_ci{
73762306a36Sopenharmony_ci	if (!(fc->fs_type->fs_flags & FS_USERNS_MOUNT))
73862306a36Sopenharmony_ci		return capable(CAP_SYS_ADMIN);
73962306a36Sopenharmony_ci	else
74062306a36Sopenharmony_ci		return ns_capable(fc->user_ns, CAP_SYS_ADMIN);
74162306a36Sopenharmony_ci}
74262306a36Sopenharmony_ci
74362306a36Sopenharmony_ci/**
74462306a36Sopenharmony_ci * sget_fc - Find or create a superblock
74562306a36Sopenharmony_ci * @fc:	Filesystem context.
74662306a36Sopenharmony_ci * @test: Comparison callback
74762306a36Sopenharmony_ci * @set: Setup callback
74862306a36Sopenharmony_ci *
74962306a36Sopenharmony_ci * Create a new superblock or find an existing one.
75062306a36Sopenharmony_ci *
75162306a36Sopenharmony_ci * The @test callback is used to find a matching existing superblock.
75262306a36Sopenharmony_ci * Whether or not the requested parameters in @fc are taken into account
75362306a36Sopenharmony_ci * is specific to the @test callback that is used. They may even be
75462306a36Sopenharmony_ci * completely ignored.
75562306a36Sopenharmony_ci *
75662306a36Sopenharmony_ci * If an extant superblock is matched, it will be returned unless:
75762306a36Sopenharmony_ci *
75862306a36Sopenharmony_ci * (1) the namespace the filesystem context @fc and the extant
75962306a36Sopenharmony_ci *     superblock's namespace differ
76062306a36Sopenharmony_ci *
76162306a36Sopenharmony_ci * (2) the filesystem context @fc has requested that reusing an extant
76262306a36Sopenharmony_ci *     superblock is not allowed
76362306a36Sopenharmony_ci *
76462306a36Sopenharmony_ci * In both cases EBUSY will be returned.
76562306a36Sopenharmony_ci *
76662306a36Sopenharmony_ci * If no match is made, a new superblock will be allocated and basic
76762306a36Sopenharmony_ci * initialisation will be performed (s_type, s_fs_info and s_id will be
76862306a36Sopenharmony_ci * set and the @set callback will be invoked), the superblock will be
76962306a36Sopenharmony_ci * published and it will be returned in a partially constructed state
77062306a36Sopenharmony_ci * with SB_BORN and SB_ACTIVE as yet unset.
77162306a36Sopenharmony_ci *
77262306a36Sopenharmony_ci * Return: On success, an extant or newly created superblock is
77362306a36Sopenharmony_ci *         returned. On failure an error pointer is returned.
77462306a36Sopenharmony_ci */
77562306a36Sopenharmony_cistruct super_block *sget_fc(struct fs_context *fc,
77662306a36Sopenharmony_ci			    int (*test)(struct super_block *, struct fs_context *),
77762306a36Sopenharmony_ci			    int (*set)(struct super_block *, struct fs_context *))
77862306a36Sopenharmony_ci{
77962306a36Sopenharmony_ci	struct super_block *s = NULL;
78062306a36Sopenharmony_ci	struct super_block *old;
78162306a36Sopenharmony_ci	struct user_namespace *user_ns = fc->global ? &init_user_ns : fc->user_ns;
78262306a36Sopenharmony_ci	int err;
78362306a36Sopenharmony_ci
78462306a36Sopenharmony_ciretry:
78562306a36Sopenharmony_ci	spin_lock(&sb_lock);
78662306a36Sopenharmony_ci	if (test) {
78762306a36Sopenharmony_ci		hlist_for_each_entry(old, &fc->fs_type->fs_supers, s_instances) {
78862306a36Sopenharmony_ci			if (test(old, fc))
78962306a36Sopenharmony_ci				goto share_extant_sb;
79062306a36Sopenharmony_ci		}
79162306a36Sopenharmony_ci	}
79262306a36Sopenharmony_ci	if (!s) {
79362306a36Sopenharmony_ci		spin_unlock(&sb_lock);
79462306a36Sopenharmony_ci		s = alloc_super(fc->fs_type, fc->sb_flags, user_ns);
79562306a36Sopenharmony_ci		if (!s)
79662306a36Sopenharmony_ci			return ERR_PTR(-ENOMEM);
79762306a36Sopenharmony_ci		goto retry;
79862306a36Sopenharmony_ci	}
79962306a36Sopenharmony_ci
80062306a36Sopenharmony_ci	s->s_fs_info = fc->s_fs_info;
80162306a36Sopenharmony_ci	err = set(s, fc);
80262306a36Sopenharmony_ci	if (err) {
80362306a36Sopenharmony_ci		s->s_fs_info = NULL;
80462306a36Sopenharmony_ci		spin_unlock(&sb_lock);
80562306a36Sopenharmony_ci		destroy_unused_super(s);
80662306a36Sopenharmony_ci		return ERR_PTR(err);
80762306a36Sopenharmony_ci	}
80862306a36Sopenharmony_ci	fc->s_fs_info = NULL;
80962306a36Sopenharmony_ci	s->s_type = fc->fs_type;
81062306a36Sopenharmony_ci	s->s_iflags |= fc->s_iflags;
81162306a36Sopenharmony_ci	strscpy(s->s_id, s->s_type->name, sizeof(s->s_id));
81262306a36Sopenharmony_ci	/*
81362306a36Sopenharmony_ci	 * Make the superblock visible on @super_blocks and @fs_supers.
81462306a36Sopenharmony_ci	 * It's in a nascent state and users should wait on SB_BORN or
81562306a36Sopenharmony_ci	 * SB_DYING to be set.
81662306a36Sopenharmony_ci	 */
81762306a36Sopenharmony_ci	list_add_tail(&s->s_list, &super_blocks);
81862306a36Sopenharmony_ci	hlist_add_head(&s->s_instances, &s->s_type->fs_supers);
81962306a36Sopenharmony_ci	spin_unlock(&sb_lock);
82062306a36Sopenharmony_ci	get_filesystem(s->s_type);
82162306a36Sopenharmony_ci	register_shrinker_prepared(&s->s_shrink);
82262306a36Sopenharmony_ci	return s;
82362306a36Sopenharmony_ci
82462306a36Sopenharmony_cishare_extant_sb:
82562306a36Sopenharmony_ci	if (user_ns != old->s_user_ns || fc->exclusive) {
82662306a36Sopenharmony_ci		spin_unlock(&sb_lock);
82762306a36Sopenharmony_ci		destroy_unused_super(s);
82862306a36Sopenharmony_ci		if (fc->exclusive)
82962306a36Sopenharmony_ci			warnfc(fc, "reusing existing filesystem not allowed");
83062306a36Sopenharmony_ci		else
83162306a36Sopenharmony_ci			warnfc(fc, "reusing existing filesystem in another namespace not allowed");
83262306a36Sopenharmony_ci		return ERR_PTR(-EBUSY);
83362306a36Sopenharmony_ci	}
83462306a36Sopenharmony_ci	if (!grab_super_dead(old))
83562306a36Sopenharmony_ci		goto retry;
83662306a36Sopenharmony_ci	destroy_unused_super(s);
83762306a36Sopenharmony_ci	return old;
83862306a36Sopenharmony_ci}
83962306a36Sopenharmony_ciEXPORT_SYMBOL(sget_fc);
84062306a36Sopenharmony_ci
84162306a36Sopenharmony_ci/**
84262306a36Sopenharmony_ci *	sget	-	find or create a superblock
84362306a36Sopenharmony_ci *	@type:	  filesystem type superblock should belong to
84462306a36Sopenharmony_ci *	@test:	  comparison callback
84562306a36Sopenharmony_ci *	@set:	  setup callback
84662306a36Sopenharmony_ci *	@flags:	  mount flags
84762306a36Sopenharmony_ci *	@data:	  argument to each of them
84862306a36Sopenharmony_ci */
84962306a36Sopenharmony_cistruct super_block *sget(struct file_system_type *type,
85062306a36Sopenharmony_ci			int (*test)(struct super_block *,void *),
85162306a36Sopenharmony_ci			int (*set)(struct super_block *,void *),
85262306a36Sopenharmony_ci			int flags,
85362306a36Sopenharmony_ci			void *data)
85462306a36Sopenharmony_ci{
85562306a36Sopenharmony_ci	struct user_namespace *user_ns = current_user_ns();
85662306a36Sopenharmony_ci	struct super_block *s = NULL;
85762306a36Sopenharmony_ci	struct super_block *old;
85862306a36Sopenharmony_ci	int err;
85962306a36Sopenharmony_ci
86062306a36Sopenharmony_ci	/* We don't yet pass the user namespace of the parent
86162306a36Sopenharmony_ci	 * mount through to here so always use &init_user_ns
86262306a36Sopenharmony_ci	 * until that changes.
86362306a36Sopenharmony_ci	 */
86462306a36Sopenharmony_ci	if (flags & SB_SUBMOUNT)
86562306a36Sopenharmony_ci		user_ns = &init_user_ns;
86662306a36Sopenharmony_ci
86762306a36Sopenharmony_ciretry:
86862306a36Sopenharmony_ci	spin_lock(&sb_lock);
86962306a36Sopenharmony_ci	if (test) {
87062306a36Sopenharmony_ci		hlist_for_each_entry(old, &type->fs_supers, s_instances) {
87162306a36Sopenharmony_ci			if (!test(old, data))
87262306a36Sopenharmony_ci				continue;
87362306a36Sopenharmony_ci			if (user_ns != old->s_user_ns) {
87462306a36Sopenharmony_ci				spin_unlock(&sb_lock);
87562306a36Sopenharmony_ci				destroy_unused_super(s);
87662306a36Sopenharmony_ci				return ERR_PTR(-EBUSY);
87762306a36Sopenharmony_ci			}
87862306a36Sopenharmony_ci			if (!grab_super_dead(old))
87962306a36Sopenharmony_ci				goto retry;
88062306a36Sopenharmony_ci			destroy_unused_super(s);
88162306a36Sopenharmony_ci			return old;
88262306a36Sopenharmony_ci		}
88362306a36Sopenharmony_ci	}
88462306a36Sopenharmony_ci	if (!s) {
88562306a36Sopenharmony_ci		spin_unlock(&sb_lock);
88662306a36Sopenharmony_ci		s = alloc_super(type, (flags & ~SB_SUBMOUNT), user_ns);
88762306a36Sopenharmony_ci		if (!s)
88862306a36Sopenharmony_ci			return ERR_PTR(-ENOMEM);
88962306a36Sopenharmony_ci		goto retry;
89062306a36Sopenharmony_ci	}
89162306a36Sopenharmony_ci
89262306a36Sopenharmony_ci	err = set(s, data);
89362306a36Sopenharmony_ci	if (err) {
89462306a36Sopenharmony_ci		spin_unlock(&sb_lock);
89562306a36Sopenharmony_ci		destroy_unused_super(s);
89662306a36Sopenharmony_ci		return ERR_PTR(err);
89762306a36Sopenharmony_ci	}
89862306a36Sopenharmony_ci	s->s_type = type;
89962306a36Sopenharmony_ci	strscpy(s->s_id, type->name, sizeof(s->s_id));
90062306a36Sopenharmony_ci	list_add_tail(&s->s_list, &super_blocks);
90162306a36Sopenharmony_ci	hlist_add_head(&s->s_instances, &type->fs_supers);
90262306a36Sopenharmony_ci	spin_unlock(&sb_lock);
90362306a36Sopenharmony_ci	get_filesystem(type);
90462306a36Sopenharmony_ci	register_shrinker_prepared(&s->s_shrink);
90562306a36Sopenharmony_ci	return s;
90662306a36Sopenharmony_ci}
90762306a36Sopenharmony_ciEXPORT_SYMBOL(sget);
90862306a36Sopenharmony_ci
90962306a36Sopenharmony_civoid drop_super(struct super_block *sb)
91062306a36Sopenharmony_ci{
91162306a36Sopenharmony_ci	super_unlock_shared(sb);
91262306a36Sopenharmony_ci	put_super(sb);
91362306a36Sopenharmony_ci}
91462306a36Sopenharmony_ci
91562306a36Sopenharmony_ciEXPORT_SYMBOL(drop_super);
91662306a36Sopenharmony_ci
91762306a36Sopenharmony_civoid drop_super_exclusive(struct super_block *sb)
91862306a36Sopenharmony_ci{
91962306a36Sopenharmony_ci	super_unlock_excl(sb);
92062306a36Sopenharmony_ci	put_super(sb);
92162306a36Sopenharmony_ci}
92262306a36Sopenharmony_ciEXPORT_SYMBOL(drop_super_exclusive);
92362306a36Sopenharmony_ci
92462306a36Sopenharmony_cistatic void __iterate_supers(void (*f)(struct super_block *))
92562306a36Sopenharmony_ci{
92662306a36Sopenharmony_ci	struct super_block *sb, *p = NULL;
92762306a36Sopenharmony_ci
92862306a36Sopenharmony_ci	spin_lock(&sb_lock);
92962306a36Sopenharmony_ci	list_for_each_entry(sb, &super_blocks, s_list) {
93062306a36Sopenharmony_ci		/* Pairs with memory marrier in super_wake(). */
93162306a36Sopenharmony_ci		if (smp_load_acquire(&sb->s_flags) & SB_DYING)
93262306a36Sopenharmony_ci			continue;
93362306a36Sopenharmony_ci		sb->s_count++;
93462306a36Sopenharmony_ci		spin_unlock(&sb_lock);
93562306a36Sopenharmony_ci
93662306a36Sopenharmony_ci		f(sb);
93762306a36Sopenharmony_ci
93862306a36Sopenharmony_ci		spin_lock(&sb_lock);
93962306a36Sopenharmony_ci		if (p)
94062306a36Sopenharmony_ci			__put_super(p);
94162306a36Sopenharmony_ci		p = sb;
94262306a36Sopenharmony_ci	}
94362306a36Sopenharmony_ci	if (p)
94462306a36Sopenharmony_ci		__put_super(p);
94562306a36Sopenharmony_ci	spin_unlock(&sb_lock);
94662306a36Sopenharmony_ci}
94762306a36Sopenharmony_ci/**
94862306a36Sopenharmony_ci *	iterate_supers - call function for all active superblocks
94962306a36Sopenharmony_ci *	@f: function to call
95062306a36Sopenharmony_ci *	@arg: argument to pass to it
95162306a36Sopenharmony_ci *
95262306a36Sopenharmony_ci *	Scans the superblock list and calls given function, passing it
95362306a36Sopenharmony_ci *	locked superblock and given argument.
95462306a36Sopenharmony_ci */
95562306a36Sopenharmony_civoid iterate_supers(void (*f)(struct super_block *, void *), void *arg)
95662306a36Sopenharmony_ci{
95762306a36Sopenharmony_ci	struct super_block *sb, *p = NULL;
95862306a36Sopenharmony_ci
95962306a36Sopenharmony_ci	spin_lock(&sb_lock);
96062306a36Sopenharmony_ci	list_for_each_entry(sb, &super_blocks, s_list) {
96162306a36Sopenharmony_ci		bool born;
96262306a36Sopenharmony_ci
96362306a36Sopenharmony_ci		sb->s_count++;
96462306a36Sopenharmony_ci		spin_unlock(&sb_lock);
96562306a36Sopenharmony_ci
96662306a36Sopenharmony_ci		born = super_lock_shared(sb);
96762306a36Sopenharmony_ci		if (born && sb->s_root)
96862306a36Sopenharmony_ci			f(sb, arg);
96962306a36Sopenharmony_ci		super_unlock_shared(sb);
97062306a36Sopenharmony_ci
97162306a36Sopenharmony_ci		spin_lock(&sb_lock);
97262306a36Sopenharmony_ci		if (p)
97362306a36Sopenharmony_ci			__put_super(p);
97462306a36Sopenharmony_ci		p = sb;
97562306a36Sopenharmony_ci	}
97662306a36Sopenharmony_ci	if (p)
97762306a36Sopenharmony_ci		__put_super(p);
97862306a36Sopenharmony_ci	spin_unlock(&sb_lock);
97962306a36Sopenharmony_ci}
98062306a36Sopenharmony_ci
98162306a36Sopenharmony_ci/**
98262306a36Sopenharmony_ci *	iterate_supers_type - call function for superblocks of given type
98362306a36Sopenharmony_ci *	@type: fs type
98462306a36Sopenharmony_ci *	@f: function to call
98562306a36Sopenharmony_ci *	@arg: argument to pass to it
98662306a36Sopenharmony_ci *
98762306a36Sopenharmony_ci *	Scans the superblock list and calls given function, passing it
98862306a36Sopenharmony_ci *	locked superblock and given argument.
98962306a36Sopenharmony_ci */
99062306a36Sopenharmony_civoid iterate_supers_type(struct file_system_type *type,
99162306a36Sopenharmony_ci	void (*f)(struct super_block *, void *), void *arg)
99262306a36Sopenharmony_ci{
99362306a36Sopenharmony_ci	struct super_block *sb, *p = NULL;
99462306a36Sopenharmony_ci
99562306a36Sopenharmony_ci	spin_lock(&sb_lock);
99662306a36Sopenharmony_ci	hlist_for_each_entry(sb, &type->fs_supers, s_instances) {
99762306a36Sopenharmony_ci		bool born;
99862306a36Sopenharmony_ci
99962306a36Sopenharmony_ci		sb->s_count++;
100062306a36Sopenharmony_ci		spin_unlock(&sb_lock);
100162306a36Sopenharmony_ci
100262306a36Sopenharmony_ci		born = super_lock_shared(sb);
100362306a36Sopenharmony_ci		if (born && sb->s_root)
100462306a36Sopenharmony_ci			f(sb, arg);
100562306a36Sopenharmony_ci		super_unlock_shared(sb);
100662306a36Sopenharmony_ci
100762306a36Sopenharmony_ci		spin_lock(&sb_lock);
100862306a36Sopenharmony_ci		if (p)
100962306a36Sopenharmony_ci			__put_super(p);
101062306a36Sopenharmony_ci		p = sb;
101162306a36Sopenharmony_ci	}
101262306a36Sopenharmony_ci	if (p)
101362306a36Sopenharmony_ci		__put_super(p);
101462306a36Sopenharmony_ci	spin_unlock(&sb_lock);
101562306a36Sopenharmony_ci}
101662306a36Sopenharmony_ci
101762306a36Sopenharmony_ciEXPORT_SYMBOL(iterate_supers_type);
101862306a36Sopenharmony_ci
101962306a36Sopenharmony_ci/**
102062306a36Sopenharmony_ci * get_active_super - get an active reference to the superblock of a device
102162306a36Sopenharmony_ci * @bdev: device to get the superblock for
102262306a36Sopenharmony_ci *
102362306a36Sopenharmony_ci * Scans the superblock list and finds the superblock of the file system
102462306a36Sopenharmony_ci * mounted on the device given.  Returns the superblock with an active
102562306a36Sopenharmony_ci * reference or %NULL if none was found.
102662306a36Sopenharmony_ci */
102762306a36Sopenharmony_cistruct super_block *get_active_super(struct block_device *bdev)
102862306a36Sopenharmony_ci{
102962306a36Sopenharmony_ci	struct super_block *sb;
103062306a36Sopenharmony_ci
103162306a36Sopenharmony_ci	if (!bdev)
103262306a36Sopenharmony_ci		return NULL;
103362306a36Sopenharmony_ci
103462306a36Sopenharmony_ci	spin_lock(&sb_lock);
103562306a36Sopenharmony_ci	list_for_each_entry(sb, &super_blocks, s_list) {
103662306a36Sopenharmony_ci		if (sb->s_bdev == bdev) {
103762306a36Sopenharmony_ci			if (!grab_super(sb))
103862306a36Sopenharmony_ci				return NULL;
103962306a36Sopenharmony_ci			super_unlock_excl(sb);
104062306a36Sopenharmony_ci			return sb;
104162306a36Sopenharmony_ci		}
104262306a36Sopenharmony_ci	}
104362306a36Sopenharmony_ci	spin_unlock(&sb_lock);
104462306a36Sopenharmony_ci	return NULL;
104562306a36Sopenharmony_ci}
104662306a36Sopenharmony_ci
104762306a36Sopenharmony_cistruct super_block *user_get_super(dev_t dev, bool excl)
104862306a36Sopenharmony_ci{
104962306a36Sopenharmony_ci	struct super_block *sb;
105062306a36Sopenharmony_ci
105162306a36Sopenharmony_ci	spin_lock(&sb_lock);
105262306a36Sopenharmony_ci	list_for_each_entry(sb, &super_blocks, s_list) {
105362306a36Sopenharmony_ci		if (sb->s_dev ==  dev) {
105462306a36Sopenharmony_ci			bool born;
105562306a36Sopenharmony_ci
105662306a36Sopenharmony_ci			sb->s_count++;
105762306a36Sopenharmony_ci			spin_unlock(&sb_lock);
105862306a36Sopenharmony_ci			/* still alive? */
105962306a36Sopenharmony_ci			born = super_lock(sb, excl);
106062306a36Sopenharmony_ci			if (born && sb->s_root)
106162306a36Sopenharmony_ci				return sb;
106262306a36Sopenharmony_ci			super_unlock(sb, excl);
106362306a36Sopenharmony_ci			/* nope, got unmounted */
106462306a36Sopenharmony_ci			spin_lock(&sb_lock);
106562306a36Sopenharmony_ci			__put_super(sb);
106662306a36Sopenharmony_ci			break;
106762306a36Sopenharmony_ci		}
106862306a36Sopenharmony_ci	}
106962306a36Sopenharmony_ci	spin_unlock(&sb_lock);
107062306a36Sopenharmony_ci	return NULL;
107162306a36Sopenharmony_ci}
107262306a36Sopenharmony_ci
107362306a36Sopenharmony_ci/**
107462306a36Sopenharmony_ci * reconfigure_super - asks filesystem to change superblock parameters
107562306a36Sopenharmony_ci * @fc: The superblock and configuration
107662306a36Sopenharmony_ci *
107762306a36Sopenharmony_ci * Alters the configuration parameters of a live superblock.
107862306a36Sopenharmony_ci */
107962306a36Sopenharmony_ciint reconfigure_super(struct fs_context *fc)
108062306a36Sopenharmony_ci{
108162306a36Sopenharmony_ci	struct super_block *sb = fc->root->d_sb;
108262306a36Sopenharmony_ci	int retval;
108362306a36Sopenharmony_ci	bool remount_ro = false;
108462306a36Sopenharmony_ci	bool remount_rw = false;
108562306a36Sopenharmony_ci	bool force = fc->sb_flags & SB_FORCE;
108662306a36Sopenharmony_ci
108762306a36Sopenharmony_ci	if (fc->sb_flags_mask & ~MS_RMT_MASK)
108862306a36Sopenharmony_ci		return -EINVAL;
108962306a36Sopenharmony_ci	if (sb->s_writers.frozen != SB_UNFROZEN)
109062306a36Sopenharmony_ci		return -EBUSY;
109162306a36Sopenharmony_ci
109262306a36Sopenharmony_ci	retval = security_sb_remount(sb, fc->security);
109362306a36Sopenharmony_ci	if (retval)
109462306a36Sopenharmony_ci		return retval;
109562306a36Sopenharmony_ci
109662306a36Sopenharmony_ci	if (fc->sb_flags_mask & SB_RDONLY) {
109762306a36Sopenharmony_ci#ifdef CONFIG_BLOCK
109862306a36Sopenharmony_ci		if (!(fc->sb_flags & SB_RDONLY) && sb->s_bdev &&
109962306a36Sopenharmony_ci		    bdev_read_only(sb->s_bdev))
110062306a36Sopenharmony_ci			return -EACCES;
110162306a36Sopenharmony_ci#endif
110262306a36Sopenharmony_ci		remount_rw = !(fc->sb_flags & SB_RDONLY) && sb_rdonly(sb);
110362306a36Sopenharmony_ci		remount_ro = (fc->sb_flags & SB_RDONLY) && !sb_rdonly(sb);
110462306a36Sopenharmony_ci	}
110562306a36Sopenharmony_ci
110662306a36Sopenharmony_ci	if (remount_ro) {
110762306a36Sopenharmony_ci		if (!hlist_empty(&sb->s_pins)) {
110862306a36Sopenharmony_ci			super_unlock_excl(sb);
110962306a36Sopenharmony_ci			group_pin_kill(&sb->s_pins);
111062306a36Sopenharmony_ci			__super_lock_excl(sb);
111162306a36Sopenharmony_ci			if (!sb->s_root)
111262306a36Sopenharmony_ci				return 0;
111362306a36Sopenharmony_ci			if (sb->s_writers.frozen != SB_UNFROZEN)
111462306a36Sopenharmony_ci				return -EBUSY;
111562306a36Sopenharmony_ci			remount_ro = !sb_rdonly(sb);
111662306a36Sopenharmony_ci		}
111762306a36Sopenharmony_ci	}
111862306a36Sopenharmony_ci	shrink_dcache_sb(sb);
111962306a36Sopenharmony_ci
112062306a36Sopenharmony_ci	/* If we are reconfiguring to RDONLY and current sb is read/write,
112162306a36Sopenharmony_ci	 * make sure there are no files open for writing.
112262306a36Sopenharmony_ci	 */
112362306a36Sopenharmony_ci	if (remount_ro) {
112462306a36Sopenharmony_ci		if (force) {
112562306a36Sopenharmony_ci			sb_start_ro_state_change(sb);
112662306a36Sopenharmony_ci		} else {
112762306a36Sopenharmony_ci			retval = sb_prepare_remount_readonly(sb);
112862306a36Sopenharmony_ci			if (retval)
112962306a36Sopenharmony_ci				return retval;
113062306a36Sopenharmony_ci		}
113162306a36Sopenharmony_ci	} else if (remount_rw) {
113262306a36Sopenharmony_ci		/*
113362306a36Sopenharmony_ci		 * Protect filesystem's reconfigure code from writes from
113462306a36Sopenharmony_ci		 * userspace until reconfigure finishes.
113562306a36Sopenharmony_ci		 */
113662306a36Sopenharmony_ci		sb_start_ro_state_change(sb);
113762306a36Sopenharmony_ci	}
113862306a36Sopenharmony_ci
113962306a36Sopenharmony_ci	if (fc->ops->reconfigure) {
114062306a36Sopenharmony_ci		retval = fc->ops->reconfigure(fc);
114162306a36Sopenharmony_ci		if (retval) {
114262306a36Sopenharmony_ci			if (!force)
114362306a36Sopenharmony_ci				goto cancel_readonly;
114462306a36Sopenharmony_ci			/* If forced remount, go ahead despite any errors */
114562306a36Sopenharmony_ci			WARN(1, "forced remount of a %s fs returned %i\n",
114662306a36Sopenharmony_ci			     sb->s_type->name, retval);
114762306a36Sopenharmony_ci		}
114862306a36Sopenharmony_ci	}
114962306a36Sopenharmony_ci
115062306a36Sopenharmony_ci	WRITE_ONCE(sb->s_flags, ((sb->s_flags & ~fc->sb_flags_mask) |
115162306a36Sopenharmony_ci				 (fc->sb_flags & fc->sb_flags_mask)));
115262306a36Sopenharmony_ci	sb_end_ro_state_change(sb);
115362306a36Sopenharmony_ci
115462306a36Sopenharmony_ci	/*
115562306a36Sopenharmony_ci	 * Some filesystems modify their metadata via some other path than the
115662306a36Sopenharmony_ci	 * bdev buffer cache (eg. use a private mapping, or directories in
115762306a36Sopenharmony_ci	 * pagecache, etc). Also file data modifications go via their own
115862306a36Sopenharmony_ci	 * mappings. So If we try to mount readonly then copy the filesystem
115962306a36Sopenharmony_ci	 * from bdev, we could get stale data, so invalidate it to give a best
116062306a36Sopenharmony_ci	 * effort at coherency.
116162306a36Sopenharmony_ci	 */
116262306a36Sopenharmony_ci	if (remount_ro && sb->s_bdev)
116362306a36Sopenharmony_ci		invalidate_bdev(sb->s_bdev);
116462306a36Sopenharmony_ci	return 0;
116562306a36Sopenharmony_ci
116662306a36Sopenharmony_cicancel_readonly:
116762306a36Sopenharmony_ci	sb_end_ro_state_change(sb);
116862306a36Sopenharmony_ci	return retval;
116962306a36Sopenharmony_ci}
117062306a36Sopenharmony_ci
117162306a36Sopenharmony_cistatic void do_emergency_remount_callback(struct super_block *sb)
117262306a36Sopenharmony_ci{
117362306a36Sopenharmony_ci	bool born = super_lock_excl(sb);
117462306a36Sopenharmony_ci
117562306a36Sopenharmony_ci	if (born && sb->s_root && sb->s_bdev && !sb_rdonly(sb)) {
117662306a36Sopenharmony_ci		struct fs_context *fc;
117762306a36Sopenharmony_ci
117862306a36Sopenharmony_ci		fc = fs_context_for_reconfigure(sb->s_root,
117962306a36Sopenharmony_ci					SB_RDONLY | SB_FORCE, SB_RDONLY);
118062306a36Sopenharmony_ci		if (!IS_ERR(fc)) {
118162306a36Sopenharmony_ci			if (parse_monolithic_mount_data(fc, NULL) == 0)
118262306a36Sopenharmony_ci				(void)reconfigure_super(fc);
118362306a36Sopenharmony_ci			put_fs_context(fc);
118462306a36Sopenharmony_ci		}
118562306a36Sopenharmony_ci	}
118662306a36Sopenharmony_ci	super_unlock_excl(sb);
118762306a36Sopenharmony_ci}
118862306a36Sopenharmony_ci
118962306a36Sopenharmony_cistatic void do_emergency_remount(struct work_struct *work)
119062306a36Sopenharmony_ci{
119162306a36Sopenharmony_ci	__iterate_supers(do_emergency_remount_callback);
119262306a36Sopenharmony_ci	kfree(work);
119362306a36Sopenharmony_ci	printk("Emergency Remount complete\n");
119462306a36Sopenharmony_ci}
119562306a36Sopenharmony_ci
119662306a36Sopenharmony_civoid emergency_remount(void)
119762306a36Sopenharmony_ci{
119862306a36Sopenharmony_ci	struct work_struct *work;
119962306a36Sopenharmony_ci
120062306a36Sopenharmony_ci	work = kmalloc(sizeof(*work), GFP_ATOMIC);
120162306a36Sopenharmony_ci	if (work) {
120262306a36Sopenharmony_ci		INIT_WORK(work, do_emergency_remount);
120362306a36Sopenharmony_ci		schedule_work(work);
120462306a36Sopenharmony_ci	}
120562306a36Sopenharmony_ci}
120662306a36Sopenharmony_ci
120762306a36Sopenharmony_cistatic void do_thaw_all_callback(struct super_block *sb)
120862306a36Sopenharmony_ci{
120962306a36Sopenharmony_ci	bool born = super_lock_excl(sb);
121062306a36Sopenharmony_ci
121162306a36Sopenharmony_ci	if (born && sb->s_root) {
121262306a36Sopenharmony_ci		if (IS_ENABLED(CONFIG_BLOCK))
121362306a36Sopenharmony_ci			while (sb->s_bdev && !thaw_bdev(sb->s_bdev))
121462306a36Sopenharmony_ci				pr_warn("Emergency Thaw on %pg\n", sb->s_bdev);
121562306a36Sopenharmony_ci		thaw_super_locked(sb, FREEZE_HOLDER_USERSPACE);
121662306a36Sopenharmony_ci	} else {
121762306a36Sopenharmony_ci		super_unlock_excl(sb);
121862306a36Sopenharmony_ci	}
121962306a36Sopenharmony_ci}
122062306a36Sopenharmony_ci
122162306a36Sopenharmony_cistatic void do_thaw_all(struct work_struct *work)
122262306a36Sopenharmony_ci{
122362306a36Sopenharmony_ci	__iterate_supers(do_thaw_all_callback);
122462306a36Sopenharmony_ci	kfree(work);
122562306a36Sopenharmony_ci	printk(KERN_WARNING "Emergency Thaw complete\n");
122662306a36Sopenharmony_ci}
122762306a36Sopenharmony_ci
122862306a36Sopenharmony_ci/**
122962306a36Sopenharmony_ci * emergency_thaw_all -- forcibly thaw every frozen filesystem
123062306a36Sopenharmony_ci *
123162306a36Sopenharmony_ci * Used for emergency unfreeze of all filesystems via SysRq
123262306a36Sopenharmony_ci */
123362306a36Sopenharmony_civoid emergency_thaw_all(void)
123462306a36Sopenharmony_ci{
123562306a36Sopenharmony_ci	struct work_struct *work;
123662306a36Sopenharmony_ci
123762306a36Sopenharmony_ci	work = kmalloc(sizeof(*work), GFP_ATOMIC);
123862306a36Sopenharmony_ci	if (work) {
123962306a36Sopenharmony_ci		INIT_WORK(work, do_thaw_all);
124062306a36Sopenharmony_ci		schedule_work(work);
124162306a36Sopenharmony_ci	}
124262306a36Sopenharmony_ci}
124362306a36Sopenharmony_ci
124462306a36Sopenharmony_cistatic DEFINE_IDA(unnamed_dev_ida);
124562306a36Sopenharmony_ci
124662306a36Sopenharmony_ci/**
124762306a36Sopenharmony_ci * get_anon_bdev - Allocate a block device for filesystems which don't have one.
124862306a36Sopenharmony_ci * @p: Pointer to a dev_t.
124962306a36Sopenharmony_ci *
125062306a36Sopenharmony_ci * Filesystems which don't use real block devices can call this function
125162306a36Sopenharmony_ci * to allocate a virtual block device.
125262306a36Sopenharmony_ci *
125362306a36Sopenharmony_ci * Context: Any context.  Frequently called while holding sb_lock.
125462306a36Sopenharmony_ci * Return: 0 on success, -EMFILE if there are no anonymous bdevs left
125562306a36Sopenharmony_ci * or -ENOMEM if memory allocation failed.
125662306a36Sopenharmony_ci */
125762306a36Sopenharmony_ciint get_anon_bdev(dev_t *p)
125862306a36Sopenharmony_ci{
125962306a36Sopenharmony_ci	int dev;
126062306a36Sopenharmony_ci
126162306a36Sopenharmony_ci	/*
126262306a36Sopenharmony_ci	 * Many userspace utilities consider an FSID of 0 invalid.
126362306a36Sopenharmony_ci	 * Always return at least 1 from get_anon_bdev.
126462306a36Sopenharmony_ci	 */
126562306a36Sopenharmony_ci	dev = ida_alloc_range(&unnamed_dev_ida, 1, (1 << MINORBITS) - 1,
126662306a36Sopenharmony_ci			GFP_ATOMIC);
126762306a36Sopenharmony_ci	if (dev == -ENOSPC)
126862306a36Sopenharmony_ci		dev = -EMFILE;
126962306a36Sopenharmony_ci	if (dev < 0)
127062306a36Sopenharmony_ci		return dev;
127162306a36Sopenharmony_ci
127262306a36Sopenharmony_ci	*p = MKDEV(0, dev);
127362306a36Sopenharmony_ci	return 0;
127462306a36Sopenharmony_ci}
127562306a36Sopenharmony_ciEXPORT_SYMBOL(get_anon_bdev);
127662306a36Sopenharmony_ci
127762306a36Sopenharmony_civoid free_anon_bdev(dev_t dev)
127862306a36Sopenharmony_ci{
127962306a36Sopenharmony_ci	ida_free(&unnamed_dev_ida, MINOR(dev));
128062306a36Sopenharmony_ci}
128162306a36Sopenharmony_ciEXPORT_SYMBOL(free_anon_bdev);
128262306a36Sopenharmony_ci
128362306a36Sopenharmony_ciint set_anon_super(struct super_block *s, void *data)
128462306a36Sopenharmony_ci{
128562306a36Sopenharmony_ci	return get_anon_bdev(&s->s_dev);
128662306a36Sopenharmony_ci}
128762306a36Sopenharmony_ciEXPORT_SYMBOL(set_anon_super);
128862306a36Sopenharmony_ci
128962306a36Sopenharmony_civoid kill_anon_super(struct super_block *sb)
129062306a36Sopenharmony_ci{
129162306a36Sopenharmony_ci	dev_t dev = sb->s_dev;
129262306a36Sopenharmony_ci	generic_shutdown_super(sb);
129362306a36Sopenharmony_ci	kill_super_notify(sb);
129462306a36Sopenharmony_ci	free_anon_bdev(dev);
129562306a36Sopenharmony_ci}
129662306a36Sopenharmony_ciEXPORT_SYMBOL(kill_anon_super);
129762306a36Sopenharmony_ci
129862306a36Sopenharmony_civoid kill_litter_super(struct super_block *sb)
129962306a36Sopenharmony_ci{
130062306a36Sopenharmony_ci	if (sb->s_root)
130162306a36Sopenharmony_ci		d_genocide(sb->s_root);
130262306a36Sopenharmony_ci	kill_anon_super(sb);
130362306a36Sopenharmony_ci}
130462306a36Sopenharmony_ciEXPORT_SYMBOL(kill_litter_super);
130562306a36Sopenharmony_ci
130662306a36Sopenharmony_ciint set_anon_super_fc(struct super_block *sb, struct fs_context *fc)
130762306a36Sopenharmony_ci{
130862306a36Sopenharmony_ci	return set_anon_super(sb, NULL);
130962306a36Sopenharmony_ci}
131062306a36Sopenharmony_ciEXPORT_SYMBOL(set_anon_super_fc);
131162306a36Sopenharmony_ci
131262306a36Sopenharmony_cistatic int test_keyed_super(struct super_block *sb, struct fs_context *fc)
131362306a36Sopenharmony_ci{
131462306a36Sopenharmony_ci	return sb->s_fs_info == fc->s_fs_info;
131562306a36Sopenharmony_ci}
131662306a36Sopenharmony_ci
131762306a36Sopenharmony_cistatic int test_single_super(struct super_block *s, struct fs_context *fc)
131862306a36Sopenharmony_ci{
131962306a36Sopenharmony_ci	return 1;
132062306a36Sopenharmony_ci}
132162306a36Sopenharmony_ci
132262306a36Sopenharmony_cistatic int vfs_get_super(struct fs_context *fc,
132362306a36Sopenharmony_ci		int (*test)(struct super_block *, struct fs_context *),
132462306a36Sopenharmony_ci		int (*fill_super)(struct super_block *sb,
132562306a36Sopenharmony_ci				  struct fs_context *fc))
132662306a36Sopenharmony_ci{
132762306a36Sopenharmony_ci	struct super_block *sb;
132862306a36Sopenharmony_ci	int err;
132962306a36Sopenharmony_ci
133062306a36Sopenharmony_ci	sb = sget_fc(fc, test, set_anon_super_fc);
133162306a36Sopenharmony_ci	if (IS_ERR(sb))
133262306a36Sopenharmony_ci		return PTR_ERR(sb);
133362306a36Sopenharmony_ci
133462306a36Sopenharmony_ci	if (!sb->s_root) {
133562306a36Sopenharmony_ci		err = fill_super(sb, fc);
133662306a36Sopenharmony_ci		if (err)
133762306a36Sopenharmony_ci			goto error;
133862306a36Sopenharmony_ci
133962306a36Sopenharmony_ci		sb->s_flags |= SB_ACTIVE;
134062306a36Sopenharmony_ci	}
134162306a36Sopenharmony_ci
134262306a36Sopenharmony_ci	fc->root = dget(sb->s_root);
134362306a36Sopenharmony_ci	return 0;
134462306a36Sopenharmony_ci
134562306a36Sopenharmony_cierror:
134662306a36Sopenharmony_ci	deactivate_locked_super(sb);
134762306a36Sopenharmony_ci	return err;
134862306a36Sopenharmony_ci}
134962306a36Sopenharmony_ci
135062306a36Sopenharmony_ciint get_tree_nodev(struct fs_context *fc,
135162306a36Sopenharmony_ci		  int (*fill_super)(struct super_block *sb,
135262306a36Sopenharmony_ci				    struct fs_context *fc))
135362306a36Sopenharmony_ci{
135462306a36Sopenharmony_ci	return vfs_get_super(fc, NULL, fill_super);
135562306a36Sopenharmony_ci}
135662306a36Sopenharmony_ciEXPORT_SYMBOL(get_tree_nodev);
135762306a36Sopenharmony_ci
135862306a36Sopenharmony_ciint get_tree_single(struct fs_context *fc,
135962306a36Sopenharmony_ci		  int (*fill_super)(struct super_block *sb,
136062306a36Sopenharmony_ci				    struct fs_context *fc))
136162306a36Sopenharmony_ci{
136262306a36Sopenharmony_ci	return vfs_get_super(fc, test_single_super, fill_super);
136362306a36Sopenharmony_ci}
136462306a36Sopenharmony_ciEXPORT_SYMBOL(get_tree_single);
136562306a36Sopenharmony_ci
136662306a36Sopenharmony_ciint get_tree_keyed(struct fs_context *fc,
136762306a36Sopenharmony_ci		  int (*fill_super)(struct super_block *sb,
136862306a36Sopenharmony_ci				    struct fs_context *fc),
136962306a36Sopenharmony_ci		void *key)
137062306a36Sopenharmony_ci{
137162306a36Sopenharmony_ci	fc->s_fs_info = key;
137262306a36Sopenharmony_ci	return vfs_get_super(fc, test_keyed_super, fill_super);
137362306a36Sopenharmony_ci}
137462306a36Sopenharmony_ciEXPORT_SYMBOL(get_tree_keyed);
137562306a36Sopenharmony_ci
137662306a36Sopenharmony_cistatic int set_bdev_super(struct super_block *s, void *data)
137762306a36Sopenharmony_ci{
137862306a36Sopenharmony_ci	s->s_dev = *(dev_t *)data;
137962306a36Sopenharmony_ci	return 0;
138062306a36Sopenharmony_ci}
138162306a36Sopenharmony_ci
138262306a36Sopenharmony_cistatic int super_s_dev_set(struct super_block *s, struct fs_context *fc)
138362306a36Sopenharmony_ci{
138462306a36Sopenharmony_ci	return set_bdev_super(s, fc->sget_key);
138562306a36Sopenharmony_ci}
138662306a36Sopenharmony_ci
138762306a36Sopenharmony_cistatic int super_s_dev_test(struct super_block *s, struct fs_context *fc)
138862306a36Sopenharmony_ci{
138962306a36Sopenharmony_ci	return !(s->s_iflags & SB_I_RETIRED) &&
139062306a36Sopenharmony_ci		s->s_dev == *(dev_t *)fc->sget_key;
139162306a36Sopenharmony_ci}
139262306a36Sopenharmony_ci
139362306a36Sopenharmony_ci/**
139462306a36Sopenharmony_ci * sget_dev - Find or create a superblock by device number
139562306a36Sopenharmony_ci * @fc: Filesystem context.
139662306a36Sopenharmony_ci * @dev: device number
139762306a36Sopenharmony_ci *
139862306a36Sopenharmony_ci * Find or create a superblock using the provided device number that
139962306a36Sopenharmony_ci * will be stored in fc->sget_key.
140062306a36Sopenharmony_ci *
140162306a36Sopenharmony_ci * If an extant superblock is matched, then that will be returned with
140262306a36Sopenharmony_ci * an elevated reference count that the caller must transfer or discard.
140362306a36Sopenharmony_ci *
140462306a36Sopenharmony_ci * If no match is made, a new superblock will be allocated and basic
140562306a36Sopenharmony_ci * initialisation will be performed (s_type, s_fs_info, s_id, s_dev will
140662306a36Sopenharmony_ci * be set). The superblock will be published and it will be returned in
140762306a36Sopenharmony_ci * a partially constructed state with SB_BORN and SB_ACTIVE as yet
140862306a36Sopenharmony_ci * unset.
140962306a36Sopenharmony_ci *
141062306a36Sopenharmony_ci * Return: an existing or newly created superblock on success, an error
141162306a36Sopenharmony_ci *         pointer on failure.
141262306a36Sopenharmony_ci */
141362306a36Sopenharmony_cistruct super_block *sget_dev(struct fs_context *fc, dev_t dev)
141462306a36Sopenharmony_ci{
141562306a36Sopenharmony_ci	fc->sget_key = &dev;
141662306a36Sopenharmony_ci	return sget_fc(fc, super_s_dev_test, super_s_dev_set);
141762306a36Sopenharmony_ci}
141862306a36Sopenharmony_ciEXPORT_SYMBOL(sget_dev);
141962306a36Sopenharmony_ci
142062306a36Sopenharmony_ci#ifdef CONFIG_BLOCK
142162306a36Sopenharmony_ci/*
142262306a36Sopenharmony_ci * Lock a super block that the callers holds a reference to.
142362306a36Sopenharmony_ci *
142462306a36Sopenharmony_ci * The caller needs to ensure that the super_block isn't being freed while
142562306a36Sopenharmony_ci * calling this function, e.g. by holding a lock over the call to this function
142662306a36Sopenharmony_ci * and the place that clears the pointer to the superblock used by this function
142762306a36Sopenharmony_ci * before freeing the superblock.
142862306a36Sopenharmony_ci */
142962306a36Sopenharmony_cistatic bool super_lock_shared_active(struct super_block *sb)
143062306a36Sopenharmony_ci{
143162306a36Sopenharmony_ci	bool born = super_lock_shared(sb);
143262306a36Sopenharmony_ci
143362306a36Sopenharmony_ci	if (!born || !sb->s_root || !(sb->s_flags & SB_ACTIVE)) {
143462306a36Sopenharmony_ci		super_unlock_shared(sb);
143562306a36Sopenharmony_ci		return false;
143662306a36Sopenharmony_ci	}
143762306a36Sopenharmony_ci	return true;
143862306a36Sopenharmony_ci}
143962306a36Sopenharmony_ci
144062306a36Sopenharmony_cistatic void fs_bdev_mark_dead(struct block_device *bdev, bool surprise)
144162306a36Sopenharmony_ci{
144262306a36Sopenharmony_ci	struct super_block *sb = bdev->bd_holder;
144362306a36Sopenharmony_ci
144462306a36Sopenharmony_ci	/* bd_holder_lock ensures that the sb isn't freed */
144562306a36Sopenharmony_ci	lockdep_assert_held(&bdev->bd_holder_lock);
144662306a36Sopenharmony_ci
144762306a36Sopenharmony_ci	if (!super_lock_shared_active(sb))
144862306a36Sopenharmony_ci		return;
144962306a36Sopenharmony_ci
145062306a36Sopenharmony_ci	if (!surprise)
145162306a36Sopenharmony_ci		sync_filesystem(sb);
145262306a36Sopenharmony_ci	shrink_dcache_sb(sb);
145362306a36Sopenharmony_ci	invalidate_inodes(sb);
145462306a36Sopenharmony_ci	if (sb->s_op->shutdown)
145562306a36Sopenharmony_ci		sb->s_op->shutdown(sb);
145662306a36Sopenharmony_ci
145762306a36Sopenharmony_ci	super_unlock_shared(sb);
145862306a36Sopenharmony_ci}
145962306a36Sopenharmony_ci
146062306a36Sopenharmony_cistatic void fs_bdev_sync(struct block_device *bdev)
146162306a36Sopenharmony_ci{
146262306a36Sopenharmony_ci	struct super_block *sb = bdev->bd_holder;
146362306a36Sopenharmony_ci
146462306a36Sopenharmony_ci	lockdep_assert_held(&bdev->bd_holder_lock);
146562306a36Sopenharmony_ci
146662306a36Sopenharmony_ci	if (!super_lock_shared_active(sb))
146762306a36Sopenharmony_ci		return;
146862306a36Sopenharmony_ci	sync_filesystem(sb);
146962306a36Sopenharmony_ci	super_unlock_shared(sb);
147062306a36Sopenharmony_ci}
147162306a36Sopenharmony_ci
147262306a36Sopenharmony_ciconst struct blk_holder_ops fs_holder_ops = {
147362306a36Sopenharmony_ci	.mark_dead		= fs_bdev_mark_dead,
147462306a36Sopenharmony_ci	.sync			= fs_bdev_sync,
147562306a36Sopenharmony_ci};
147662306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(fs_holder_ops);
147762306a36Sopenharmony_ci
147862306a36Sopenharmony_ciint setup_bdev_super(struct super_block *sb, int sb_flags,
147962306a36Sopenharmony_ci		struct fs_context *fc)
148062306a36Sopenharmony_ci{
148162306a36Sopenharmony_ci	blk_mode_t mode = sb_open_mode(sb_flags);
148262306a36Sopenharmony_ci	struct block_device *bdev;
148362306a36Sopenharmony_ci
148462306a36Sopenharmony_ci	bdev = blkdev_get_by_dev(sb->s_dev, mode, sb, &fs_holder_ops);
148562306a36Sopenharmony_ci	if (IS_ERR(bdev)) {
148662306a36Sopenharmony_ci		if (fc)
148762306a36Sopenharmony_ci			errorf(fc, "%s: Can't open blockdev", fc->source);
148862306a36Sopenharmony_ci		return PTR_ERR(bdev);
148962306a36Sopenharmony_ci	}
149062306a36Sopenharmony_ci
149162306a36Sopenharmony_ci	/*
149262306a36Sopenharmony_ci	 * This really should be in blkdev_get_by_dev, but right now can't due
149362306a36Sopenharmony_ci	 * to legacy issues that require us to allow opening a block device node
149462306a36Sopenharmony_ci	 * writable from userspace even for a read-only block device.
149562306a36Sopenharmony_ci	 */
149662306a36Sopenharmony_ci	if ((mode & BLK_OPEN_WRITE) && bdev_read_only(bdev)) {
149762306a36Sopenharmony_ci		blkdev_put(bdev, sb);
149862306a36Sopenharmony_ci		return -EACCES;
149962306a36Sopenharmony_ci	}
150062306a36Sopenharmony_ci
150162306a36Sopenharmony_ci	/*
150262306a36Sopenharmony_ci	 * Until SB_BORN flag is set, there can be no active superblock
150362306a36Sopenharmony_ci	 * references and thus no filesystem freezing. get_active_super() will
150462306a36Sopenharmony_ci	 * just loop waiting for SB_BORN so even freeze_bdev() cannot proceed.
150562306a36Sopenharmony_ci	 *
150662306a36Sopenharmony_ci	 * It is enough to check bdev was not frozen before we set s_bdev.
150762306a36Sopenharmony_ci	 */
150862306a36Sopenharmony_ci	mutex_lock(&bdev->bd_fsfreeze_mutex);
150962306a36Sopenharmony_ci	if (bdev->bd_fsfreeze_count > 0) {
151062306a36Sopenharmony_ci		mutex_unlock(&bdev->bd_fsfreeze_mutex);
151162306a36Sopenharmony_ci		if (fc)
151262306a36Sopenharmony_ci			warnf(fc, "%pg: Can't mount, blockdev is frozen", bdev);
151362306a36Sopenharmony_ci		blkdev_put(bdev, sb);
151462306a36Sopenharmony_ci		return -EBUSY;
151562306a36Sopenharmony_ci	}
151662306a36Sopenharmony_ci	spin_lock(&sb_lock);
151762306a36Sopenharmony_ci	sb->s_bdev = bdev;
151862306a36Sopenharmony_ci	sb->s_bdi = bdi_get(bdev->bd_disk->bdi);
151962306a36Sopenharmony_ci	if (bdev_stable_writes(bdev))
152062306a36Sopenharmony_ci		sb->s_iflags |= SB_I_STABLE_WRITES;
152162306a36Sopenharmony_ci	spin_unlock(&sb_lock);
152262306a36Sopenharmony_ci	mutex_unlock(&bdev->bd_fsfreeze_mutex);
152362306a36Sopenharmony_ci
152462306a36Sopenharmony_ci	snprintf(sb->s_id, sizeof(sb->s_id), "%pg", bdev);
152562306a36Sopenharmony_ci	shrinker_debugfs_rename(&sb->s_shrink, "sb-%s:%s", sb->s_type->name,
152662306a36Sopenharmony_ci				sb->s_id);
152762306a36Sopenharmony_ci	sb_set_blocksize(sb, block_size(bdev));
152862306a36Sopenharmony_ci	return 0;
152962306a36Sopenharmony_ci}
153062306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(setup_bdev_super);
153162306a36Sopenharmony_ci
153262306a36Sopenharmony_ci/**
153362306a36Sopenharmony_ci * get_tree_bdev - Get a superblock based on a single block device
153462306a36Sopenharmony_ci * @fc: The filesystem context holding the parameters
153562306a36Sopenharmony_ci * @fill_super: Helper to initialise a new superblock
153662306a36Sopenharmony_ci */
153762306a36Sopenharmony_ciint get_tree_bdev(struct fs_context *fc,
153862306a36Sopenharmony_ci		int (*fill_super)(struct super_block *,
153962306a36Sopenharmony_ci				  struct fs_context *))
154062306a36Sopenharmony_ci{
154162306a36Sopenharmony_ci	struct super_block *s;
154262306a36Sopenharmony_ci	int error = 0;
154362306a36Sopenharmony_ci	dev_t dev;
154462306a36Sopenharmony_ci
154562306a36Sopenharmony_ci	if (!fc->source)
154662306a36Sopenharmony_ci		return invalf(fc, "No source specified");
154762306a36Sopenharmony_ci
154862306a36Sopenharmony_ci	error = lookup_bdev(fc->source, &dev);
154962306a36Sopenharmony_ci	if (error) {
155062306a36Sopenharmony_ci		errorf(fc, "%s: Can't lookup blockdev", fc->source);
155162306a36Sopenharmony_ci		return error;
155262306a36Sopenharmony_ci	}
155362306a36Sopenharmony_ci
155462306a36Sopenharmony_ci	fc->sb_flags |= SB_NOSEC;
155562306a36Sopenharmony_ci	s = sget_dev(fc, dev);
155662306a36Sopenharmony_ci	if (IS_ERR(s))
155762306a36Sopenharmony_ci		return PTR_ERR(s);
155862306a36Sopenharmony_ci
155962306a36Sopenharmony_ci	if (s->s_root) {
156062306a36Sopenharmony_ci		/* Don't summarily change the RO/RW state. */
156162306a36Sopenharmony_ci		if ((fc->sb_flags ^ s->s_flags) & SB_RDONLY) {
156262306a36Sopenharmony_ci			warnf(fc, "%pg: Can't mount, would change RO state", s->s_bdev);
156362306a36Sopenharmony_ci			deactivate_locked_super(s);
156462306a36Sopenharmony_ci			return -EBUSY;
156562306a36Sopenharmony_ci		}
156662306a36Sopenharmony_ci	} else {
156762306a36Sopenharmony_ci		/*
156862306a36Sopenharmony_ci		 * We drop s_umount here because we need to open the bdev and
156962306a36Sopenharmony_ci		 * bdev->open_mutex ranks above s_umount (blkdev_put() ->
157062306a36Sopenharmony_ci		 * bdev_mark_dead()). It is safe because we have active sb
157162306a36Sopenharmony_ci		 * reference and SB_BORN is not set yet.
157262306a36Sopenharmony_ci		 */
157362306a36Sopenharmony_ci		super_unlock_excl(s);
157462306a36Sopenharmony_ci		error = setup_bdev_super(s, fc->sb_flags, fc);
157562306a36Sopenharmony_ci		__super_lock_excl(s);
157662306a36Sopenharmony_ci		if (!error)
157762306a36Sopenharmony_ci			error = fill_super(s, fc);
157862306a36Sopenharmony_ci		if (error) {
157962306a36Sopenharmony_ci			deactivate_locked_super(s);
158062306a36Sopenharmony_ci			return error;
158162306a36Sopenharmony_ci		}
158262306a36Sopenharmony_ci		s->s_flags |= SB_ACTIVE;
158362306a36Sopenharmony_ci	}
158462306a36Sopenharmony_ci
158562306a36Sopenharmony_ci	BUG_ON(fc->root);
158662306a36Sopenharmony_ci	fc->root = dget(s->s_root);
158762306a36Sopenharmony_ci	return 0;
158862306a36Sopenharmony_ci}
158962306a36Sopenharmony_ciEXPORT_SYMBOL(get_tree_bdev);
159062306a36Sopenharmony_ci
159162306a36Sopenharmony_cistatic int test_bdev_super(struct super_block *s, void *data)
159262306a36Sopenharmony_ci{
159362306a36Sopenharmony_ci	return !(s->s_iflags & SB_I_RETIRED) && s->s_dev == *(dev_t *)data;
159462306a36Sopenharmony_ci}
159562306a36Sopenharmony_ci
159662306a36Sopenharmony_cistruct dentry *mount_bdev(struct file_system_type *fs_type,
159762306a36Sopenharmony_ci	int flags, const char *dev_name, void *data,
159862306a36Sopenharmony_ci	int (*fill_super)(struct super_block *, void *, int))
159962306a36Sopenharmony_ci{
160062306a36Sopenharmony_ci	struct super_block *s;
160162306a36Sopenharmony_ci	int error;
160262306a36Sopenharmony_ci	dev_t dev;
160362306a36Sopenharmony_ci
160462306a36Sopenharmony_ci	error = lookup_bdev(dev_name, &dev);
160562306a36Sopenharmony_ci	if (error)
160662306a36Sopenharmony_ci		return ERR_PTR(error);
160762306a36Sopenharmony_ci
160862306a36Sopenharmony_ci	flags |= SB_NOSEC;
160962306a36Sopenharmony_ci	s = sget(fs_type, test_bdev_super, set_bdev_super, flags, &dev);
161062306a36Sopenharmony_ci	if (IS_ERR(s))
161162306a36Sopenharmony_ci		return ERR_CAST(s);
161262306a36Sopenharmony_ci
161362306a36Sopenharmony_ci	if (s->s_root) {
161462306a36Sopenharmony_ci		if ((flags ^ s->s_flags) & SB_RDONLY) {
161562306a36Sopenharmony_ci			deactivate_locked_super(s);
161662306a36Sopenharmony_ci			return ERR_PTR(-EBUSY);
161762306a36Sopenharmony_ci		}
161862306a36Sopenharmony_ci	} else {
161962306a36Sopenharmony_ci		/*
162062306a36Sopenharmony_ci		 * We drop s_umount here because we need to open the bdev and
162162306a36Sopenharmony_ci		 * bdev->open_mutex ranks above s_umount (blkdev_put() ->
162262306a36Sopenharmony_ci		 * bdev_mark_dead()). It is safe because we have active sb
162362306a36Sopenharmony_ci		 * reference and SB_BORN is not set yet.
162462306a36Sopenharmony_ci		 */
162562306a36Sopenharmony_ci		super_unlock_excl(s);
162662306a36Sopenharmony_ci		error = setup_bdev_super(s, flags, NULL);
162762306a36Sopenharmony_ci		__super_lock_excl(s);
162862306a36Sopenharmony_ci		if (!error)
162962306a36Sopenharmony_ci			error = fill_super(s, data, flags & SB_SILENT ? 1 : 0);
163062306a36Sopenharmony_ci		if (error) {
163162306a36Sopenharmony_ci			deactivate_locked_super(s);
163262306a36Sopenharmony_ci			return ERR_PTR(error);
163362306a36Sopenharmony_ci		}
163462306a36Sopenharmony_ci
163562306a36Sopenharmony_ci		s->s_flags |= SB_ACTIVE;
163662306a36Sopenharmony_ci	}
163762306a36Sopenharmony_ci
163862306a36Sopenharmony_ci	return dget(s->s_root);
163962306a36Sopenharmony_ci}
164062306a36Sopenharmony_ciEXPORT_SYMBOL(mount_bdev);
164162306a36Sopenharmony_ci
164262306a36Sopenharmony_civoid kill_block_super(struct super_block *sb)
164362306a36Sopenharmony_ci{
164462306a36Sopenharmony_ci	struct block_device *bdev = sb->s_bdev;
164562306a36Sopenharmony_ci
164662306a36Sopenharmony_ci	generic_shutdown_super(sb);
164762306a36Sopenharmony_ci	if (bdev) {
164862306a36Sopenharmony_ci		sync_blockdev(bdev);
164962306a36Sopenharmony_ci		blkdev_put(bdev, sb);
165062306a36Sopenharmony_ci	}
165162306a36Sopenharmony_ci}
165262306a36Sopenharmony_ci
165362306a36Sopenharmony_ciEXPORT_SYMBOL(kill_block_super);
165462306a36Sopenharmony_ci#endif
165562306a36Sopenharmony_ci
165662306a36Sopenharmony_cistruct dentry *mount_nodev(struct file_system_type *fs_type,
165762306a36Sopenharmony_ci	int flags, void *data,
165862306a36Sopenharmony_ci	int (*fill_super)(struct super_block *, void *, int))
165962306a36Sopenharmony_ci{
166062306a36Sopenharmony_ci	int error;
166162306a36Sopenharmony_ci	struct super_block *s = sget(fs_type, NULL, set_anon_super, flags, NULL);
166262306a36Sopenharmony_ci
166362306a36Sopenharmony_ci	if (IS_ERR(s))
166462306a36Sopenharmony_ci		return ERR_CAST(s);
166562306a36Sopenharmony_ci
166662306a36Sopenharmony_ci	error = fill_super(s, data, flags & SB_SILENT ? 1 : 0);
166762306a36Sopenharmony_ci	if (error) {
166862306a36Sopenharmony_ci		deactivate_locked_super(s);
166962306a36Sopenharmony_ci		return ERR_PTR(error);
167062306a36Sopenharmony_ci	}
167162306a36Sopenharmony_ci	s->s_flags |= SB_ACTIVE;
167262306a36Sopenharmony_ci	return dget(s->s_root);
167362306a36Sopenharmony_ci}
167462306a36Sopenharmony_ciEXPORT_SYMBOL(mount_nodev);
167562306a36Sopenharmony_ci
167662306a36Sopenharmony_ciint reconfigure_single(struct super_block *s,
167762306a36Sopenharmony_ci		       int flags, void *data)
167862306a36Sopenharmony_ci{
167962306a36Sopenharmony_ci	struct fs_context *fc;
168062306a36Sopenharmony_ci	int ret;
168162306a36Sopenharmony_ci
168262306a36Sopenharmony_ci	/* The caller really need to be passing fc down into mount_single(),
168362306a36Sopenharmony_ci	 * then a chunk of this can be removed.  [Bollocks -- AV]
168462306a36Sopenharmony_ci	 * Better yet, reconfiguration shouldn't happen, but rather the second
168562306a36Sopenharmony_ci	 * mount should be rejected if the parameters are not compatible.
168662306a36Sopenharmony_ci	 */
168762306a36Sopenharmony_ci	fc = fs_context_for_reconfigure(s->s_root, flags, MS_RMT_MASK);
168862306a36Sopenharmony_ci	if (IS_ERR(fc))
168962306a36Sopenharmony_ci		return PTR_ERR(fc);
169062306a36Sopenharmony_ci
169162306a36Sopenharmony_ci	ret = parse_monolithic_mount_data(fc, data);
169262306a36Sopenharmony_ci	if (ret < 0)
169362306a36Sopenharmony_ci		goto out;
169462306a36Sopenharmony_ci
169562306a36Sopenharmony_ci	ret = reconfigure_super(fc);
169662306a36Sopenharmony_ciout:
169762306a36Sopenharmony_ci	put_fs_context(fc);
169862306a36Sopenharmony_ci	return ret;
169962306a36Sopenharmony_ci}
170062306a36Sopenharmony_ci
170162306a36Sopenharmony_cistatic int compare_single(struct super_block *s, void *p)
170262306a36Sopenharmony_ci{
170362306a36Sopenharmony_ci	return 1;
170462306a36Sopenharmony_ci}
170562306a36Sopenharmony_ci
170662306a36Sopenharmony_cistruct dentry *mount_single(struct file_system_type *fs_type,
170762306a36Sopenharmony_ci	int flags, void *data,
170862306a36Sopenharmony_ci	int (*fill_super)(struct super_block *, void *, int))
170962306a36Sopenharmony_ci{
171062306a36Sopenharmony_ci	struct super_block *s;
171162306a36Sopenharmony_ci	int error;
171262306a36Sopenharmony_ci
171362306a36Sopenharmony_ci	s = sget(fs_type, compare_single, set_anon_super, flags, NULL);
171462306a36Sopenharmony_ci	if (IS_ERR(s))
171562306a36Sopenharmony_ci		return ERR_CAST(s);
171662306a36Sopenharmony_ci	if (!s->s_root) {
171762306a36Sopenharmony_ci		error = fill_super(s, data, flags & SB_SILENT ? 1 : 0);
171862306a36Sopenharmony_ci		if (!error)
171962306a36Sopenharmony_ci			s->s_flags |= SB_ACTIVE;
172062306a36Sopenharmony_ci	} else {
172162306a36Sopenharmony_ci		error = reconfigure_single(s, flags, data);
172262306a36Sopenharmony_ci	}
172362306a36Sopenharmony_ci	if (unlikely(error)) {
172462306a36Sopenharmony_ci		deactivate_locked_super(s);
172562306a36Sopenharmony_ci		return ERR_PTR(error);
172662306a36Sopenharmony_ci	}
172762306a36Sopenharmony_ci	return dget(s->s_root);
172862306a36Sopenharmony_ci}
172962306a36Sopenharmony_ciEXPORT_SYMBOL(mount_single);
173062306a36Sopenharmony_ci
173162306a36Sopenharmony_ci/**
173262306a36Sopenharmony_ci * vfs_get_tree - Get the mountable root
173362306a36Sopenharmony_ci * @fc: The superblock configuration context.
173462306a36Sopenharmony_ci *
173562306a36Sopenharmony_ci * The filesystem is invoked to get or create a superblock which can then later
173662306a36Sopenharmony_ci * be used for mounting.  The filesystem places a pointer to the root to be
173762306a36Sopenharmony_ci * used for mounting in @fc->root.
173862306a36Sopenharmony_ci */
173962306a36Sopenharmony_ciint vfs_get_tree(struct fs_context *fc)
174062306a36Sopenharmony_ci{
174162306a36Sopenharmony_ci	struct super_block *sb;
174262306a36Sopenharmony_ci	int error;
174362306a36Sopenharmony_ci
174462306a36Sopenharmony_ci	if (fc->root)
174562306a36Sopenharmony_ci		return -EBUSY;
174662306a36Sopenharmony_ci
174762306a36Sopenharmony_ci	/* Get the mountable root in fc->root, with a ref on the root and a ref
174862306a36Sopenharmony_ci	 * on the superblock.
174962306a36Sopenharmony_ci	 */
175062306a36Sopenharmony_ci	error = fc->ops->get_tree(fc);
175162306a36Sopenharmony_ci	if (error < 0)
175262306a36Sopenharmony_ci		return error;
175362306a36Sopenharmony_ci
175462306a36Sopenharmony_ci	if (!fc->root) {
175562306a36Sopenharmony_ci		pr_err("Filesystem %s get_tree() didn't set fc->root\n",
175662306a36Sopenharmony_ci		       fc->fs_type->name);
175762306a36Sopenharmony_ci		/* We don't know what the locking state of the superblock is -
175862306a36Sopenharmony_ci		 * if there is a superblock.
175962306a36Sopenharmony_ci		 */
176062306a36Sopenharmony_ci		BUG();
176162306a36Sopenharmony_ci	}
176262306a36Sopenharmony_ci
176362306a36Sopenharmony_ci	sb = fc->root->d_sb;
176462306a36Sopenharmony_ci	WARN_ON(!sb->s_bdi);
176562306a36Sopenharmony_ci
176662306a36Sopenharmony_ci	/*
176762306a36Sopenharmony_ci	 * super_wake() contains a memory barrier which also care of
176862306a36Sopenharmony_ci	 * ordering for super_cache_count(). We place it before setting
176962306a36Sopenharmony_ci	 * SB_BORN as the data dependency between the two functions is
177062306a36Sopenharmony_ci	 * the superblock structure contents that we just set up, not
177162306a36Sopenharmony_ci	 * the SB_BORN flag.
177262306a36Sopenharmony_ci	 */
177362306a36Sopenharmony_ci	super_wake(sb, SB_BORN);
177462306a36Sopenharmony_ci
177562306a36Sopenharmony_ci	error = security_sb_set_mnt_opts(sb, fc->security, 0, NULL);
177662306a36Sopenharmony_ci	if (unlikely(error)) {
177762306a36Sopenharmony_ci		fc_drop_locked(fc);
177862306a36Sopenharmony_ci		return error;
177962306a36Sopenharmony_ci	}
178062306a36Sopenharmony_ci
178162306a36Sopenharmony_ci	/*
178262306a36Sopenharmony_ci	 * filesystems should never set s_maxbytes larger than MAX_LFS_FILESIZE
178362306a36Sopenharmony_ci	 * but s_maxbytes was an unsigned long long for many releases. Throw
178462306a36Sopenharmony_ci	 * this warning for a little while to try and catch filesystems that
178562306a36Sopenharmony_ci	 * violate this rule.
178662306a36Sopenharmony_ci	 */
178762306a36Sopenharmony_ci	WARN((sb->s_maxbytes < 0), "%s set sb->s_maxbytes to "
178862306a36Sopenharmony_ci		"negative value (%lld)\n", fc->fs_type->name, sb->s_maxbytes);
178962306a36Sopenharmony_ci
179062306a36Sopenharmony_ci	return 0;
179162306a36Sopenharmony_ci}
179262306a36Sopenharmony_ciEXPORT_SYMBOL(vfs_get_tree);
179362306a36Sopenharmony_ci
179462306a36Sopenharmony_ci/*
179562306a36Sopenharmony_ci * Setup private BDI for given superblock. It gets automatically cleaned up
179662306a36Sopenharmony_ci * in generic_shutdown_super().
179762306a36Sopenharmony_ci */
179862306a36Sopenharmony_ciint super_setup_bdi_name(struct super_block *sb, char *fmt, ...)
179962306a36Sopenharmony_ci{
180062306a36Sopenharmony_ci	struct backing_dev_info *bdi;
180162306a36Sopenharmony_ci	int err;
180262306a36Sopenharmony_ci	va_list args;
180362306a36Sopenharmony_ci
180462306a36Sopenharmony_ci	bdi = bdi_alloc(NUMA_NO_NODE);
180562306a36Sopenharmony_ci	if (!bdi)
180662306a36Sopenharmony_ci		return -ENOMEM;
180762306a36Sopenharmony_ci
180862306a36Sopenharmony_ci	va_start(args, fmt);
180962306a36Sopenharmony_ci	err = bdi_register_va(bdi, fmt, args);
181062306a36Sopenharmony_ci	va_end(args);
181162306a36Sopenharmony_ci	if (err) {
181262306a36Sopenharmony_ci		bdi_put(bdi);
181362306a36Sopenharmony_ci		return err;
181462306a36Sopenharmony_ci	}
181562306a36Sopenharmony_ci	WARN_ON(sb->s_bdi != &noop_backing_dev_info);
181662306a36Sopenharmony_ci	sb->s_bdi = bdi;
181762306a36Sopenharmony_ci	sb->s_iflags |= SB_I_PERSB_BDI;
181862306a36Sopenharmony_ci
181962306a36Sopenharmony_ci	return 0;
182062306a36Sopenharmony_ci}
182162306a36Sopenharmony_ciEXPORT_SYMBOL(super_setup_bdi_name);
182262306a36Sopenharmony_ci
182362306a36Sopenharmony_ci/*
182462306a36Sopenharmony_ci * Setup private BDI for given superblock. I gets automatically cleaned up
182562306a36Sopenharmony_ci * in generic_shutdown_super().
182662306a36Sopenharmony_ci */
182762306a36Sopenharmony_ciint super_setup_bdi(struct super_block *sb)
182862306a36Sopenharmony_ci{
182962306a36Sopenharmony_ci	static atomic_long_t bdi_seq = ATOMIC_LONG_INIT(0);
183062306a36Sopenharmony_ci
183162306a36Sopenharmony_ci	return super_setup_bdi_name(sb, "%.28s-%ld", sb->s_type->name,
183262306a36Sopenharmony_ci				    atomic_long_inc_return(&bdi_seq));
183362306a36Sopenharmony_ci}
183462306a36Sopenharmony_ciEXPORT_SYMBOL(super_setup_bdi);
183562306a36Sopenharmony_ci
183662306a36Sopenharmony_ci/**
183762306a36Sopenharmony_ci * sb_wait_write - wait until all writers to given file system finish
183862306a36Sopenharmony_ci * @sb: the super for which we wait
183962306a36Sopenharmony_ci * @level: type of writers we wait for (normal vs page fault)
184062306a36Sopenharmony_ci *
184162306a36Sopenharmony_ci * This function waits until there are no writers of given type to given file
184262306a36Sopenharmony_ci * system.
184362306a36Sopenharmony_ci */
184462306a36Sopenharmony_cistatic void sb_wait_write(struct super_block *sb, int level)
184562306a36Sopenharmony_ci{
184662306a36Sopenharmony_ci	percpu_down_write(sb->s_writers.rw_sem + level-1);
184762306a36Sopenharmony_ci}
184862306a36Sopenharmony_ci
184962306a36Sopenharmony_ci/*
185062306a36Sopenharmony_ci * We are going to return to userspace and forget about these locks, the
185162306a36Sopenharmony_ci * ownership goes to the caller of thaw_super() which does unlock().
185262306a36Sopenharmony_ci */
185362306a36Sopenharmony_cistatic void lockdep_sb_freeze_release(struct super_block *sb)
185462306a36Sopenharmony_ci{
185562306a36Sopenharmony_ci	int level;
185662306a36Sopenharmony_ci
185762306a36Sopenharmony_ci	for (level = SB_FREEZE_LEVELS - 1; level >= 0; level--)
185862306a36Sopenharmony_ci		percpu_rwsem_release(sb->s_writers.rw_sem + level, 0, _THIS_IP_);
185962306a36Sopenharmony_ci}
186062306a36Sopenharmony_ci
186162306a36Sopenharmony_ci/*
186262306a36Sopenharmony_ci * Tell lockdep we are holding these locks before we call ->unfreeze_fs(sb).
186362306a36Sopenharmony_ci */
186462306a36Sopenharmony_cistatic void lockdep_sb_freeze_acquire(struct super_block *sb)
186562306a36Sopenharmony_ci{
186662306a36Sopenharmony_ci	int level;
186762306a36Sopenharmony_ci
186862306a36Sopenharmony_ci	for (level = 0; level < SB_FREEZE_LEVELS; ++level)
186962306a36Sopenharmony_ci		percpu_rwsem_acquire(sb->s_writers.rw_sem + level, 0, _THIS_IP_);
187062306a36Sopenharmony_ci}
187162306a36Sopenharmony_ci
187262306a36Sopenharmony_cistatic void sb_freeze_unlock(struct super_block *sb, int level)
187362306a36Sopenharmony_ci{
187462306a36Sopenharmony_ci	for (level--; level >= 0; level--)
187562306a36Sopenharmony_ci		percpu_up_write(sb->s_writers.rw_sem + level);
187662306a36Sopenharmony_ci}
187762306a36Sopenharmony_ci
187862306a36Sopenharmony_cistatic int wait_for_partially_frozen(struct super_block *sb)
187962306a36Sopenharmony_ci{
188062306a36Sopenharmony_ci	int ret = 0;
188162306a36Sopenharmony_ci
188262306a36Sopenharmony_ci	do {
188362306a36Sopenharmony_ci		unsigned short old = sb->s_writers.frozen;
188462306a36Sopenharmony_ci
188562306a36Sopenharmony_ci		up_write(&sb->s_umount);
188662306a36Sopenharmony_ci		ret = wait_var_event_killable(&sb->s_writers.frozen,
188762306a36Sopenharmony_ci					       sb->s_writers.frozen != old);
188862306a36Sopenharmony_ci		down_write(&sb->s_umount);
188962306a36Sopenharmony_ci	} while (ret == 0 &&
189062306a36Sopenharmony_ci		 sb->s_writers.frozen != SB_UNFROZEN &&
189162306a36Sopenharmony_ci		 sb->s_writers.frozen != SB_FREEZE_COMPLETE);
189262306a36Sopenharmony_ci
189362306a36Sopenharmony_ci	return ret;
189462306a36Sopenharmony_ci}
189562306a36Sopenharmony_ci
189662306a36Sopenharmony_ci/**
189762306a36Sopenharmony_ci * freeze_super - lock the filesystem and force it into a consistent state
189862306a36Sopenharmony_ci * @sb: the super to lock
189962306a36Sopenharmony_ci * @who: context that wants to freeze
190062306a36Sopenharmony_ci *
190162306a36Sopenharmony_ci * Syncs the super to make sure the filesystem is consistent and calls the fs's
190262306a36Sopenharmony_ci * freeze_fs.  Subsequent calls to this without first thawing the fs may return
190362306a36Sopenharmony_ci * -EBUSY.
190462306a36Sopenharmony_ci *
190562306a36Sopenharmony_ci * @who should be:
190662306a36Sopenharmony_ci * * %FREEZE_HOLDER_USERSPACE if userspace wants to freeze the fs;
190762306a36Sopenharmony_ci * * %FREEZE_HOLDER_KERNEL if the kernel wants to freeze the fs.
190862306a36Sopenharmony_ci *
190962306a36Sopenharmony_ci * The @who argument distinguishes between the kernel and userspace trying to
191062306a36Sopenharmony_ci * freeze the filesystem.  Although there cannot be multiple kernel freezes or
191162306a36Sopenharmony_ci * multiple userspace freezes in effect at any given time, the kernel and
191262306a36Sopenharmony_ci * userspace can both hold a filesystem frozen.  The filesystem remains frozen
191362306a36Sopenharmony_ci * until there are no kernel or userspace freezes in effect.
191462306a36Sopenharmony_ci *
191562306a36Sopenharmony_ci * During this function, sb->s_writers.frozen goes through these values:
191662306a36Sopenharmony_ci *
191762306a36Sopenharmony_ci * SB_UNFROZEN: File system is normal, all writes progress as usual.
191862306a36Sopenharmony_ci *
191962306a36Sopenharmony_ci * SB_FREEZE_WRITE: The file system is in the process of being frozen.  New
192062306a36Sopenharmony_ci * writes should be blocked, though page faults are still allowed. We wait for
192162306a36Sopenharmony_ci * all writes to complete and then proceed to the next stage.
192262306a36Sopenharmony_ci *
192362306a36Sopenharmony_ci * SB_FREEZE_PAGEFAULT: Freezing continues. Now also page faults are blocked
192462306a36Sopenharmony_ci * but internal fs threads can still modify the filesystem (although they
192562306a36Sopenharmony_ci * should not dirty new pages or inodes), writeback can run etc. After waiting
192662306a36Sopenharmony_ci * for all running page faults we sync the filesystem which will clean all
192762306a36Sopenharmony_ci * dirty pages and inodes (no new dirty pages or inodes can be created when
192862306a36Sopenharmony_ci * sync is running).
192962306a36Sopenharmony_ci *
193062306a36Sopenharmony_ci * SB_FREEZE_FS: The file system is frozen. Now all internal sources of fs
193162306a36Sopenharmony_ci * modification are blocked (e.g. XFS preallocation truncation on inode
193262306a36Sopenharmony_ci * reclaim). This is usually implemented by blocking new transactions for
193362306a36Sopenharmony_ci * filesystems that have them and need this additional guard. After all
193462306a36Sopenharmony_ci * internal writers are finished we call ->freeze_fs() to finish filesystem
193562306a36Sopenharmony_ci * freezing. Then we transition to SB_FREEZE_COMPLETE state. This state is
193662306a36Sopenharmony_ci * mostly auxiliary for filesystems to verify they do not modify frozen fs.
193762306a36Sopenharmony_ci *
193862306a36Sopenharmony_ci * sb->s_writers.frozen is protected by sb->s_umount.
193962306a36Sopenharmony_ci */
194062306a36Sopenharmony_ciint freeze_super(struct super_block *sb, enum freeze_holder who)
194162306a36Sopenharmony_ci{
194262306a36Sopenharmony_ci	int ret;
194362306a36Sopenharmony_ci
194462306a36Sopenharmony_ci	atomic_inc(&sb->s_active);
194562306a36Sopenharmony_ci	if (!super_lock_excl(sb))
194662306a36Sopenharmony_ci		WARN(1, "Dying superblock while freezing!");
194762306a36Sopenharmony_ci
194862306a36Sopenharmony_ciretry:
194962306a36Sopenharmony_ci	if (sb->s_writers.frozen == SB_FREEZE_COMPLETE) {
195062306a36Sopenharmony_ci		if (sb->s_writers.freeze_holders & who) {
195162306a36Sopenharmony_ci			deactivate_locked_super(sb);
195262306a36Sopenharmony_ci			return -EBUSY;
195362306a36Sopenharmony_ci		}
195462306a36Sopenharmony_ci
195562306a36Sopenharmony_ci		WARN_ON(sb->s_writers.freeze_holders == 0);
195662306a36Sopenharmony_ci
195762306a36Sopenharmony_ci		/*
195862306a36Sopenharmony_ci		 * Someone else already holds this type of freeze; share the
195962306a36Sopenharmony_ci		 * freeze and assign the active ref to the freeze.
196062306a36Sopenharmony_ci		 */
196162306a36Sopenharmony_ci		sb->s_writers.freeze_holders |= who;
196262306a36Sopenharmony_ci		super_unlock_excl(sb);
196362306a36Sopenharmony_ci		return 0;
196462306a36Sopenharmony_ci	}
196562306a36Sopenharmony_ci
196662306a36Sopenharmony_ci	if (sb->s_writers.frozen != SB_UNFROZEN) {
196762306a36Sopenharmony_ci		ret = wait_for_partially_frozen(sb);
196862306a36Sopenharmony_ci		if (ret) {
196962306a36Sopenharmony_ci			deactivate_locked_super(sb);
197062306a36Sopenharmony_ci			return ret;
197162306a36Sopenharmony_ci		}
197262306a36Sopenharmony_ci
197362306a36Sopenharmony_ci		goto retry;
197462306a36Sopenharmony_ci	}
197562306a36Sopenharmony_ci
197662306a36Sopenharmony_ci	if (!(sb->s_flags & SB_BORN)) {
197762306a36Sopenharmony_ci		super_unlock_excl(sb);
197862306a36Sopenharmony_ci		return 0;	/* sic - it's "nothing to do" */
197962306a36Sopenharmony_ci	}
198062306a36Sopenharmony_ci
198162306a36Sopenharmony_ci	if (sb_rdonly(sb)) {
198262306a36Sopenharmony_ci		/* Nothing to do really... */
198362306a36Sopenharmony_ci		sb->s_writers.freeze_holders |= who;
198462306a36Sopenharmony_ci		sb->s_writers.frozen = SB_FREEZE_COMPLETE;
198562306a36Sopenharmony_ci		wake_up_var(&sb->s_writers.frozen);
198662306a36Sopenharmony_ci		super_unlock_excl(sb);
198762306a36Sopenharmony_ci		return 0;
198862306a36Sopenharmony_ci	}
198962306a36Sopenharmony_ci
199062306a36Sopenharmony_ci	sb->s_writers.frozen = SB_FREEZE_WRITE;
199162306a36Sopenharmony_ci	/* Release s_umount to preserve sb_start_write -> s_umount ordering */
199262306a36Sopenharmony_ci	super_unlock_excl(sb);
199362306a36Sopenharmony_ci	sb_wait_write(sb, SB_FREEZE_WRITE);
199462306a36Sopenharmony_ci	if (!super_lock_excl(sb))
199562306a36Sopenharmony_ci		WARN(1, "Dying superblock while freezing!");
199662306a36Sopenharmony_ci
199762306a36Sopenharmony_ci	/* Now we go and block page faults... */
199862306a36Sopenharmony_ci	sb->s_writers.frozen = SB_FREEZE_PAGEFAULT;
199962306a36Sopenharmony_ci	sb_wait_write(sb, SB_FREEZE_PAGEFAULT);
200062306a36Sopenharmony_ci
200162306a36Sopenharmony_ci	/* All writers are done so after syncing there won't be dirty data */
200262306a36Sopenharmony_ci	ret = sync_filesystem(sb);
200362306a36Sopenharmony_ci	if (ret) {
200462306a36Sopenharmony_ci		sb->s_writers.frozen = SB_UNFROZEN;
200562306a36Sopenharmony_ci		sb_freeze_unlock(sb, SB_FREEZE_PAGEFAULT);
200662306a36Sopenharmony_ci		wake_up_var(&sb->s_writers.frozen);
200762306a36Sopenharmony_ci		deactivate_locked_super(sb);
200862306a36Sopenharmony_ci		return ret;
200962306a36Sopenharmony_ci	}
201062306a36Sopenharmony_ci
201162306a36Sopenharmony_ci	/* Now wait for internal filesystem counter */
201262306a36Sopenharmony_ci	sb->s_writers.frozen = SB_FREEZE_FS;
201362306a36Sopenharmony_ci	sb_wait_write(sb, SB_FREEZE_FS);
201462306a36Sopenharmony_ci
201562306a36Sopenharmony_ci	if (sb->s_op->freeze_fs) {
201662306a36Sopenharmony_ci		ret = sb->s_op->freeze_fs(sb);
201762306a36Sopenharmony_ci		if (ret) {
201862306a36Sopenharmony_ci			printk(KERN_ERR
201962306a36Sopenharmony_ci				"VFS:Filesystem freeze failed\n");
202062306a36Sopenharmony_ci			sb->s_writers.frozen = SB_UNFROZEN;
202162306a36Sopenharmony_ci			sb_freeze_unlock(sb, SB_FREEZE_FS);
202262306a36Sopenharmony_ci			wake_up_var(&sb->s_writers.frozen);
202362306a36Sopenharmony_ci			deactivate_locked_super(sb);
202462306a36Sopenharmony_ci			return ret;
202562306a36Sopenharmony_ci		}
202662306a36Sopenharmony_ci	}
202762306a36Sopenharmony_ci	/*
202862306a36Sopenharmony_ci	 * For debugging purposes so that fs can warn if it sees write activity
202962306a36Sopenharmony_ci	 * when frozen is set to SB_FREEZE_COMPLETE, and for thaw_super().
203062306a36Sopenharmony_ci	 */
203162306a36Sopenharmony_ci	sb->s_writers.freeze_holders |= who;
203262306a36Sopenharmony_ci	sb->s_writers.frozen = SB_FREEZE_COMPLETE;
203362306a36Sopenharmony_ci	wake_up_var(&sb->s_writers.frozen);
203462306a36Sopenharmony_ci	lockdep_sb_freeze_release(sb);
203562306a36Sopenharmony_ci	super_unlock_excl(sb);
203662306a36Sopenharmony_ci	return 0;
203762306a36Sopenharmony_ci}
203862306a36Sopenharmony_ciEXPORT_SYMBOL(freeze_super);
203962306a36Sopenharmony_ci
204062306a36Sopenharmony_ci/*
204162306a36Sopenharmony_ci * Undoes the effect of a freeze_super_locked call.  If the filesystem is
204262306a36Sopenharmony_ci * frozen both by userspace and the kernel, a thaw call from either source
204362306a36Sopenharmony_ci * removes that state without releasing the other state or unlocking the
204462306a36Sopenharmony_ci * filesystem.
204562306a36Sopenharmony_ci */
204662306a36Sopenharmony_cistatic int thaw_super_locked(struct super_block *sb, enum freeze_holder who)
204762306a36Sopenharmony_ci{
204862306a36Sopenharmony_ci	int error;
204962306a36Sopenharmony_ci
205062306a36Sopenharmony_ci	if (sb->s_writers.frozen == SB_FREEZE_COMPLETE) {
205162306a36Sopenharmony_ci		if (!(sb->s_writers.freeze_holders & who)) {
205262306a36Sopenharmony_ci			super_unlock_excl(sb);
205362306a36Sopenharmony_ci			return -EINVAL;
205462306a36Sopenharmony_ci		}
205562306a36Sopenharmony_ci
205662306a36Sopenharmony_ci		/*
205762306a36Sopenharmony_ci		 * Freeze is shared with someone else.  Release our hold and
205862306a36Sopenharmony_ci		 * drop the active ref that freeze_super assigned to the
205962306a36Sopenharmony_ci		 * freezer.
206062306a36Sopenharmony_ci		 */
206162306a36Sopenharmony_ci		if (sb->s_writers.freeze_holders & ~who) {
206262306a36Sopenharmony_ci			sb->s_writers.freeze_holders &= ~who;
206362306a36Sopenharmony_ci			deactivate_locked_super(sb);
206462306a36Sopenharmony_ci			return 0;
206562306a36Sopenharmony_ci		}
206662306a36Sopenharmony_ci	} else {
206762306a36Sopenharmony_ci		super_unlock_excl(sb);
206862306a36Sopenharmony_ci		return -EINVAL;
206962306a36Sopenharmony_ci	}
207062306a36Sopenharmony_ci
207162306a36Sopenharmony_ci	if (sb_rdonly(sb)) {
207262306a36Sopenharmony_ci		sb->s_writers.freeze_holders &= ~who;
207362306a36Sopenharmony_ci		sb->s_writers.frozen = SB_UNFROZEN;
207462306a36Sopenharmony_ci		wake_up_var(&sb->s_writers.frozen);
207562306a36Sopenharmony_ci		goto out;
207662306a36Sopenharmony_ci	}
207762306a36Sopenharmony_ci
207862306a36Sopenharmony_ci	lockdep_sb_freeze_acquire(sb);
207962306a36Sopenharmony_ci
208062306a36Sopenharmony_ci	if (sb->s_op->unfreeze_fs) {
208162306a36Sopenharmony_ci		error = sb->s_op->unfreeze_fs(sb);
208262306a36Sopenharmony_ci		if (error) {
208362306a36Sopenharmony_ci			printk(KERN_ERR "VFS:Filesystem thaw failed\n");
208462306a36Sopenharmony_ci			lockdep_sb_freeze_release(sb);
208562306a36Sopenharmony_ci			super_unlock_excl(sb);
208662306a36Sopenharmony_ci			return error;
208762306a36Sopenharmony_ci		}
208862306a36Sopenharmony_ci	}
208962306a36Sopenharmony_ci
209062306a36Sopenharmony_ci	sb->s_writers.freeze_holders &= ~who;
209162306a36Sopenharmony_ci	sb->s_writers.frozen = SB_UNFROZEN;
209262306a36Sopenharmony_ci	wake_up_var(&sb->s_writers.frozen);
209362306a36Sopenharmony_ci	sb_freeze_unlock(sb, SB_FREEZE_FS);
209462306a36Sopenharmony_ciout:
209562306a36Sopenharmony_ci	deactivate_locked_super(sb);
209662306a36Sopenharmony_ci	return 0;
209762306a36Sopenharmony_ci}
209862306a36Sopenharmony_ci
209962306a36Sopenharmony_ci/**
210062306a36Sopenharmony_ci * thaw_super -- unlock filesystem
210162306a36Sopenharmony_ci * @sb: the super to thaw
210262306a36Sopenharmony_ci * @who: context that wants to freeze
210362306a36Sopenharmony_ci *
210462306a36Sopenharmony_ci * Unlocks the filesystem and marks it writeable again after freeze_super()
210562306a36Sopenharmony_ci * if there are no remaining freezes on the filesystem.
210662306a36Sopenharmony_ci *
210762306a36Sopenharmony_ci * @who should be:
210862306a36Sopenharmony_ci * * %FREEZE_HOLDER_USERSPACE if userspace wants to thaw the fs;
210962306a36Sopenharmony_ci * * %FREEZE_HOLDER_KERNEL if the kernel wants to thaw the fs.
211062306a36Sopenharmony_ci */
211162306a36Sopenharmony_ciint thaw_super(struct super_block *sb, enum freeze_holder who)
211262306a36Sopenharmony_ci{
211362306a36Sopenharmony_ci	if (!super_lock_excl(sb))
211462306a36Sopenharmony_ci		WARN(1, "Dying superblock while thawing!");
211562306a36Sopenharmony_ci	return thaw_super_locked(sb, who);
211662306a36Sopenharmony_ci}
211762306a36Sopenharmony_ciEXPORT_SYMBOL(thaw_super);
211862306a36Sopenharmony_ci
211962306a36Sopenharmony_ci/*
212062306a36Sopenharmony_ci * Create workqueue for deferred direct IO completions. We allocate the
212162306a36Sopenharmony_ci * workqueue when it's first needed. This avoids creating workqueue for
212262306a36Sopenharmony_ci * filesystems that don't need it and also allows us to create the workqueue
212362306a36Sopenharmony_ci * late enough so the we can include s_id in the name of the workqueue.
212462306a36Sopenharmony_ci */
212562306a36Sopenharmony_ciint sb_init_dio_done_wq(struct super_block *sb)
212662306a36Sopenharmony_ci{
212762306a36Sopenharmony_ci	struct workqueue_struct *old;
212862306a36Sopenharmony_ci	struct workqueue_struct *wq = alloc_workqueue("dio/%s",
212962306a36Sopenharmony_ci						      WQ_MEM_RECLAIM, 0,
213062306a36Sopenharmony_ci						      sb->s_id);
213162306a36Sopenharmony_ci	if (!wq)
213262306a36Sopenharmony_ci		return -ENOMEM;
213362306a36Sopenharmony_ci	/*
213462306a36Sopenharmony_ci	 * This has to be atomic as more DIOs can race to create the workqueue
213562306a36Sopenharmony_ci	 */
213662306a36Sopenharmony_ci	old = cmpxchg(&sb->s_dio_done_wq, NULL, wq);
213762306a36Sopenharmony_ci	/* Someone created workqueue before us? Free ours... */
213862306a36Sopenharmony_ci	if (old)
213962306a36Sopenharmony_ci		destroy_workqueue(wq);
214062306a36Sopenharmony_ci	return 0;
214162306a36Sopenharmony_ci}
2142