Blame view

fs/super.c 34.6 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  /*
   *  linux/fs/super.c
   *
   *  Copyright (C) 1991, 1992  Linus Torvalds
   *
   *  super.c contains code to handle: - mount structures
   *                                   - super-block tables
   *                                   - filesystem drivers list
   *                                   - mount system call
   *                                   - umount system call
   *                                   - ustat system call
   *
   * GK 2/5/95  -  Changed to support mounting the root fs via NFS
   *
   *  Added kerneld support: Jacques Gelinas and Bjorn Ekwall
   *  Added change_root: Werner Almesberger & Hans Lermen, Feb '96
   *  Added options to /proc/mounts:
96de0e252   Jan Engelhardt   Convert files to ...
18
   *    Torbjörn Lindh (torbjorn.lindh@gopta.se), April 14, 1996.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
19
20
21
   *  Added devfs support: Richard Gooch <rgooch@atnf.csiro.au>, 13-JAN-1998
   *  Heavily rewritten for 'one fs - one tree' dcache architecture. AV, Mar 2000
   */
630d9c472   Paul Gortmaker   fs: reduce the us...
22
  #include <linux/export.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
23
  #include <linux/slab.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
24
25
  #include <linux/acct.h>
  #include <linux/blkdev.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
26
27
  #include <linux/mount.h>
  #include <linux/security.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
28
29
  #include <linux/writeback.h>		/* for the emergency remount stuff */
  #include <linux/idr.h>
353ab6e97   Ingo Molnar   [PATCH] sem2mutex...
30
  #include <linux/mutex.h>
5477d0fac   Jens Axboe   fs: fs/super.c ne...
31
  #include <linux/backing-dev.h>
ceb5bdc2d   Nick Piggin   fs: dcache per-bu...
32
  #include <linux/rculist_bl.h>
c515e1fd3   Dan Magenheimer   mm/fs: add hooks ...
33
  #include <linux/cleancache.h>
404015308   Al Viro   security: trim se...
34
  #include <linux/fsnotify.h>
5accdf82b   Jan Kara   fs: Improve files...
35
  #include <linux/lockdep.h>
6d59e7f58   Al Viro   [PATCH] move a bu...
36
  #include "internal.h"
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
37

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
38
39
  LIST_HEAD(super_blocks);
  DEFINE_SPINLOCK(sb_lock);
5accdf82b   Jan Kara   fs: Improve files...
40
41
42
43
44
  static char *sb_writers_name[SB_FREEZE_LEVELS] = {
  	"sb_writers",
  	"sb_pagefaults",
  	"sb_internal",
  };
b0d40c92a   Dave Chinner   superblock: intro...
45
46
47
48
49
50
51
  /*
   * One thing we have to be careful of with a per-sb shrinker is that we don't
   * drop the last active reference to the superblock from within the shrinker.
   * If that happens we could trigger unregistering the shrinker from within the
   * shrinker path and that leads to deadlock on the shrinker_rwsem. Hence we
   * take a passive reference to the superblock to avoid this from occurring.
   */
0a234c6dc   Dave Chinner   shrinker: convert...
52
53
  static unsigned long super_cache_scan(struct shrinker *shrink,
  				      struct shrink_control *sc)
b0d40c92a   Dave Chinner   superblock: intro...
54
55
  {
  	struct super_block *sb;
0a234c6dc   Dave Chinner   shrinker: convert...
56
57
58
59
60
  	long	fs_objects = 0;
  	long	total_objects;
  	long	freed = 0;
  	long	dentries;
  	long	inodes;
b0d40c92a   Dave Chinner   superblock: intro...
61
62
63
64
65
66
67
  
  	sb = container_of(shrink, struct super_block, s_shrink);
  
  	/*
  	 * Deadlock avoidance.  We may hold various FS locks, and we don't want
  	 * to recurse into the FS that called us in clear_inode() and friends..
  	 */
0a234c6dc   Dave Chinner   shrinker: convert...
68
69
  	if (!(sc->gfp_mask & __GFP_FS))
  		return SHRINK_STOP;
b0d40c92a   Dave Chinner   superblock: intro...
70
71
  
  	if (!grab_super_passive(sb))
0a234c6dc   Dave Chinner   shrinker: convert...
72
  		return SHRINK_STOP;
b0d40c92a   Dave Chinner   superblock: intro...
73

d04079039   Al Viro   prune_super(): sb...
74
  	if (sb->s_op->nr_cached_objects)
9b17c6238   Dave Chinner   fs: convert inode...
75
  		fs_objects = sb->s_op->nr_cached_objects(sb, sc->nid);
0e1fdafd9   Dave Chinner   superblock: add f...
76

9b17c6238   Dave Chinner   fs: convert inode...
77
78
  	inodes = list_lru_count_node(&sb->s_inode_lru, sc->nid);
  	dentries = list_lru_count_node(&sb->s_dentry_lru, sc->nid);
f60415675   Dave Chinner   dcache: convert t...
79
  	total_objects = dentries + inodes + fs_objects + 1;
0e1fdafd9   Dave Chinner   superblock: add f...
80

0a234c6dc   Dave Chinner   shrinker: convert...
81
  	/* proportion the scan between the caches */
f60415675   Dave Chinner   dcache: convert t...
82
  	dentries = mult_frac(sc->nr_to_scan, dentries, total_objects);
bc3b14cb2   Dave Chinner   inode: convert in...
83
  	inodes = mult_frac(sc->nr_to_scan, inodes, total_objects);
b0d40c92a   Dave Chinner   superblock: intro...
84

0a234c6dc   Dave Chinner   shrinker: convert...
85
86
87
88
  	/*
  	 * prune the dcache first as the icache is pinned by it, then
  	 * prune the icache, followed by the filesystem specific caches
  	 */
9b17c6238   Dave Chinner   fs: convert inode...
89
90
  	freed = prune_dcache_sb(sb, dentries, sc->nid);
  	freed += prune_icache_sb(sb, inodes, sc->nid);
0a234c6dc   Dave Chinner   shrinker: convert...
91
92
93
94
  
  	if (fs_objects) {
  		fs_objects = mult_frac(sc->nr_to_scan, fs_objects,
  								total_objects);
9b17c6238   Dave Chinner   fs: convert inode...
95
96
  		freed += sb->s_op->free_cached_objects(sb, fs_objects,
  						       sc->nid);
b0d40c92a   Dave Chinner   superblock: intro...
97
  	}
0a234c6dc   Dave Chinner   shrinker: convert...
98
99
100
101
102
103
104
105
106
107
108
  	drop_super(sb);
  	return freed;
  }
  
  static unsigned long super_cache_count(struct shrinker *shrink,
  				       struct shrink_control *sc)
  {
  	struct super_block *sb;
  	long	total_objects = 0;
  
  	sb = container_of(shrink, struct super_block, s_shrink);
d23da150a   Tim Chen   fs/superblock: av...
109
110
111
112
113
114
115
116
  	/*
  	 * Don't call grab_super_passive as it is a potential
  	 * scalability bottleneck. The counts could get updated
  	 * between super_cache_count and super_cache_scan anyway.
  	 * Call to super_cache_count with shrinker_rwsem held
  	 * ensures the safety of call to list_lru_count_node() and
  	 * s_op->nr_cached_objects().
  	 */
0a234c6dc   Dave Chinner   shrinker: convert...
117
  	if (sb->s_op && sb->s_op->nr_cached_objects)
9b17c6238   Dave Chinner   fs: convert inode...
118
119
  		total_objects = sb->s_op->nr_cached_objects(sb,
  						 sc->nid);
0a234c6dc   Dave Chinner   shrinker: convert...
120

9b17c6238   Dave Chinner   fs: convert inode...
121
122
123
124
  	total_objects += list_lru_count_node(&sb->s_dentry_lru,
  						 sc->nid);
  	total_objects += list_lru_count_node(&sb->s_inode_lru,
  						 sc->nid);
0a234c6dc   Dave Chinner   shrinker: convert...
125

55f841ce9   Glauber Costa   super: fix calcul...
126
  	total_objects = vfs_pressure_ratio(total_objects);
0e1fdafd9   Dave Chinner   superblock: add f...
127
  	return total_objects;
b0d40c92a   Dave Chinner   superblock: intro...
128
  }
7eb5e8826   Al Viro   uninline destroy_...
129
130
131
132
133
134
135
  /**
   *	destroy_super	-	frees a superblock
   *	@s: superblock to free
   *
   *	Frees a superblock.
   */
  static void destroy_super(struct super_block *s)
