Blame view

fs/super.c 34.9 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
  #include <linux/blkdev.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
25
26
  #include <linux/mount.h>
  #include <linux/security.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
27
28
  #include <linux/writeback.h>		/* for the emergency remount stuff */
  #include <linux/idr.h>
353ab6e97   Ingo Molnar   [PATCH] sem2mutex...
29
  #include <linux/mutex.h>
5477d0fac   Jens Axboe   fs: fs/super.c ne...
30
  #include <linux/backing-dev.h>
ceb5bdc2d   Nick Piggin   fs: dcache per-bu...
31
  #include <linux/rculist_bl.h>
c515e1fd3   Dan Magenheimer   mm/fs: add hooks ...
32
  #include <linux/cleancache.h>
404015308   Al Viro   security: trim se...
33
  #include <linux/fsnotify.h>
5accdf82b   Jan Kara   fs: Improve files...
34
  #include <linux/lockdep.h>
6d59e7f58   Al Viro   [PATCH] move a bu...
35
  #include "internal.h"
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
36

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
37
38
  LIST_HEAD(super_blocks);
  DEFINE_SPINLOCK(sb_lock);
5accdf82b   Jan Kara   fs: Improve files...
39
40
41
42
43
  static char *sb_writers_name[SB_FREEZE_LEVELS] = {
  	"sb_writers",
  	"sb_pagefaults",
  	"sb_internal",
  };
b0d40c92a   Dave Chinner   superblock: intro...
44
45
46
47
48
49
50
  /*
   * 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...
51
52
  static unsigned long super_cache_scan(struct shrinker *shrink,
  				      struct shrink_control *sc)
b0d40c92a   Dave Chinner   superblock: intro...
53
54
  {
  	struct super_block *sb;
0a234c6dc   Dave Chinner   shrinker: convert...
55
56
57
58
59
  	long	fs_objects = 0;
  	long	total_objects;
  	long	freed = 0;
  	long	dentries;
  	long	inodes;
b0d40c92a   Dave Chinner   superblock: intro...
60
61
62
63
64
65
66
  
  	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...
67
68
  	if (!(sc->gfp_mask & __GFP_FS))
  		return SHRINK_STOP;
b0d40c92a   Dave Chinner   superblock: intro...
69
70
  
  	if (!grab_super_passive(sb))
0a234c6dc   Dave Chinner   shrinker: convert...
71
  		return SHRINK_STOP;
b0d40c92a   Dave Chinner   superblock: intro...
72

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

9b17c6238   Dave Chinner   fs: convert inode...
76
77
  	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...
78
  	total_objects = dentries + inodes + fs_objects + 1;
475d0db74   Tetsuo Handa   fs: Fix theoretic...
79
80
  	if (!total_objects)
  		total_objects = 1;
0e1fdafd9   Dave Chinner   superblock: add f...
81

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

0a234c6dc   Dave Chinner   shrinker: convert...
86
87
88
89
  	/*
  	 * 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...
90
91
  	freed = prune_dcache_sb(sb, dentries, sc->nid);
  	freed += prune_icache_sb(sb, inodes, sc->nid);
0a234c6dc   Dave Chinner   shrinker: convert...
92
93
94
95
  
  	if (fs_objects) {
  		fs_objects = mult_frac(sc->nr_to_scan, fs_objects,
  								total_objects);
9b17c6238   Dave Chinner   fs: convert inode...
96
97
  		freed += sb->s_op->free_cached_objects(sb, fs_objects,
  						       sc->nid);
b0d40c92a   Dave Chinner   superblock: intro...
98
  	}
0a234c6dc   Dave Chinner   shrinker: convert...
99
100
101
102
103
104
105
106
107
108
109
  	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...
110
111
112
113
114
115
116
117
  	/*
  	 * 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...
118
  	if (sb->s_op && sb->s_op->nr_cached_objects)
9b17c6238   Dave Chinner   fs: convert inode...
119
120
  		total_objects = sb->s_op->nr_cached_objects(sb,
  						 sc->nid);
0a234c6dc   Dave Chinner   shrinker: convert...
121

9b17c6238   Dave Chinner   fs: convert inode...
122
123
124
125
  	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...
126

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

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

7eb5e8826   Al Viro   uninline destroy_...
170
  	for (i = 0; i < SB_FREEZE_LEVELS; i++) {
908c7f194   Tejun Heo   percpu_counter: a...
171
172
  		if (percpu_counter_init(&s->s_writers.counter[i], 0,
  					GFP_KERNEL) < 0)
7eb5e8826   Al Viro   uninline destroy_...
173
174
175
  			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
176
  	}
7eb5e8826   Al Viro   uninline destroy_...
177
178
179
180
181
182
183
184
185
186
187
188
  	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_...
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
  	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);
7eb5e8826   Al Viro   uninline destroy_...
213
214
215
216
217
218
219
220
221
222
  	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
223
  	return s;
5ca302c8e   Glauber Costa   list_lru: dynamic...
224

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

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
277
278
  		put_filesystem(fs);
  		put_super(s);
1712ac8fd   Al Viro   Saner locking aro...
279
280
  	} else {
  		up_write(&s->s_umount);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
281
282
  	}
  }
1712ac8fd   Al Viro   Saner locking aro...
283
  EXPORT_SYMBOL(deactivate_locked_super);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
284
285
  
  /**
1712ac8fd   Al Viro   Saner locking aro...
286
   *	deactivate_super	-	drop an active reference to superblock
74dbbdd7f   Al Viro   New helper: deact...
287
288
   *	@s: superblock to deactivate
   *
1712ac8fd   Al Viro   Saner locking aro...
289
290
291
   *	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...
292
   */
1712ac8fd   Al Viro   Saner locking aro...
293
  void deactivate_super(struct super_block *s)
74dbbdd7f   Al Viro   New helper: deact...
294
  {
1712ac8fd   Al Viro   Saner locking aro...
295
296
297
          if (!atomic_add_unless(&s->s_active, -1, 1)) {
  		down_write(&s->s_umount);
  		deactivate_locked_super(s);
74dbbdd7f   Al Viro   New helper: deact...
298
299
  	}
  }
1712ac8fd   Al Viro   Saner locking aro...
300
  EXPORT_SYMBOL(deactivate_super);
74dbbdd7f   Al Viro   New helper: deact...
301
302
  
  /**
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
303
304
305
306
307
308
309
310
   *	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...
311
312
313
   *	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
314
   */
9c4dbee79   Josh Triplett   [PATCH] fs: add l...
315
  static int grab_super(struct super_block *s) __releases(sb_lock)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
316
317
318
319
  {
  	s->s_count++;
  	spin_unlock(&sb_lock);
  	down_write(&s->s_umount);
acfec9a5a   Al Viro   livelock avoidanc...
320
321
322
323
  	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
324
325
  	up_write(&s->s_umount);
  	put_super(s);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
326
327
  	return 0;
  }
cf9a2ae8d   David Howells   [PATCH] BLOCK: Mo...
328
  /*
12ad3ab66   Dave Chinner   superblock: move ...
329
   *	grab_super_passive - acquire a passive reference
331cbdeed   Wanpeng Li   writeback: Fix so...
330
   *	@sb: reference we are trying to grab
12ad3ab66   Dave Chinner   superblock: move ...
331
332
333
334
335
336
337
338
339
340
341
342
   *
   *	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...
343
  	if (hlist_unhashed(&sb->s_instances)) {
12ad3ab66   Dave Chinner   superblock: move ...
344
345
346
347
348
349
350
351
  		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...
352
  		if (sb->s_root && (sb->s_flags & MS_BORN))
12ad3ab66   Dave Chinner   superblock: move ...
353
354
355
356
357
358
359
  			return true;
  		up_read(&sb->s_umount);
  	}
  
  	put_super(sb);
  	return false;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
360
361
362
363
364
365
366
367
368
  /**
   *	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...
369
370
371
372
   *
   *	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
373
374
375
   */
  void generic_shutdown_super(struct super_block *sb)
  {
ee9b6d61a   Josef 'Jeff' Sipek   [PATCH] Mark stru...
376
  	const struct super_operations *sop = sb->s_op;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
377

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

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

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

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

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
642
  	spin_lock(&sb_lock);
618f06362   Kirill Korotaev   [PATCH] O(1) sb l...
643
644
  rescan:
  	list_for_each_entry(sb, &super_blocks, s_list) {
a5166169f   Al Viro   vfs: convert fs_s...
645
  		if (hlist_unhashed(&sb->s_instances))
551de6f34   Al Viro   Leave superblocks...
646
  			continue;
618f06362   Kirill Korotaev   [PATCH] O(1) sb l...
647
648
  		if (sb->s_dev ==  dev) {
  			sb->s_count++;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
649
  			spin_unlock(&sb_lock);
618f06362   Kirill Korotaev   [PATCH] O(1) sb l...
650
  			down_read(&sb->s_umount);
df40c01a9   Al Viro   In get_super() an...
651
  			/* still alive? */
dabe0dc19   Al Viro   vfs: fix the rest...
652
  			if (sb->s_root && (sb->s_flags & MS_BORN))
618f06362   Kirill Korotaev   [PATCH] O(1) sb l...
653
654
  				return sb;
  			up_read(&sb->s_umount);
df40c01a9   Al Viro   In get_super() an...
655
  			/* nope, got unmounted */
618f06362   Kirill Korotaev   [PATCH] O(1) sb l...
656
  			spin_lock(&sb_lock);
df40c01a9   Al Viro   In get_super() an...
657
658
  			__put_super(sb);
  			goto rescan;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
659
660
661
662
663
  		}
  	}
  	spin_unlock(&sb_lock);
  	return NULL;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
664
  /**
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
665
666
667
668
669
670
671
672
673
674
675
   *	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...
676
  	int remount_ro;
4504230a7   Christoph Hellwig   freeze_bdev: grab...
677

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

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

0aec09d04   Al Viro   drop ->s_umount a...
687
688
689
  	if (remount_ro) {
  		if (sb->s_pins.first) {
  			up_write(&sb->s_umount);
8fa1f1c2b   Al Viro   make fs/{namespac...
690
  			sb_pin_kill(sb);
0aec09d04   Al Viro   drop ->s_umount a...
691
692
693
694
695
696
697
698
699
  			down_write(&sb->s_umount);
  			if (!sb->s_root)
  				return 0;
  			if (sb->s_writers.frozen != SB_UNFROZEN)
  				return -EBUSY;
  			remount_ro = (flags & MS_RDONLY) && !(sb->s_flags & MS_RDONLY);
  		}
  	}
  	shrink_dcache_sb(sb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
700
701
  	/* 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...
702
  	if (remount_ro) {
4ed5e82fe   Miklos Szeredi   vfs: protect remo...
703
  		if (force) {
eee5cc270   Al Viro   get rid of s_file...
704
705
  			sb->s_readonly_remount = 1;
  			smp_wmb();
4ed5e82fe   Miklos Szeredi   vfs: protect remo...
706
707
708
709
  		} else {
  			retval = sb_prepare_remount_readonly(sb);
  			if (retval)
  				return retval;
4ed5e82fe   Miklos Szeredi   vfs: protect remo...
710
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
711
712
713
  	}
  
  	if (sb->s_op->remount_fs) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
714
  		retval = sb->s_op->remount_fs(sb, &flags, data);
2833eb2b4   Miklos Szeredi   vfs: ignore error...
715
716
  		if (retval) {
  			if (!force)
4ed5e82fe   Miklos Szeredi   vfs: protect remo...
717
  				goto cancel_readonly;
2833eb2b4   Miklos Szeredi   vfs: ignore error...
718
719
720
721
722
  			/* 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
723
724
  	}
  	sb->s_flags = (sb->s_flags & ~MS_RMT_MASK) | (flags & MS_RMT_MASK);
4ed5e82fe   Miklos Szeredi   vfs: protect remo...
725
726
727
  	/* Needs to be ordered wrt mnt_is_readonly() */
  	smp_wmb();
  	sb->s_readonly_remount = 0;
c79d967de   Christoph Hellwig   quota: move remou...
728

d208bbdda   Nick Piggin   fs: improve remou...
729
730
731
732
733
734
735
736
737
738
  	/*
  	 * 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
739
  	return 0;
4ed5e82fe   Miklos Szeredi   vfs: protect remo...
740
741
742
743
  
  cancel_readonly:
  	sb->s_readonly_remount = 0;
  	return retval;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
744
  }
a2a9537ac   Jens Axboe   Get rid of pdflus...
745
  static void do_emergency_remount(struct work_struct *work)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
746
  {
dca332528   Al Viro   no need for list_...
747
  	struct super_block *sb, *p = NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
748
749
  
  	spin_lock(&sb_lock);
dca332528   Al Viro   no need for list_...
750
  	list_for_each_entry(sb, &super_blocks, s_list) {
a5166169f   Al Viro   vfs: convert fs_s...
751
  		if (hlist_unhashed(&sb->s_instances))
551de6f34   Al Viro   Leave superblocks...
752
  			continue;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
753
754
  		sb->s_count++;
  		spin_unlock(&sb_lock);
443b94baa   Al Viro   Make sure that al...
755
  		down_write(&sb->s_umount);
dabe0dc19   Al Viro   vfs: fix the rest...
756
757
  		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
758
  			/*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
759
760
  			 * What lock protects sb->s_flags??
  			 */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
761
  			do_remount_sb(sb, MS_RDONLY, NULL, 1);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
762
  		}