5accdf82b   Jan Kara   fs: Improve files...
136
137
  {
  	int i;
7eb5e8826   Al Viro   uninline destroy_...
138
139
  	list_lru_destroy(&s->s_dentry_lru);
  	list_lru_destroy(&s->s_inode_lru);
5accdf82b   Jan Kara   fs: Improve files...
140
141
  	for (i = 0; i < SB_FREEZE_LEVELS; i++)
  		percpu_counter_destroy(&s->s_writers.counter[i]);
7eb5e8826   Al Viro   uninline destroy_...
142
143
144
145
  	security_sb_free(s);
  	WARN_ON(!list_empty(&s->s_mounts));
  	kfree(s->s_subtype);
  	kfree(s->s_options);
e2fec7c35   Al Viro   make freeing supe...
146
  	kfree_rcu(s, rcu);
5accdf82b   Jan Kara   fs: Improve files...
147
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
148
149
  /**
   *	alloc_super	-	create new superblock
fe2bbc483   Henrik Kretzschmar   [PATCH] add missi...
150
   *	@type:	filesystem type superblock should belong to
9249e17fe   David Howells   VFS: Pass mount f...
151
   *	@flags: the mount flags
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
152
153
154
155
   *
   *	Allocates and initializes a new &struct super_block.  alloc_super()
   *	returns a pointer new superblock or %NULL if allocation had failed.
   */
9249e17fe   David Howells   VFS: Pass mount f...
156
  static struct super_block *alloc_super(struct file_system_type *type, int flags)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
157
  {
11b0b5abb   Oliver Neukum   [PATCH] use kzall...
158
  	struct super_block *s = kzalloc(sizeof(struct super_block),  GFP_USER);
b87221de6   Alexey Dobriyan   const: mark remai...
159
  	static const struct super_operations default_op;
7eb5e8826   Al Viro   uninline destroy_...
160
161
162
163
  	int i;
  
  	if (!s)
  		return NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
164

b5bd856a0   Vladimir Davydov   fs/super.c: fix W...
165
  	INIT_LIST_HEAD(&s->s_mounts);
7eb5e8826   Al Viro   uninline destroy_...
166
167
  	if (security_sb_alloc(s))
  		goto fail;
7b7a8665e   Christoph Hellwig   direct-io: Implem...
168

7eb5e8826   Al Viro   uninline destroy_...
169
170
171
172
173
  	for (i = 0; i < SB_FREEZE_LEVELS; i++) {
  		if (percpu_counter_init(&s->s_writers.counter[i], 0) < 0)
  			goto fail;
  		lockdep_init_map(&s->s_writers.lock_map[i], sb_writers_name[i],
  				 &type->s_writers_key[i], 0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
174
  	}
7eb5e8826   Al Viro   uninline destroy_...
175
176
177
178
179
180
181
182
183
184
185
186
  	init_waitqueue_head(&s->s_writers.wait);
  	init_waitqueue_head(&s->s_writers.wait_unfrozen);
  	s->s_flags = flags;
  	s->s_bdi = &default_backing_dev_info;
  	INIT_HLIST_NODE(&s->s_instances);
  	INIT_HLIST_BL_HEAD(&s->s_anon);
  	INIT_LIST_HEAD(&s->s_inodes);
  
  	if (list_lru_init(&s->s_dentry_lru))
  		goto fail;
  	if (list_lru_init(&s->s_inode_lru))
  		goto fail;
7eb5e8826   Al Viro   uninline destroy_...
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
  	init_rwsem(&s->s_umount);
  	lockdep_set_class(&s->s_umount, &type->s_umount_key);
  	/*
  	 * sget() can have s_umount recursion.
  	 *
  	 * When it cannot find a suitable sb, it allocates a new
  	 * one (this one), and tries again to find a suitable old
  	 * one.
  	 *
  	 * In case that succeeds, it will acquire the s_umount
  	 * lock of the old one. Since these are clearly distrinct
  	 * locks, and this object isn't exposed yet, there's no
  	 * risk of deadlocks.
  	 *
  	 * Annotate this by putting this lock in a different
  	 * subclass.
  	 */
  	down_write_nested(&s->s_umount, SINGLE_DEPTH_NESTING);
  	s->s_count = 1;
  	atomic_set(&s->s_active, 1);
  	mutex_init(&s->s_vfs_rename_mutex);
  	lockdep_set_class(&s->s_vfs_rename_mutex, &type->s_vfs_rename_key);
  	mutex_init(&s->s_dquot.dqio_mutex);
  	mutex_init(&s->s_dquot.dqonoff_mutex);
  	init_rwsem(&s->s_dquot.dqptr_sem);
  	s->s_maxbytes = MAX_NON_LFS;
  	s->s_op = &default_op;
  	s->s_time_gran = 1000000000;
  	s->cleancache_poolid = -1;
  
  	s->s_shrink.seeks = DEFAULT_SEEKS;
  	s->s_shrink.scan_objects = super_cache_scan;
  	s->s_shrink.count_objects = super_cache_count;
  	s->s_shrink.batch = 1024;
  	s->s_shrink.flags = SHRINKER_NUMA_AWARE;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
222
  	return s;
5ca302c8e   Glauber Costa   list_lru: dynamic...
223

7eb5e8826   Al Viro   uninline destroy_...
224
225
226
  fail:
  	destroy_super(s);
  	return NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
227
228
229
230
231
  }
  
  /* Superblock refcounting  */
  
  /*
35cf7ba0b   Al Viro   Bury __put_super_...
232
   * Drop a superblock's refcount.  The caller must hold sb_lock.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
233
   */
f47ec3f28   Al Viro   trim fs/internal.h
234
  static void __put_super(struct super_block *sb)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
235
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
236
  	if (!--sb->s_count) {
551de6f34   Al Viro   Leave superblocks...
237
  		list_del_init(&sb->s_list);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
238
  		destroy_super(sb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
239
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
240
241
242
243
244
245
246
247
248
  }
  
  /**
   *	put_super	-	drop a temporary reference to superblock
   *	@sb: superblock in question
   *
   *	Drops a temporary reference, frees superblock if there's no
   *	references left.
   */
f47ec3f28   Al Viro   trim fs/internal.h
249
  static void put_super(struct super_block *sb)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
250
251
252
253
254
255
256
257
  {
  	spin_lock(&sb_lock);
  	__put_super(sb);
  	spin_unlock(&sb_lock);
  }
  
  
  /**
1712ac8fd   Al Viro   Saner locking aro...
258
   *	deactivate_locked_super	-	drop an active reference to superblock
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
259
260
   *	@s: superblock to deactivate
   *
1712ac8fd   Al Viro   Saner locking aro...
261
262
   *	Drops an active reference to superblock, converting it into a temprory
   *	one if there is no other active references left.  In that case we
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
263
264
   *	tell fs driver to shut it down and drop the temporary reference we
   *	had just acquired.
1712ac8fd   Al Viro   Saner locking aro...
265
266
   *
   *	Caller holds exclusive lock on superblock; that lock is released.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
267
   */
1712ac8fd   Al Viro   Saner locking aro...
268
  void deactivate_locked_super(struct super_block *s)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
269
270
  {
  	struct file_system_type *fs = s->s_type;
b20bd1a5e   Al Viro   get rid of S_BIAS
271
  	if (atomic_dec_and_test(&s->s_active)) {
3167760f8   Dan Magenheimer   mm: cleancache: s...
272
  		cleancache_invalidate_fs(s);
b0d40c92a   Dave Chinner   superblock: intro...
273
  		unregister_shrinker(&s->s_shrink);
28f2cd4f6   Dave Chinner   fs/superblock: un...
274
  		fs->kill_sb(s);
f5e1dd345   Glauber Costa   super: fix for de...
275

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
276
277
  		put_filesystem(fs);
  		put_super(s);
1712ac8fd   Al Viro   Saner locking aro...
278
279
  	} else {
  		up_write(&s->s_umount);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
280
281
  	}
  }
1712ac8fd   Al Viro   Saner locking aro...
282
  EXPORT_SYMBOL(deactivate_locked_super);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
283
284
  
  /**
1712ac8fd   Al Viro   Saner locking aro...
285
   *	deactivate_super	-	drop an active reference to superblock
74dbbdd7f   Al Viro   New helper: deact...
286
287
   *	@s: superblock to deactivate
   *
1712ac8fd   Al Viro   Saner locking aro...
288
289
290
   *	Variant of deactivate_locked_super(), except that superblock is *not*
   *	locked by caller.  If we are going to drop the final active reference,
   *	lock will be acquired prior to that.
74dbbdd7f   Al Viro   New helper: deact...
291
   */
1712ac8fd   Al Viro   Saner locking aro...
292
  void deactivate_super(struct super_block *s)
74dbbdd7f   Al Viro   New helper: deact...
293
  {
1712ac8fd   Al Viro   Saner locking aro...
294
295
296
          if (!atomic_add_unless(&s->s_active, -1, 1)) {
  		down_write(&s->s_umount);
  		deactivate_locked_super(s);
74dbbdd7f   Al Viro   New helper: deact...
297
298
  	}
  }
1712ac8fd   Al Viro   Saner locking aro...
299
  EXPORT_SYMBOL(deactivate_super);
74dbbdd7f   Al Viro   New helper: deact...
300
301
  
  /**
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
302
303
304
305
306
307
308
309
   *	grab_super - acquire an active reference
   *	@s: reference we are trying to make active
   *
   *	Tries to acquire an active reference.  grab_super() is used when we
   * 	had just found a superblock in super_blocks or fs_type->fs_supers
   *	and want to turn it into a full-blown active reference.  grab_super()
   *	is called with sb_lock held and drops it.  Returns 1 in case of
   *	success, 0 if we had failed (superblock contents was already dead or
acfec9a5a   Al Viro   livelock avoidanc...
310
311
312
   *	dying when grab_super() had been called).  Note that this is only
   *	called for superblocks not in rundown mode (== ones still on ->fs_supers
   *	of their type), so increment of ->s_count is OK here.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
313
   */
9c4dbee79   Josh Triplett   [PATCH] fs: add l...
314
  static int grab_super(struct super_block *s) __releases(sb_lock)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
315
316
317
318
  {
  	s->s_count++;
  	spin_unlock(&sb_lock);
  	down_write(&s->s_umount);
acfec9a5a   Al Viro   livelock avoidanc...
319
320
321
322
  	if ((s->s_flags & MS_BORN) && atomic_inc_not_zero(&s->s_active)) {
  		put_super(s);
  		return 1;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
323
324
  	up_write(&s->s_umount);
  	put_super(s);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
325
326
  	return 0;
  }
cf9a2ae8d   David Howells   [PATCH] BLOCK: Mo...
327
  /*
12ad3ab66   Dave Chinner   superblock: move ...
328
   *	grab_super_passive - acquire a passive reference
331cbdeed   Wanpeng Li   writeback: Fix so...
329
   *	@sb: reference we are trying to grab
12ad3ab66   Dave Chinner   superblock: move ...
330
331
332
333
334
335
336
337
338
339
340
341
   *
   *	Tries to acquire a passive reference. This is used in places where we
   *	cannot take an active reference but we need to ensure that the
   *	superblock does not go away while we are working on it. It returns
   *	false if a reference was not gained, and returns true with the s_umount
   *	lock held in read mode if a reference is gained. On successful return,
   *	the caller must drop the s_umount lock and the passive reference when
   *	done.
   */
  bool grab_super_passive(struct super_block *sb)
  {
  	spin_lock(&sb_lock);
a5166169f   Al Viro   vfs: convert fs_s...
342
  	if (hlist_unhashed(&sb->s_instances)) {
12ad3ab66   Dave Chinner   superblock: move ...
343
344
345
346
347
348
349
350
  		spin_unlock(&sb_lock);
  		return false;
  	}
  
  	sb->s_count++;
  	spin_unlock(&sb_lock);
  
  	if (down_read_trylock(&sb->s_umount)) {
dabe0dc19   Al Viro   vfs: fix the rest...
351
  		if (sb->s_root && (sb->s_flags & MS_BORN))
12ad3ab66   Dave Chinner   superblock: move ...
352
353
354
355
356
357
358
  			return true;
  		up_read(&sb->s_umount);
  	}
  
  	put_super(sb);
  	return false;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
359
360
361
362
363
364
365
366
367
  /**
   *	generic_shutdown_super	-	common helper for ->kill_sb()
   *	@sb: superblock to kill
   *
   *	generic_shutdown_super() does all fs-independent work on superblock
   *	shutdown.  Typical ->kill_sb() should pick all fs-specific objects
   *	that need destruction out of superblock, call generic_shutdown_super()
   *	and release aforementioned objects.  Note: dentries and inodes _are_
   *	taken care of and do not need specific handling.
c636ebdb1   David Howells   [PATCH] VFS: Dest...
368
369
370
371
   *
   *	Upon calling this function, the filesystem may no longer alter or
   *	rearrange the set of dentries belonging to this super_block, nor may it
   *	change the attachments of dentries to inodes.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
372
373
374
   */
  void generic_shutdown_super(struct super_block *sb)
  {
ee9b6d61a   Josef 'Jeff' Sipek   [PATCH] Mark stru...
375
  	const struct super_operations *sop = sb->s_op;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
376

c636ebdb1   David Howells   [PATCH] VFS: Dest...
377
378
  	if (sb->s_root) {
  		shrink_dcache_for_umount(sb);
60b0680fa   Jan Kara   vfs: Rename fsync...
379
  		sync_filesystem(sb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
380
  		sb->s_flags &= ~MS_ACTIVE;
efaee1920   Arjan van de Ven   async: make the f...
381

63997e98a   Al Viro   split invalidate_...
382
383
384
  		fsnotify_unmount_inodes(&sb->s_inodes);
  
  		evict_inodes(sb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
385

7b7a8665e   Christoph Hellwig   direct-io: Implem...
386
387
388
389
  		if (sb->s_dio_done_wq) {
  			destroy_workqueue(sb->s_dio_done_wq);
  			sb->s_dio_done_wq = NULL;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
390
391
  		if (sop->put_super)
  			sop->put_super(sb);
63997e98a   Al Viro   split invalidate_...
392
  		if (!list_empty(&sb->s_inodes)) {
7b4fe29e0   Dave Jones   [PATCH] More info...
393
394
395
396
  			printk("VFS: Busy inodes after unmount of %s. "
  			   "Self-destruct in 5 seconds.  Have a nice day...
  ",
  			   sb->s_id);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
397
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
398
399
400
  	}
  	spin_lock(&sb_lock);
  	/* should be initialized for __put_super_and_need_restart() */
a5166169f   Al Viro   vfs: convert fs_s...
401
  	hlist_del_init(&sb->s_instances);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
402
403
404
405
406
407
408
409
410
411
412
  	spin_unlock(&sb_lock);
  	up_write(&sb->s_umount);
  }
  
  EXPORT_SYMBOL(generic_shutdown_super);
  
  /**
   *	sget	-	find or create a superblock
   *	@type:	filesystem type superblock should belong to
   *	@test:	comparison callback
   *	@set:	setup callback
9249e17fe   David Howells   VFS: Pass mount f...
413
   *	@flags:	mount flags
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
414
415
416
417
418
   *	@data:	argument to each of them
   */
  struct super_block *sget(struct file_system_type *type,
  			int (*test)(struct super_block *,void *),
  			int (*set)(struct super_block *,void *),
9249e17fe   David Howells   VFS: Pass mount f...
419
  			int flags,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
420
421
422
  			void *data)
  {
  	struct super_block *s = NULL;
d47301271   Matthias Kaehlcke   fs/super.c: use l...
423
  	struct super_block *old;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
424
425
426
427
  	int err;
  
  retry:
  	spin_lock(&sb_lock);
d47301271   Matthias Kaehlcke   fs/super.c: use l...
428
  	if (test) {
b67bfe0d4   Sasha Levin   hlist: drop the n...
429
  		hlist_for_each_entry(old, &type->fs_supers, s_instances) {
d47301271   Matthias Kaehlcke   fs/super.c: use l...
430
431
432
433
  			if (!test(old, data))
  				continue;
  			if (!grab_super(old))
  				goto retry;
a3cfbb53b   Li Zefan   vfs: add missing ...
434
435
  			if (s) {
  				up_write(&s->s_umount);
d47301271   Matthias Kaehlcke   fs/super.c: use l...
436
  				destroy_super(s);
7a4dec538   Al Viro   Fix sget() race w...
437
  				s = NULL;
a3cfbb53b   Li Zefan   vfs: add missing ...
438
  			}
d47301271   Matthias Kaehlcke   fs/super.c: use l...
439
440
  			return old;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
441
442
443
  	}
  	if (!s) {
  		spin_unlock(&sb_lock);
9249e17fe   David Howells   VFS: Pass mount f...
444
  		s = alloc_super(type, flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
445
446
447
448
449
450
451
452
  		if (!s)
  			return ERR_PTR(-ENOMEM);
  		goto retry;
  	}
  		
  	err = set(s, data);
  	if (err) {
  		spin_unlock(&sb_lock);
a3cfbb53b   Li Zefan   vfs: add missing ...
453
  		up_write(&s->s_umount);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
454
455
456
457
458
459
  		destroy_super(s);
  		return ERR_PTR(err);
  	}
  	s->s_type = type;
  	strlcpy(s->s_id, type->name, sizeof(s->s_id));
  	list_add_tail(&s->s_list, &super_blocks);
a5166169f   Al Viro   vfs: convert fs_s...
460
  	hlist_add_head(&s->s_instances, &type->fs_supers);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
461
462
  	spin_unlock(&sb_lock);
  	get_filesystem(type);
b0d40c92a   Dave Chinner   superblock: intro...
463
  	register_shrinker(&s->s_shrink);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
464
465
466
467
468
469
470
471
472
473
474
475
  	return s;
  }
  
  EXPORT_SYMBOL(sget);
  
  void drop_super(struct super_block *sb)
  {
  	up_read(&sb->s_umount);
  	put_super(sb);
  }
  
  EXPORT_SYMBOL(drop_super);
e50047533   Christoph Hellwig   cleanup sync_supers
476
  /**
01a05b337   Al Viro   new helper: itera...
477
478
479
480
481
482
483
484
485
   *	iterate_supers - call function for all active superblocks
   *	@f: function to call
   *	@arg: argument to pass to it
   *
   *	Scans the superblock list and calls given function, passing it
   *	locked superblock and given argument.
   */
  void iterate_supers(void (*f)(struct super_block *, void *), void *arg)
  {
dca332528   Al Viro   no need for list_...
486
  	struct super_block *sb, *p = NULL;
01a05b337   Al Viro   new helper: itera...
487
488
  
  	spin_lock(&sb_lock);
dca332528   Al Viro   no need for list_...
489
  	list_for_each_entry(sb, &super_blocks, s_list) {
a5166169f   Al Viro   vfs: convert fs_s...
490
  		if (hlist_unhashed(&sb->s_instances))
01a05b337   Al Viro   new helper: itera...
491
492
493
494
495
  			continue;
  		sb->s_count++;
  		spin_unlock(&sb_lock);
  
  		down_read(&sb->s_umount);
dabe0dc19   Al Viro   vfs: fix the rest...
496
  		if (sb->s_root && (sb->s_flags & MS_BORN))
01a05b337   Al Viro   new helper: itera...
497
498
499
500
  			f(sb, arg);
  		up_read(&sb->s_umount);
  
  		spin_lock(&sb_lock);
dca332528   Al Viro   no need for list_...
501
502
503
  		if (p)
  			__put_super(p);
  		p = sb;
01a05b337   Al Viro   new helper: itera...
504
  	}
dca332528   Al Viro   no need for list_...
505
506
  	if (p)
  		__put_super(p);
01a05b337   Al Viro   new helper: itera...
507
508
509
510
  	spin_unlock(&sb_lock);
  }
  
  /**
43e15cdbe   Al Viro   new helper: itera...
511
512
513
514
515
516
517
518
519
520
521
522
523
524
   *	iterate_supers_type - call function for superblocks of given type
   *	@type: fs type
   *	@f: function to call
   *	@arg: argument to pass to it
   *
   *	Scans the superblock list and calls given function, passing it
   *	locked superblock and given argument.
   */
  void iterate_supers_type(struct file_system_type *type,
  	void (*f)(struct super_block *, void *), void *arg)
  {
  	struct super_block *sb, *p = NULL;
  
  	spin_lock(&sb_lock);
b67bfe0d4   Sasha Levin   hlist: drop the n...
525
  	hlist_for_each_entry(sb, &type->fs_supers, s_instances) {
43e15cdbe   Al Viro   new helper: itera...
526
527
528
529
  		sb->s_count++;
  		spin_unlock(&sb_lock);
  
  		down_read(&sb->s_umount);
dabe0dc19   Al Viro   vfs: fix the rest...
530
  		if (sb->s_root && (sb->s_flags & MS_BORN))
43e15cdbe   Al Viro   new helper: itera...
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
  			f(sb, arg);
  		up_read(&sb->s_umount);
  
  		spin_lock(&sb_lock);
  		if (p)
  			__put_super(p);
  		p = sb;
  	}
  	if (p)
  		__put_super(p);
  	spin_unlock(&sb_lock);
  }
  
  EXPORT_SYMBOL(iterate_supers_type);
  
  /**
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
547
548
549
550
551
552
   *	get_super - get the superblock of a device
   *	@bdev: device to get the superblock for
   *	
   *	Scans the superblock list and finds the superblock of the file system
   *	mounted on the device given. %NULL is returned if no match is found.
   */
df40c01a9   Al Viro   In get_super() an...
553
  struct super_block *get_super(struct block_device *bdev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
554
  {
618f06362   Kirill Korotaev   [PATCH] O(1) sb l...
555
  	struct super_block *sb;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
556
557
  	if (!bdev)
  		return NULL;
618f06362   Kirill Korotaev   [PATCH] O(1) sb l...
558

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
559
  	spin_lock(&sb_lock);
618f06362   Kirill Korotaev   [PATCH] O(1) sb l...
560
561
  rescan:
  	list_for_each_entry(sb, &super_blocks, s_list) {
a5166169f   Al Viro   vfs: convert fs_s...
562
  		if (hlist_unhashed(&sb->s_instances))
551de6f34   Al Viro   Leave superblocks...
563
  			continue;
618f06362   Kirill Korotaev   [PATCH] O(1) sb l...
564
565
  		if (sb->s_bdev == bdev) {
  			sb->s_count++;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
566
  			spin_unlock(&sb_lock);
618f06362   Kirill Korotaev   [PATCH] O(1) sb l...
567
  			down_read(&sb->s_umount);
df40c01a9   Al Viro   In get_super() an...
568
  			/* still alive? */
dabe0dc19   Al Viro   vfs: fix the rest...
569
  			if (sb->s_root && (sb->s_flags & MS_BORN))
618f06362   Kirill Korotaev   [PATCH] O(1) sb l...
570
571
  				return sb;
  			up_read(&sb->s_umount);
df40c01a9   Al Viro   In get_super() an...
572
  			/* nope, got unmounted */
618f06362   Kirill Korotaev   [PATCH] O(1) sb l...
573
  			spin_lock(&sb_lock);
df40c01a9   Al Viro   In get_super() an...
574
575
  			__put_super(sb);
  			goto rescan;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
576
577
578
579
580
581
582
  		}
  	}
  	spin_unlock(&sb_lock);
  	return NULL;
  }
  
  EXPORT_SYMBOL(get_super);
4504230a7   Christoph Hellwig   freeze_bdev: grab...
583
584
  
  /**
6b6dc836a   Jan Kara   vfs: Provide func...
585
586
587
588
589
590
591
592
593
594
595
596
   *	get_super_thawed - get thawed superblock of a device
   *	@bdev: device to get the superblock for
   *
   *	Scans the superblock list and finds the superblock of the file system
   *	mounted on the device. The superblock is returned once it is thawed
   *	(or immediately if it was not frozen). %NULL is returned if no match
   *	is found.
   */
  struct super_block *get_super_thawed(struct block_device *bdev)
  {
  	while (1) {
  		struct super_block *s = get_super(bdev);
5accdf82b   Jan Kara   fs: Improve files...
597
  		if (!s || s->s_writers.frozen == SB_UNFROZEN)
6b6dc836a   Jan Kara   vfs: Provide func...
598
599
  			return s;
  		up_read(&s->s_umount);
5accdf82b   Jan Kara   fs: Improve files...
600
601
  		wait_event(s->s_writers.wait_unfrozen,
  			   s->s_writers.frozen == SB_UNFROZEN);
6b6dc836a   Jan Kara   vfs: Provide func...
602
603
604
605
606
607
  		put_super(s);
  	}
  }
  EXPORT_SYMBOL(get_super_thawed);
  
  /**
4504230a7   Christoph Hellwig   freeze_bdev: grab...
608
609
610
611
612
   * get_active_super - get an active reference to the superblock of a device
   * @bdev: device to get the superblock for
   *
   * Scans the superblock list and finds the superblock of the file system
   * mounted on the device given.  Returns the superblock with an active
d3f214730   Al Viro   Move grabbing s_u...
613
   * reference or %NULL if none was found.
4504230a7   Christoph Hellwig   freeze_bdev: grab...
614
615
616
617
618
619
620
   */
  struct super_block *get_active_super(struct block_device *bdev)
  {
  	struct super_block *sb;
  
  	if (!bdev)
  		return NULL;
1494583de   Al Viro   fix get_active_su...
621
  restart:
4504230a7   Christoph Hellwig   freeze_bdev: grab...
622
623
  	spin_lock(&sb_lock);
  	list_for_each_entry(sb, &super_blocks, s_list) {
a5166169f   Al Viro   vfs: convert fs_s...
624
  		if (hlist_unhashed(&sb->s_instances))
551de6f34   Al Viro   Leave superblocks...
625
  			continue;
1494583de   Al Viro   fix get_active_su...
626
  		if (sb->s_bdev == bdev) {
acfec9a5a   Al Viro   livelock avoidanc...
627
  			if (!grab_super(sb))
1494583de   Al Viro   fix get_active_su...
628
  				goto restart;
acfec9a5a   Al Viro   livelock avoidanc...
629
630
  			up_write(&sb->s_umount);
  			return sb;
1494583de   Al Viro   fix get_active_su...
631
  		}
4504230a7   Christoph Hellwig   freeze_bdev: grab...
632
633
634
635
  	}
  	spin_unlock(&sb_lock);
  	return NULL;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
636
   
df40c01a9   Al Viro   In get_super() an...
637
  struct super_block *user_get_super(dev_t dev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
638
  {
618f06362   Kirill Korotaev   [PATCH] O(1) sb l...
639
  	struct super_block *sb;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
640

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
641
  	spin_lock(&sb_lock);
618f06362   Kirill Korotaev   [PATCH] O(1) sb l...
642
643
  rescan:
  	list_for_each_entry(sb, &super_blocks, s_list) {
a5166169f   Al Viro   vfs: convert fs_s...
644
  		if (hlist_unhashed(&sb->s_instances))
551de6f34   Al Viro   Leave superblocks...
645
  			continue;
618f06362   Kirill Korotaev   [PATCH] O(1) sb l...
646
647
  		if (sb->s_dev ==  dev) {
  			sb->s_count++;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
648
  			spin_unlock(&sb_lock);
618f06362   Kirill Korotaev   [PATCH] O(1) sb l...
649
  			down_read(&sb->s_umount);
df40c01a9   Al Viro   In get_super() an...
650
  			/* still alive? */
dabe0dc19   Al Viro   vfs: fix the rest...
651
  			if (sb->s_root && (sb->s_flags & MS_BORN))
618f06362   Kirill Korotaev   [PATCH] O(1) sb l...
652
653
  				return sb;
  			up_read(&sb->s_umount);
df40c01a9   Al Viro   In get_super() an...
654
  			/* nope, got unmounted */
618f06362   Kirill Korotaev   [PATCH] O(1) sb l...
655
  			spin_lock(&sb_lock);
df40c01a9   Al Viro   In get_super() an...
656
657
  			__put_super(sb);
  			goto rescan;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
658
659
660
661
662
  		}
  	}
  	spin_unlock(&sb_lock);
  	return NULL;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
663
  /**
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
664
665
666
667
668
669
670
671
672
673
674
   *	do_remount_sb - asks filesystem to change mount options.
   *	@sb:	superblock in question
   *	@flags:	numeric part of options
   *	@data:	the rest of options
   *      @force: whether or not to force the change
   *
   *	Alters the mount options of a mounted file system.
   */
  int do_remount_sb(struct super_block *sb, int flags, void *data, int force)
  {
  	int retval;
c79d967de   Christoph Hellwig   quota: move remou...
675
  	int remount_ro;
4504230a7   Christoph Hellwig   freeze_bdev: grab...
676

5accdf82b   Jan Kara   fs: Improve files...
677
  	if (sb->s_writers.frozen != SB_UNFROZEN)
4504230a7   Christoph Hellwig   freeze_bdev: grab...
678
  		return -EBUSY;
9361401eb   David Howells   [PATCH] BLOCK: Ma...
679
  #ifdef CONFIG_BLOCK
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
680
681
  	if (!(flags & MS_RDONLY) && bdev_read_only(sb->s_bdev))
  		return -EACCES;
9361401eb   David Howells   [PATCH] BLOCK: Ma...
682
  #endif
4504230a7   Christoph Hellwig   freeze_bdev: grab...
683

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
684
685
686
  	if (flags & MS_RDONLY)
  		acct_auto_close(sb);
  	shrink_dcache_sb(sb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
687

d208bbdda   Nick Piggin   fs: improve remou...
688
  	remount_ro = (flags & MS_RDONLY) && !(sb->s_flags & MS_RDONLY);
d208bbdda   Nick Piggin   fs: improve remou...
689

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
690
691
  	/* If we are remounting RDONLY and current sb is read/write,
  	   make sure there are no rw files opened */
d208bbdda   Nick Piggin   fs: improve remou...
692
  	if (remount_ro) {
4ed5e82fe   Miklos Szeredi   vfs: protect remo...
693
  		if (force) {
eee5cc270   Al Viro   get rid of s_file...
694
695
  			sb->s_readonly_remount = 1;
  			smp_wmb();
4ed5e82fe   Miklos Szeredi   vfs: protect remo...
696
697
698
699
  		} else {
  			retval = sb_prepare_remount_readonly(sb);
  			if (retval)
  				return retval;
4ed5e82fe   Miklos Szeredi   vfs: protect remo...
700
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
701
702
703
  	}
  
  	if (sb->s_op->remount_fs) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
704
  		retval = sb->s_op->remount_fs(sb, &flags, data);
2833eb2b4   Miklos Szeredi   vfs: ignore error...
705
706
  		if (retval) {
  			if (!force)
4ed5e82fe   Miklos Szeredi   vfs: protect remo...
707
  				goto cancel_readonly;
2833eb2b4   Miklos Szeredi   vfs: ignore error...
708
709
710
711
712
  			/* If forced remount, go ahead despite any errors */
  			WARN(1, "forced remount of a %s fs returned %i
  ",
  			     sb->s_type->name, retval);
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
713
714
  	}
  	sb->s_flags = (sb->s_flags & ~MS_RMT_MASK) | (flags & MS_RMT_MASK);
4ed5e82fe   Miklos Szeredi   vfs: protect remo...
715
716
717
  	/* Needs to be ordered wrt mnt_is_readonly() */
  	smp_wmb();
  	sb->s_readonly_remount = 0;
c79d967de   Christoph Hellwig   quota: move remou...
718

d208bbdda   Nick Piggin   fs: improve remou...
719
720
721
722
723
724
725
726
727
728
  	/*
  	 * Some filesystems modify their metadata via some other path than the
  	 * bdev buffer cache (eg. use a private mapping, or directories in
  	 * pagecache, etc). Also file data modifications go via their own
  	 * mappings. So If we try to mount readonly then copy the filesystem
  	 * from bdev, we could get stale data, so invalidate it to give a best
  	 * effort at coherency.
  	 */
  	if (remount_ro && sb->s_bdev)
  		invalidate_bdev(sb->s_bdev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
729
  	return 0;
4ed5e82fe   Miklos Szeredi   vfs: protect remo...
730
731
732
733
  
  cancel_readonly:
  	sb->s_readonly_remount = 0;
  	return retval;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
734
  }
a2a9537ac   Jens Axboe   Get rid of pdflus...
735
  static void do_emergency_remount(struct work_struct *work)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
736
  {
dca332528   Al Viro   no need for list_...
737
  	struct super_block *sb, *p = NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
738
739
  
  	spin_lock(&sb_lock);
dca332528   Al Viro   no need for list_...
740
  	list_for_each_entry(sb, &super_blocks, s_list) {
a5166169f   Al Viro   vfs: convert fs_s...
741
  		if (hlist_unhashed(&sb->s_instances))
551de6f34   Al Viro   Leave superblocks...
742
  			continue;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
743
744
  		sb->s_count++;
  		spin_unlock(&sb_lock);
443b94baa   Al Viro   Make sure that al...
745
  		down_write(&sb->s_umount);
dabe0dc19   Al Viro   vfs: fix the rest...
746
747
  		if (sb->s_root && sb->s_bdev && (sb->s_flags & MS_BORN) &&
  		    !(sb->s_flags & MS_RDONLY)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
748
  			/*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
749
750
  			 * What lock protects sb->s_flags??
  			 */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
751
  			do_remount_sb(sb, MS_RDONLY, NULL, 1);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
752
  		}
443b94baa   Al Viro   Make sure that al...
753
  		up_write(&sb->s_umount);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
754
  		spin_lock(&sb_lock);
dca332528   Al Viro   no need for list_...
755
756
757
  		if (p)
  			__put_super(p);
  		p = sb;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
758
  	}
dca332528   Al Viro   no need for list_...
759
760
  	if (p)
  		__put_super(p);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
761
  	spin_unlock(&sb_lock);
a2a9537ac   Jens Axboe   Get rid of pdflus...
762
  	kfree(work);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
763
764
765
766
767
768
  	printk("Emergency Remount complete
  ");
  }
  
  void emergency_remount(void)
  {
a2a9537ac   Jens Axboe   Get rid of pdflus...
769
770
771
772
773
774
775
  	struct work_struct *work;
  
  	work = kmalloc(sizeof(*work), GFP_ATOMIC);
  	if (work) {
  		INIT_WORK(work, do_emergency_remount);
  		schedule_work(work);
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
776
777
778
779
780
781
  }
  
  /*
   * Unnamed block devices are dummy devices used by virtual
   * filesystems which don't use real block-devices.  -- jrs
   */
ad76cbc63   Alexey Dobriyan   [PATCH 2/2] anond...
782
  static DEFINE_IDA(unnamed_dev_ida);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
783
  static DEFINE_SPINLOCK(unnamed_dev_lock);/* protects the above */
a2a4dc494   Thomas Bächler   fs: Don't return ...
784
785
786
787
  /* Many userspace utilities consider an FSID of 0 invalid.
   * Always return at least 1 from get_anon_bdev.
   */
  static int unnamed_dev_start = 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
788

0ee5dc676   Al Viro   btrfs: kill magic...
789
  int get_anon_bdev(dev_t *p)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
790
791
792
793
794
  {
  	int dev;
  	int error;
  
   retry:
ad76cbc63   Alexey Dobriyan   [PATCH 2/2] anond...
795
  	if (ida_pre_get(&unnamed_dev_ida, GFP_ATOMIC) == 0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
796
797
  		return -ENOMEM;
  	spin_lock(&unnamed_dev_lock);
c63e09ecc   Al Viro   Make allocation o...
798
  	error = ida_get_new_above(&unnamed_dev_ida, unnamed_dev_start, &dev);
f21f62208   Al Viro   ... and the same ...
799
800
  	if (!error)
  		unnamed_dev_start = dev + 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
801
802
803
804
805
806
  	spin_unlock(&unnamed_dev_lock);
  	if (error == -EAGAIN)
  		/* We raced and lost with another CPU. */
  		goto retry;
  	else if (error)
  		return -EAGAIN;
e8c8d1bc0   Tejun Heo   idr: remove MAX_I...
807
  	if (dev == (1 << MINORBITS)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
808
  		spin_lock(&unnamed_dev_lock);
ad76cbc63   Alexey Dobriyan   [PATCH 2/2] anond...
809
  		ida_remove(&unnamed_dev_ida, dev);
f21f62208   Al Viro   ... and the same ...
810
811
  		if (unnamed_dev_start > dev)
  			unnamed_dev_start = dev;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
812
813
814
  		spin_unlock(&unnamed_dev_lock);
  		return -EMFILE;
  	}
0ee5dc676   Al Viro   btrfs: kill magic...
815
  	*p = MKDEV(0, dev & MINORMASK);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
816
817
  	return 0;
  }
0ee5dc676   Al Viro   btrfs: kill magic...
818
  EXPORT_SYMBOL(get_anon_bdev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
819

0ee5dc676   Al Viro   btrfs: kill magic...
820
  void free_anon_bdev(dev_t dev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
821
  {
0ee5dc676   Al Viro   btrfs: kill magic...
822
  	int slot = MINOR(dev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
823
  	spin_lock(&unnamed_dev_lock);
ad76cbc63   Alexey Dobriyan   [PATCH 2/2] anond...
824
  	ida_remove(&unnamed_dev_ida, slot);
c63e09ecc   Al Viro   Make allocation o...
825
826
  	if (slot < unnamed_dev_start)
  		unnamed_dev_start = slot;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
827
828
  	spin_unlock(&unnamed_dev_lock);
  }
0ee5dc676   Al Viro   btrfs: kill magic...
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
  EXPORT_SYMBOL(free_anon_bdev);
  
  int set_anon_super(struct super_block *s, void *data)
  {
  	int error = get_anon_bdev(&s->s_dev);
  	if (!error)
  		s->s_bdi = &noop_backing_dev_info;
  	return error;
  }
  
  EXPORT_SYMBOL(set_anon_super);
  
  void kill_anon_super(struct super_block *sb)
  {
  	dev_t dev = sb->s_dev;
  	generic_shutdown_super(sb);
  	free_anon_bdev(dev);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
847
848
  
  EXPORT_SYMBOL(kill_anon_super);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
849
850
851
852
853
854
855
856
  void kill_litter_super(struct super_block *sb)
  {
  	if (sb->s_root)
  		d_genocide(sb->s_root);
  	kill_anon_super(sb);
  }
  
  EXPORT_SYMBOL(kill_litter_super);
909e6d947   Serge E. Hallyn   namespaces: move ...
857
858
859
860
861
862
863
864
865
866
  static int ns_test_super(struct super_block *sb, void *data)
  {
  	return sb->s_fs_info == data;
  }
  
  static int ns_set_super(struct super_block *sb, void *data)
  {
  	sb->s_fs_info = data;
  	return set_anon_super(sb, NULL);
  }
ceefda693   Al Viro   switch get_sb_ns(...
867
868
  struct dentry *mount_ns(struct file_system_type *fs_type, int flags,
  	void *data, int (*fill_super)(struct super_block *, void *, int))
909e6d947   Serge E. Hallyn   namespaces: move ...
869
870
  {
  	struct super_block *sb;
9249e17fe   David Howells   VFS: Pass mount f...
871
  	sb = sget(fs_type, ns_test_super, ns_set_super, flags, data);
909e6d947   Serge E. Hallyn   namespaces: move ...
872
  	if (IS_ERR(sb))
ceefda693   Al Viro   switch get_sb_ns(...
873
  		return ERR_CAST(sb);
909e6d947   Serge E. Hallyn   namespaces: move ...
874
875
876
  
  	if (!sb->s_root) {
  		int err;
909e6d947   Serge E. Hallyn   namespaces: move ...
877
878
  		err = fill_super(sb, data, flags & MS_SILENT ? 1 : 0);
  		if (err) {
74dbbdd7f   Al Viro   New helper: deact...
879
  			deactivate_locked_super(sb);
ceefda693   Al Viro   switch get_sb_ns(...
880
  			return ERR_PTR(err);
909e6d947   Serge E. Hallyn   namespaces: move ...
881
882
883
884
  		}
  
  		sb->s_flags |= MS_ACTIVE;
  	}
ceefda693   Al Viro   switch get_sb_ns(...
885
  	return dget(sb->s_root);
909e6d947   Serge E. Hallyn   namespaces: move ...
886
  }
ceefda693   Al Viro   switch get_sb_ns(...
887
  EXPORT_SYMBOL(mount_ns);
909e6d947   Serge E. Hallyn   namespaces: move ...
888

9361401eb   David Howells   [PATCH] BLOCK: Ma...
889
  #ifdef CONFIG_BLOCK
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
890
891
892
893
  static int set_bdev_super(struct super_block *s, void *data)
  {
  	s->s_bdev = data;
  	s->s_dev = s->s_bdev->bd_dev;
32a88aa1b   Jens Axboe   fs: Assign bdi in...
894
895
896
897
898
899
  
  	/*
  	 * We set the bdi here to the queue backing, file systems can
  	 * overwrite this in ->fill_super()
  	 */
  	s->s_bdi = &bdev_get_queue(s->s_bdev)->backing_dev_info;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
900
901
902
903
904
905
906
  	return 0;
  }
  
  static int test_bdev_super(struct super_block *s, void *data)
  {
  	return (void *)s->s_bdev == data;
  }
152a08366   Al Viro   new helper: mount...
907
  struct dentry *mount_bdev(struct file_system_type *fs_type,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
908
  	int flags, const char *dev_name, void *data,
152a08366   Al Viro   new helper: mount...
909
  	int (*fill_super)(struct super_block *, void *, int))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
910
911
912
  {
  	struct block_device *bdev;
  	struct super_block *s;
d4d776299   Tejun Heo   block: clean up b...
913
  	fmode_t mode = FMODE_READ | FMODE_EXCL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
914
  	int error = 0;
30c40d2c0   Al Viro   [PATCH] propagate...
915
916
  	if (!(flags & MS_RDONLY))
  		mode |= FMODE_WRITE;
d4d776299   Tejun Heo   block: clean up b...
917
  	bdev = blkdev_get_by_path(dev_name, mode, fs_type);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
918
  	if (IS_ERR(bdev))
152a08366   Al Viro   new helper: mount...
919
  		return ERR_CAST(bdev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
920
921
922
923
924
925
  
  	/*
  	 * once the super is inserted into the list by sget, s_umount
  	 * will protect the lockfs code from trying to start a snapshot
  	 * while we are mounting
  	 */
4fadd7bb2   Christoph Hellwig   freeze_bdev: kill...
926
927
928
929
930
931
  	mutex_lock(&bdev->bd_fsfreeze_mutex);
  	if (bdev->bd_fsfreeze_count > 0) {
  		mutex_unlock(&bdev->bd_fsfreeze_mutex);
  		error = -EBUSY;
  		goto error_bdev;
  	}
9249e17fe   David Howells   VFS: Pass mount f...
932
933
  	s = sget(fs_type, test_bdev_super, set_bdev_super, flags | MS_NOSEC,
  		 bdev);
4fadd7bb2   Christoph Hellwig   freeze_bdev: kill...
934
  	mutex_unlock(&bdev->bd_fsfreeze_mutex);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
935
  	if (IS_ERR(s))
454e2398b   David Howells   [PATCH] VFS: Perm...
936
  		goto error_s;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
937
938
939
  
  	if (s->s_root) {
  		if ((flags ^ s->s_flags) & MS_RDONLY) {
74dbbdd7f   Al Viro   New helper: deact...
940
  			deactivate_locked_super(s);
454e2398b   David Howells   [PATCH] VFS: Perm...
941
942
  			error = -EBUSY;
  			goto error_bdev;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
943
  		}
454e2398b   David Howells   [PATCH] VFS: Perm...
944

4f331f01b   Tejun Heo   vfs: don't hold s...
945
946
  		/*
  		 * s_umount nests inside bd_mutex during
e525fd89d   Tejun Heo   block: make blkde...
947
948
949
950
  		 * __invalidate_device().  blkdev_put() acquires
  		 * bd_mutex and can't be called under s_umount.  Drop
  		 * s_umount temporarily.  This is safe as we're
  		 * holding an active reference.
4f331f01b   Tejun Heo   vfs: don't hold s...
951
952
  		 */
  		up_write(&s->s_umount);
d4d776299   Tejun Heo   block: clean up b...
953
  		blkdev_put(bdev, mode);
4f331f01b   Tejun Heo   vfs: don't hold s...
954
  		down_write(&s->s_umount);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
955
956
  	} else {
  		char b[BDEVNAME_SIZE];
30c40d2c0   Al Viro   [PATCH] propagate...
957
  		s->s_mode = mode;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
958
  		strlcpy(s->s_id, bdevname(bdev, b), sizeof(s->s_id));
e78c9a004   Pekka Enberg   [PATCH] fs: remov...
959
  		sb_set_blocksize(s, block_size(bdev));
9b04c997b   Theodore Ts'o   [PATCH] vfs: MS_V...
960
  		error = fill_super(s, data, flags & MS_SILENT ? 1 : 0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
961
  		if (error) {
74dbbdd7f   Al Viro   New helper: deact...
962
  			deactivate_locked_super(s);
454e2398b   David Howells   [PATCH] VFS: Perm...
963
  			goto error;
fa675765a   Greg Kroah-Hartman   Revert mount/umou...
964
  		}
454e2398b   David Howells   [PATCH] VFS: Perm...
965
966
  
  		s->s_flags |= MS_ACTIVE;
87d8fe1ee   Theodore Ts'o   add releasepage h...
967
  		bdev->bd_super = s;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
968
  	}
152a08366   Al Viro   new helper: mount...
969
  	return dget(s->s_root);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
970

454e2398b   David Howells   [PATCH] VFS: Perm...
971
972
973
  error_s:
  	error = PTR_ERR(s);
  error_bdev:
d4d776299   Tejun Heo   block: clean up b...
974
  	blkdev_put(bdev, mode);
454e2398b   David Howells   [PATCH] VFS: Perm...
975
  error:
152a08366   Al Viro   new helper: mount...
976
977
978
  	return ERR_PTR(error);
  }
  EXPORT_SYMBOL(mount_bdev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
979
980
981
  void kill_block_super(struct super_block *sb)
  {
  	struct block_device *bdev = sb->s_bdev;
30c40d2c0   Al Viro   [PATCH] propagate...
982
  	fmode_t mode = sb->s_mode;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
983

ddbaaf302   H Hartley Sweeten   NULL noise in fs/...
984
  	bdev->bd_super = NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
985
986
  	generic_shutdown_super(sb);
  	sync_blockdev(bdev);
d4d776299   Tejun Heo   block: clean up b...
987
  	WARN_ON_ONCE(!(mode & FMODE_EXCL));
e525fd89d   Tejun Heo   block: make blkde...
988
  	blkdev_put(bdev, mode | FMODE_EXCL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
989
990
991
  }
  
  EXPORT_SYMBOL(kill_block_super);
9361401eb   David Howells   [PATCH] BLOCK: Ma...
992
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
993

3c26ff6e4   Al Viro   convert get_sb_no...
994
  struct dentry *mount_nodev(struct file_system_type *fs_type,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
995
  	int flags, void *data,
3c26ff6e4   Al Viro   convert get_sb_no...
996
  	int (*fill_super)(struct super_block *, void *, int))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
997
998
  {
  	int error;
9249e17fe   David Howells   VFS: Pass mount f...
999
  	struct super_block *s = sget(fs_type, NULL, set_anon_super, flags, NULL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1000
1001
  
  	if (IS_ERR(s))
3c26ff6e4   Al Viro   convert get_sb_no...
1002
  		return ERR_CAST(s);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1003

9b04c997b   Theodore Ts'o   [PATCH] vfs: MS_V...
1004
  	error = fill_super(s, data, flags & MS_SILENT ? 1 : 0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1005
  	if (error) {
74dbbdd7f   Al Viro   New helper: deact...
1006
  		deactivate_locked_super(s);
3c26ff6e4   Al Viro   convert get_sb_no...
1007
  		return ERR_PTR(error);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1008
1009
  	}
  	s->s_flags |= MS_ACTIVE;
3c26ff6e4   Al Viro   convert get_sb_no...
1010
  	return dget(s->s_root);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1011
  }
3c26ff6e4   Al Viro   convert get_sb_no...
1012
  EXPORT_SYMBOL(mount_nodev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1013
1014
1015
1016
  static int compare_single(struct super_block *s, void *p)
  {
  	return 1;
  }
fc14f2fef   Al Viro   convert get_sb_si...
1017
  struct dentry *mount_single(struct file_system_type *fs_type,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1018
  	int flags, void *data,
fc14f2fef   Al Viro   convert get_sb_si...
1019
  	int (*fill_super)(struct super_block *, void *, int))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1020
1021
1022
  {
  	struct super_block *s;
  	int error;
9249e17fe   David Howells   VFS: Pass mount f...
1023
  	s = sget(fs_type, compare_single, set_anon_super, flags, NULL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1024
  	if (IS_ERR(s))
fc14f2fef   Al Viro   convert get_sb_si...
1025
  		return ERR_CAST(s);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1026
  	if (!s->s_root) {
9b04c997b   Theodore Ts'o   [PATCH] vfs: MS_V...
1027
  		error = fill_super(s, data, flags & MS_SILENT ? 1 : 0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1028
  		if (error) {
74dbbdd7f   Al Viro   New helper: deact...
1029
  			deactivate_locked_super(s);
fc14f2fef   Al Viro   convert get_sb_si...
1030
  			return ERR_PTR(error);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1031
1032
  		}
  		s->s_flags |= MS_ACTIVE;
9329d1bea   Kay Sievers   vfs: get_sb_singl...
1033
1034
  	} else {
  		do_remount_sb(s, flags, data, 0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1035
  	}
fc14f2fef   Al Viro   convert get_sb_si...
1036
1037
1038
  	return dget(s->s_root);
  }
  EXPORT_SYMBOL(mount_single);
9d412a43c   Al Viro   vfs: split off vf...
1039
1040
  struct dentry *
  mount_fs(struct file_system_type *type, int flags, const char *name, void *data)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1041
  {
c96e41e92   Al Viro   beginning of tran...
1042
  	struct dentry *root;
9d412a43c   Al Viro   vfs: split off vf...
1043
  	struct super_block *sb;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1044
  	char *secdata = NULL;
9d412a43c   Al Viro   vfs: split off vf...
1045
  	int error = -ENOMEM;
8089352a1   Al Viro   Mirror MS_KERNMOU...
1046

e00075298   Eric Paris   LSM/SELinux: Inte...
1047
  	if (data && !(type->fs_flags & FS_BINARY_MOUNTDATA)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1048
  		secdata = alloc_secdata();
454e2398b   David Howells   [PATCH] VFS: Perm...
1049
  		if (!secdata)
9d412a43c   Al Viro   vfs: split off vf...
1050
  			goto out;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1051

e00075298   Eric Paris   LSM/SELinux: Inte...
1052
  		error = security_sb_copy_data(data, secdata);
454e2398b   David Howells   [PATCH] VFS: Perm...
1053
  		if (error)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1054
  			goto out_free_secdata;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1055
  	}
1a102ff92   Al Viro   vfs: bury ->get_sb()
1056
1057
1058
1059
  	root = type->mount(type, flags, name, data);
  	if (IS_ERR(root)) {
  		error = PTR_ERR(root);
  		goto out_free_secdata;
c96e41e92   Al Viro   beginning of tran...
1060
  	}
9d412a43c   Al Viro   vfs: split off vf...
1061
1062
1063
  	sb = root->d_sb;
  	BUG_ON(!sb);
  	WARN_ON(!sb->s_bdi);
6c5103890   Linus Torvalds   Merge branch 'for...
1064
  	WARN_ON(sb->s_bdi == &default_backing_dev_info);
9d412a43c   Al Viro   vfs: split off vf...
1065
  	sb->s_flags |= MS_BORN;
454e2398b   David Howells   [PATCH] VFS: Perm...
1066

9d412a43c   Al Viro   vfs: split off vf...
1067
  	error = security_sb_kern_mount(sb, flags, secdata);
5129a469a   Jörn Engel   Catch filesystems...
1068
1069
  	if (error)
  		goto out_sb;
454e2398b   David Howells   [PATCH] VFS: Perm...
1070

42cb56ae2   Jeff Layton   vfs: change sb->s...
1071
1072
1073
1074
  	/*
  	 * filesystems should never set s_maxbytes larger than MAX_LFS_FILESIZE
  	 * but s_maxbytes was an unsigned long long for many releases. Throw
  	 * this warning for a little while to try and catch filesystems that
4358b5678   Jeff Layton   VFS: trivial: fix...
1075
  	 * violate this rule.
42cb56ae2   Jeff Layton   vfs: change sb->s...
1076
  	 */
9d412a43c   Al Viro   vfs: split off vf...
1077
1078
1079
  	WARN((sb->s_maxbytes < 0), "%s set sb->s_maxbytes to "
  		"negative value (%lld)
  ", type->name, sb->s_maxbytes);
42cb56ae2   Jeff Layton   vfs: change sb->s...
1080

9d412a43c   Al Viro   vfs: split off vf...
1081
  	up_write(&sb->s_umount);
8680e22f2   Gerald Schaefer   [PATCH] VFS: memo...
1082
  	free_secdata(secdata);
9d412a43c   Al Viro   vfs: split off vf...
1083
  	return root;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1084
  out_sb:
9d412a43c   Al Viro   vfs: split off vf...
1085
1086
  	dput(root);
  	deactivate_locked_super(sb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1087
1088
  out_free_secdata:
  	free_secdata(secdata);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1089
  out:
454e2398b   David Howells   [PATCH] VFS: Perm...
1090
  	return ERR_PTR(error);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1091
  }
5accdf82b   Jan Kara   fs: Improve files...
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
  /*
   * This is an internal function, please use sb_end_{write,pagefault,intwrite}
   * instead.
   */
  void __sb_end_write(struct super_block *sb, int level)
  {
  	percpu_counter_dec(&sb->s_writers.counter[level-1]);
  	/*
  	 * Make sure s_writers are updated before we wake up waiters in
  	 * freeze_super().
  	 */
  	smp_mb();
  	if (waitqueue_active(&sb->s_writers.wait))
  		wake_up(&sb->s_writers.wait);
  	rwsem_release(&sb->s_writers.lock_map[level-1], 1, _RET_IP_);
  }
  EXPORT_SYMBOL(__sb_end_write);
  
  #ifdef CONFIG_LOCKDEP
  /*
   * We want lockdep to tell us about possible deadlocks with freezing but
   * it's it bit tricky to properly instrument it. Getting a freeze protection
   * works as getting a read lock but there are subtle problems. XFS for example
   * gets freeze protection on internal level twice in some cases, which is OK
   * only because we already hold a freeze protection also on higher level. Due
   * to these cases we have to tell lockdep we are doing trylock when we
   * already hold a freeze protection for a higher freeze level.
   */
  static void acquire_freeze_lock(struct super_block *sb, int level, bool trylock,
  				unsigned long ip)
  {
  	int i;
  
  	if (!trylock) {
  		for (i = 0; i < level - 1; i++)
  			if (lock_is_held(&sb->s_writers.lock_map[i])) {
  				trylock = true;
  				break;
  			}
  	}
  	rwsem_acquire_read(&sb->s_writers.lock_map[level-1], 0, trylock, ip);
  }
  #endif
  
  /*
   * This is an internal function, please use sb_start_{write,pagefault,intwrite}
   * instead.
   */
  int __sb_start_write(struct super_block *sb, int level, bool wait)
  {
  retry:
  	if (unlikely(sb->s_writers.frozen >= level)) {
  		if (!wait)
  			return 0;
  		wait_event(sb->s_writers.wait_unfrozen,
  			   sb->s_writers.frozen < level);
  	}
  
  #ifdef CONFIG_LOCKDEP
  	acquire_freeze_lock(sb, level, !wait, _RET_IP_);
  #endif
  	percpu_counter_inc(&sb->s_writers.counter[level-1]);
  	/*
  	 * Make sure counter is updated before we check for frozen.
  	 * freeze_super() first sets frozen and then checks the counter.
  	 */
  	smp_mb();
  	if (unlikely(sb->s_writers.frozen >= level)) {
  		__sb_end_write(sb, level);
  		goto retry;
  	}
  	return 1;
  }
  EXPORT_SYMBOL(__sb_start_write);
  
  /**
   * sb_wait_write - wait until all writers to given file system finish
   * @sb: the super for which we wait
   * @level: type of writers we wait for (normal vs page fault)
   *
   * This function waits until there are no writers of given type to given file
   * system. Caller of this function should make sure there can be no new writers
   * of type @level before calling this function. Otherwise this function can
   * livelock.
   */
  static void sb_wait_write(struct super_block *sb, int level)
  {
  	s64 writers;
  
  	/*
  	 * We just cycle-through lockdep here so that it does not complain
  	 * about returning with lock to userspace
  	 */
  	rwsem_acquire(&sb->s_writers.lock_map[level-1], 0, 0, _THIS_IP_);
  	rwsem_release(&sb->s_writers.lock_map[level-1], 1, _THIS_IP_);
  
  	do {
  		DEFINE_WAIT(wait);
  
  		/*
  		 * We use a barrier in prepare_to_wait() to separate setting
  		 * of frozen and checking of the counter
  		 */
  		prepare_to_wait(&sb->s_writers.wait, &wait,
  				TASK_UNINTERRUPTIBLE);
  
  		writers = percpu_counter_sum(&sb->s_writers.counter[level-1]);
  		if (writers)
  			schedule();
  
  		finish_wait(&sb->s_writers.wait, &wait);
  	} while (writers);
  }
18e9e5104   Josef Bacik   Introduce freeze_...
1205
  /**
7000d3c42   Randy Dunlap   fs/super: fix ker...
1206
1207
   * freeze_super - lock the filesystem and force it into a consistent state
   * @sb: the super to lock
18e9e5104   Josef Bacik   Introduce freeze_...
1208
1209
1210
1211
   *
   * Syncs the super to make sure the filesystem is consistent and calls the fs's
   * freeze_fs.  Subsequent calls to this without first thawing the fs will return
   * -EBUSY.
5accdf82b   Jan Kara   fs: Improve files...
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
   *
   * During this function, sb->s_writers.frozen goes through these values:
   *
   * SB_UNFROZEN: File system is normal, all writes progress as usual.
   *
   * SB_FREEZE_WRITE: The file system is in the process of being frozen.  New
   * writes should be blocked, though page faults are still allowed. We wait for
   * all writes to complete and then proceed to the next stage.
   *
   * SB_FREEZE_PAGEFAULT: Freezing continues. Now also page faults are blocked
   * but internal fs threads can still modify the filesystem (although they
   * should not dirty new pages or inodes), writeback can run etc. After waiting
   * for all running page faults we sync the filesystem which will clean all
   * dirty pages and inodes (no new dirty pages or inodes can be created when
   * sync is running).
   *
   * SB_FREEZE_FS: The file system is frozen. Now all internal sources of fs
   * modification are blocked (e.g. XFS preallocation truncation on inode
   * reclaim). This is usually implemented by blocking new transactions for
   * filesystems that have them and need this additional guard. After all
   * internal writers are finished we call ->freeze_fs() to finish filesystem
   * freezing. Then we transition to SB_FREEZE_COMPLETE state. This state is
   * mostly auxiliary for filesystems to verify they do not modify frozen fs.
   *
   * sb->s_writers.frozen is protected by sb->s_umount.
18e9e5104   Josef Bacik   Introduce freeze_...
1237
1238
1239
1240
1241
1242
1243
   */
  int freeze_super(struct super_block *sb)
  {
  	int ret;
  
  	atomic_inc(&sb->s_active);
  	down_write(&sb->s_umount);
5accdf82b   Jan Kara   fs: Improve files...
1244
  	if (sb->s_writers.frozen != SB_UNFROZEN) {
18e9e5104   Josef Bacik   Introduce freeze_...
1245
1246
1247
  		deactivate_locked_super(sb);
  		return -EBUSY;
  	}
dabe0dc19   Al Viro   vfs: fix the rest...
1248
1249
1250
1251
  	if (!(sb->s_flags & MS_BORN)) {
  		up_write(&sb->s_umount);
  		return 0;	/* sic - it's "nothing to do" */
  	}
18e9e5104   Josef Bacik   Introduce freeze_...
1252
  	if (sb->s_flags & MS_RDONLY) {
5accdf82b   Jan Kara   fs: Improve files...
1253
1254
  		/* Nothing to do really... */
  		sb->s_writers.frozen = SB_FREEZE_COMPLETE;
18e9e5104   Josef Bacik   Introduce freeze_...
1255
1256
1257
  		up_write(&sb->s_umount);
  		return 0;
  	}
5accdf82b   Jan Kara   fs: Improve files...
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
  	/* From now on, no new normal writers can start */
  	sb->s_writers.frozen = SB_FREEZE_WRITE;
  	smp_wmb();
  
  	/* Release s_umount to preserve sb_start_write -> s_umount ordering */
  	up_write(&sb->s_umount);
  
  	sb_wait_write(sb, SB_FREEZE_WRITE);
  
  	/* Now we go and block page faults... */
  	down_write(&sb->s_umount);
  	sb->s_writers.frozen = SB_FREEZE_PAGEFAULT;
18e9e5104   Josef Bacik   Introduce freeze_...
1270
  	smp_wmb();
5accdf82b   Jan Kara   fs: Improve files...
1271
1272
1273
  	sb_wait_write(sb, SB_FREEZE_PAGEFAULT);
  
  	/* All writers are done so after syncing there won't be dirty data */
18e9e5104   Josef Bacik   Introduce freeze_...
1274
  	sync_filesystem(sb);
5accdf82b   Jan Kara   fs: Improve files...
1275
1276
  	/* Now wait for internal filesystem counter */
  	sb->s_writers.frozen = SB_FREEZE_FS;
18e9e5104   Josef Bacik   Introduce freeze_...
1277
  	smp_wmb();
5accdf82b   Jan Kara   fs: Improve files...
1278
  	sb_wait_write(sb, SB_FREEZE_FS);
18e9e5104   Josef Bacik   Introduce freeze_...
1279

18e9e5104   Josef Bacik   Introduce freeze_...
1280
1281
1282
1283
1284
1285
  	if (sb->s_op->freeze_fs) {
  		ret = sb->s_op->freeze_fs(sb);
  		if (ret) {
  			printk(KERN_ERR
  				"VFS:Filesystem freeze failed
  ");
5accdf82b   Jan Kara   fs: Improve files...
1286
  			sb->s_writers.frozen = SB_UNFROZEN;
e1616300a   Kazuya Mio   wake up s_wait_un...
1287
  			smp_wmb();
5accdf82b   Jan Kara   fs: Improve files...
1288
  			wake_up(&sb->s_writers.wait_unfrozen);
18e9e5104   Josef Bacik   Introduce freeze_...
1289
1290
1291
1292
  			deactivate_locked_super(sb);
  			return ret;
  		}
  	}
5accdf82b   Jan Kara   fs: Improve files...
1293
1294
1295
1296
1297
  	/*
  	 * This is just for debugging purposes so that fs can warn if it
  	 * sees write activity when frozen is set to SB_FREEZE_COMPLETE.
  	 */
  	sb->s_writers.frozen = SB_FREEZE_COMPLETE;
18e9e5104   Josef Bacik   Introduce freeze_...
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
  	up_write(&sb->s_umount);
  	return 0;
  }
  EXPORT_SYMBOL(freeze_super);
  
  /**
   * thaw_super -- unlock filesystem
   * @sb: the super to thaw
   *
   * Unlocks the filesystem and marks it writeable again after freeze_super().
   */
  int thaw_super(struct super_block *sb)
  {
  	int error;
  
  	down_write(&sb->s_umount);
5accdf82b   Jan Kara   fs: Improve files...
1314
  	if (sb->s_writers.frozen == SB_UNFROZEN) {
18e9e5104   Josef Bacik   Introduce freeze_...
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
  		up_write(&sb->s_umount);
  		return -EINVAL;
  	}
  
  	if (sb->s_flags & MS_RDONLY)
  		goto out;
  
  	if (sb->s_op->unfreeze_fs) {
  		error = sb->s_op->unfreeze_fs(sb);
  		if (error) {
  			printk(KERN_ERR
  				"VFS:Filesystem thaw failed
  ");
18e9e5104   Josef Bacik   Introduce freeze_...
1328
1329
1330
1331
1332
1333
  			up_write(&sb->s_umount);
  			return error;
  		}
  	}
  
  out:
5accdf82b   Jan Kara   fs: Improve files...
1334
  	sb->s_writers.frozen = SB_UNFROZEN;
18e9e5104   Josef Bacik   Introduce freeze_...
1335
  	smp_wmb();
5accdf82b   Jan Kara   fs: Improve files...
1336
  	wake_up(&sb->s_writers.wait_unfrozen);
18e9e5104   Josef Bacik   Introduce freeze_...
1337
1338
1339
1340
1341
  	deactivate_locked_super(sb);
  
  	return 0;
  }
  EXPORT_SYMBOL(thaw_super);