443b94baa   Al Viro   Make sure that al...
763
  		up_write(&sb->s_umount);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
764
  		spin_lock(&sb_lock);
dca332528   Al Viro   no need for list_...
765
766
767
  		if (p)
  			__put_super(p);
  		p = sb;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
768
  	}
dca332528   Al Viro   no need for list_...
769
770
  	if (p)
  		__put_super(p);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
771
  	spin_unlock(&sb_lock);
a2a9537ac   Jens Axboe   Get rid of pdflus...
772
  	kfree(work);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
773
774
775
776
777
778
  	printk("Emergency Remount complete
  ");
  }
  
  void emergency_remount(void)
  {
a2a9537ac   Jens Axboe   Get rid of pdflus...
779
780
781
782
783
784
785
  	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
786
787
788
789
790
791
  }
  
  /*
   * 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...
792
  static DEFINE_IDA(unnamed_dev_ida);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
793
  static DEFINE_SPINLOCK(unnamed_dev_lock);/* protects the above */
a2a4dc494   Thomas Bächler   fs: Don't return ...
794
795
796
797
  /* 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
798

0ee5dc676   Al Viro   btrfs: kill magic...
799
  int get_anon_bdev(dev_t *p)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
800
801
802
803
804
  {
  	int dev;
  	int error;
  
   retry:
ad76cbc63   Alexey Dobriyan   [PATCH 2/2] anond...
805
  	if (ida_pre_get(&unnamed_dev_ida, GFP_ATOMIC) == 0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
806
807
  		return -ENOMEM;
  	spin_lock(&unnamed_dev_lock);
c63e09ecc   Al Viro   Make allocation o...
808
  	error = ida_get_new_above(&unnamed_dev_ida, unnamed_dev_start, &dev);
f21f62208   Al Viro   ... and the same ...
809
810
  	if (!error)
  		unnamed_dev_start = dev + 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
811
812
813
814
815
816
  	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...
817
  	if (dev == (1 << MINORBITS)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
818
  		spin_lock(&unnamed_dev_lock);
ad76cbc63   Alexey Dobriyan   [PATCH 2/2] anond...
819
  		ida_remove(&unnamed_dev_ida, dev);
f21f62208   Al Viro   ... and the same ...
820
821
  		if (unnamed_dev_start > dev)
  			unnamed_dev_start = dev;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
822
823
824
  		spin_unlock(&unnamed_dev_lock);
  		return -EMFILE;
  	}
0ee5dc676   Al Viro   btrfs: kill magic...
825
  	*p = MKDEV(0, dev & MINORMASK);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
826
827
  	return 0;
  }
0ee5dc676   Al Viro   btrfs: kill magic...
828
  EXPORT_SYMBOL(get_anon_bdev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
829

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

9361401eb   David Howells   [PATCH] BLOCK: Ma...
899
  #ifdef CONFIG_BLOCK
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
900
901
902
903
  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...
904
905
906
907
908
909
  
  	/*
  	 * 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
910
911
912
913
914
915
916
  	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...
917
  struct dentry *mount_bdev(struct file_system_type *fs_type,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
918
  	int flags, const char *dev_name, void *data,
152a08366   Al Viro   new helper: mount...
919
  	int (*fill_super)(struct super_block *, void *, int))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
920
921
922
  {
  	struct block_device *bdev;
  	struct super_block *s;
d4d776299   Tejun Heo   block: clean up b...
923
  	fmode_t mode = FMODE_READ | FMODE_EXCL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
924
  	int error = 0;
30c40d2c0   Al Viro   [PATCH] propagate...
925
926
  	if (!(flags & MS_RDONLY))
  		mode |= FMODE_WRITE;
d4d776299   Tejun Heo   block: clean up b...
927
  	bdev = blkdev_get_by_path(dev_name, mode, fs_type);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
928
  	if (IS_ERR(bdev))
152a08366   Al Viro   new helper: mount...
929
  		return ERR_CAST(bdev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
930
931
932
933
934
935
  
  	/*
  	 * 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...
936
937
938
939
940
941
  	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...
942
943
  	s = sget(fs_type, test_bdev_super, set_bdev_super, flags | MS_NOSEC,
  		 bdev);
4fadd7bb2   Christoph Hellwig   freeze_bdev: kill...
944
  	mutex_unlock(&bdev->bd_fsfreeze_mutex);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
945
  	if (IS_ERR(s))
454e2398b   David Howells   [PATCH] VFS: Perm...
946
  		goto error_s;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
947
948
949
  
  	if (s->s_root) {
  		if ((flags ^ s->s_flags) & MS_RDONLY) {
74dbbdd7f   Al Viro   New helper: deact...
950
  			deactivate_locked_super(s);
454e2398b   David Howells   [PATCH] VFS: Perm...
951
952
  			error = -EBUSY;
  			goto error_bdev;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
953
  		}
454e2398b   David Howells   [PATCH] VFS: Perm...
954

4f331f01b   Tejun Heo   vfs: don't hold s...
955
956
  		/*
  		 * s_umount nests inside bd_mutex during
e525fd89d   Tejun Heo   block: make blkde...
957
958
959
960
  		 * __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...
961
962
  		 */
  		up_write(&s->s_umount);
d4d776299   Tejun Heo   block: clean up b...
963
  		blkdev_put(bdev, mode);
4f331f01b   Tejun Heo   vfs: don't hold s...
964
  		down_write(&s->s_umount);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
965
966
  	} else {
  		char b[BDEVNAME_SIZE];
30c40d2c0   Al Viro   [PATCH] propagate...
967
  		s->s_mode = mode;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
968
  		strlcpy(s->s_id, bdevname(bdev, b), sizeof(s->s_id));
e78c9a004   Pekka Enberg   [PATCH] fs: remov...
969
  		sb_set_blocksize(s, block_size(bdev));
9b04c997b   Theodore Ts'o   [PATCH] vfs: MS_V...
970
  		error = fill_super(s, data, flags & MS_SILENT ? 1 : 0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
971
  		if (error) {
74dbbdd7f   Al Viro   New helper: deact...
972
  			deactivate_locked_super(s);
454e2398b   David Howells   [PATCH] VFS: Perm...
973
  			goto error;
fa675765a   Greg Kroah-Hartman   Revert mount/umou...
974
  		}
454e2398b   David Howells   [PATCH] VFS: Perm...
975
976
  
  		s->s_flags |= MS_ACTIVE;
87d8fe1ee   Theodore Ts'o   add releasepage h...
977
  		bdev->bd_super = s;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
978
  	}
152a08366   Al Viro   new helper: mount...
979
  	return dget(s->s_root);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
980

454e2398b   David Howells   [PATCH] VFS: Perm...
981
982
983
  error_s:
  	error = PTR_ERR(s);
  error_bdev:
d4d776299   Tejun Heo   block: clean up b...
984
  	blkdev_put(bdev, mode);
454e2398b   David Howells   [PATCH] VFS: Perm...
985
  error:
152a08366   Al Viro   new helper: mount...
986
987
988
  	return ERR_PTR(error);
  }
  EXPORT_SYMBOL(mount_bdev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
989
990
991
  void kill_block_super(struct super_block *sb)
  {
  	struct block_device *bdev = sb->s_bdev;
30c40d2c0   Al Viro   [PATCH] propagate...
992
  	fmode_t mode = sb->s_mode;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
993

ddbaaf302   H Hartley Sweeten   NULL noise in fs/...
994
  	bdev->bd_super = NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
995
996
  	generic_shutdown_super(sb);
  	sync_blockdev(bdev);
d4d776299   Tejun Heo   block: clean up b...
997
  	WARN_ON_ONCE(!(mode & FMODE_EXCL));
e525fd89d   Tejun Heo   block: make blkde...
998
  	blkdev_put(bdev, mode | FMODE_EXCL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
999
1000
1001
  }
  
  EXPORT_SYMBOL(kill_block_super);
9361401eb   David Howells   [PATCH] BLOCK: Ma...
1002
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1003

3c26ff6e4   Al Viro   convert get_sb_no...
1004
  struct dentry *mount_nodev(struct file_system_type *fs_type,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1005
  	int flags, void *data,
3c26ff6e4   Al Viro   convert get_sb_no...
1006
  	int (*fill_super)(struct super_block *, void *, int))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1007
1008
  {
  	int error;
9249e17fe   David Howells   VFS: Pass mount f...
1009
  	struct super_block *s = sget(fs_type, NULL, set_anon_super, flags, NULL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1010
1011
  
  	if (IS_ERR(s))
3c26ff6e4   Al Viro   convert get_sb_no...
1012
  		return ERR_CAST(s);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1013

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

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

e00075298   Eric Paris   LSM/SELinux: Inte...
1062
  		error = security_sb_copy_data(data, secdata);
454e2398b   David Howells   [PATCH] VFS: Perm...
1063
  		if (error)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1064
  			goto out_free_secdata;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1065
  	}
1a102ff92   Al Viro   vfs: bury ->get_sb()
1066
1067
1068
1069
  	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...
1070
  	}
9d412a43c   Al Viro   vfs: split off vf...
1071
1072
1073
  	sb = root->d_sb;
  	BUG_ON(!sb);
  	WARN_ON(!sb->s_bdi);
6c5103890   Linus Torvalds   Merge branch 'for...
1074
  	WARN_ON(sb->s_bdi == &default_backing_dev_info);
9d412a43c   Al Viro   vfs: split off vf...
1075
  	sb->s_flags |= MS_BORN;
454e2398b   David Howells   [PATCH] VFS: Perm...
1076

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

42cb56ae2   Jeff Layton   vfs: change sb->s...
1081
1082
1083
1084
  	/*
  	 * 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...
1085
  	 * violate this rule.
42cb56ae2   Jeff Layton   vfs: change sb->s...
1086
  	 */
9d412a43c   Al Viro   vfs: split off vf...
1087
1088
1089
  	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...
1090

9d412a43c   Al Viro   vfs: split off vf...
1091
  	up_write(&sb->s_umount);
8680e22f2   Gerald Schaefer   [PATCH] VFS: memo...
1092
  	free_secdata(secdata);
9d412a43c   Al Viro   vfs: split off vf...
1093
  	return root;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1094
  out_sb:
9d412a43c   Al Viro   vfs: split off vf...
1095
1096
  	dput(root);
  	deactivate_locked_super(sb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1097
1098
  out_free_secdata:
  	free_secdata(secdata);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1099
  out:
454e2398b   David Howells   [PATCH] VFS: Perm...
1100
  	return ERR_PTR(error);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1101
  }
5accdf82b   Jan Kara   fs: Improve files...
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
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
  /*
   * 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_...
1215
  /**
7000d3c42   Randy Dunlap   fs/super: fix ker...
1216
1217
   * freeze_super - lock the filesystem and force it into a consistent state
   * @sb: the super to lock
18e9e5104   Josef Bacik   Introduce freeze_...
1218
1219
1220
1221
   *
   * 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...
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
   *
   * 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_...
1247
1248
1249
1250
1251
1252
1253
   */
  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...
1254
  	if (sb->s_writers.frozen != SB_UNFROZEN) {
18e9e5104   Josef Bacik   Introduce freeze_...
1255
1256
1257
  		deactivate_locked_super(sb);
  		return -EBUSY;
  	}
dabe0dc19   Al Viro   vfs: fix the rest...
1258
1259
1260
1261
  	if (!(sb->s_flags & MS_BORN)) {
  		up_write(&sb->s_umount);
  		return 0;	/* sic - it's "nothing to do" */
  	}
18e9e5104   Josef Bacik   Introduce freeze_...
1262
  	if (sb->s_flags & MS_RDONLY) {
5accdf82b   Jan Kara   fs: Improve files...
1263
1264
  		/* Nothing to do really... */
  		sb->s_writers.frozen = SB_FREEZE_COMPLETE;
18e9e5104   Josef Bacik   Introduce freeze_...
1265
1266
1267
  		up_write(&sb->s_umount);
  		return 0;
  	}
5accdf82b   Jan Kara   fs: Improve files...
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
  	/* 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_...
1280
  	smp_wmb();
5accdf82b   Jan Kara   fs: Improve files...
1281
1282
1283
  	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_...
1284
  	sync_filesystem(sb);
5accdf82b   Jan Kara   fs: Improve files...
1285
1286
  	/* Now wait for internal filesystem counter */
  	sb->s_writers.frozen = SB_FREEZE_FS;
18e9e5104   Josef Bacik   Introduce freeze_...
1287
  	smp_wmb();
5accdf82b   Jan Kara   fs: Improve files...
1288
  	sb_wait_write(sb, SB_FREEZE_FS);
18e9e5104   Josef Bacik   Introduce freeze_...
1289

18e9e5104   Josef Bacik   Introduce freeze_...
1290
1291
1292
1293
1294
1295
  	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...
1296
  			sb->s_writers.frozen = SB_UNFROZEN;
e1616300a   Kazuya Mio   wake up s_wait_un...
1297
  			smp_wmb();
5accdf82b   Jan Kara   fs: Improve files...
1298
  			wake_up(&sb->s_writers.wait_unfrozen);
18e9e5104   Josef Bacik   Introduce freeze_...
1299
1300
1301
1302
  			deactivate_locked_super(sb);
  			return ret;
  		}
  	}
5accdf82b   Jan Kara   fs: Improve files...
1303
1304
1305
1306
1307
  	/*
  	 * 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_...
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
  	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...
1324
  	if (sb->s_writers.frozen == SB_UNFROZEN) {
18e9e5104   Josef Bacik   Introduce freeze_...
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
  		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_...
1338
1339
1340
1341
1342
1343
  			up_write(&sb->s_umount);
  			return error;
  		}
  	}
  
  out:
5accdf82b   Jan Kara   fs: Improve files...
1344
  	sb->s_writers.frozen = SB_UNFROZEN;
18e9e5104   Josef Bacik   Introduce freeze_...
1345
  	smp_wmb();
5accdf82b   Jan Kara   fs: Improve files...
1346
  	wake_up(&sb->s_writers.wait_unfrozen);
18e9e5104   Josef Bacik   Introduce freeze_...
1347
1348
1349
1350
1351
  	deactivate_locked_super(sb);
  
  	return 0;
  }
  EXPORT_SYMBOL(thaw_super);