Blame view

fs/super.c 28.3 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
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
22
23
  #include <linux/module.h>
  #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>
6d59e7f58   Al Viro   [PATCH] move a bu...
34
  #include "internal.h"
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
35

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
36
37
  LIST_HEAD(super_blocks);
  DEFINE_SPINLOCK(sb_lock);
b0d40c92a   Dave Chinner   superblock: intro...
38
39
40
41
42
43
44
45
46
47
  /*
   * 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.
   */
  static int prune_super(struct shrinker *shrink, struct shrink_control *sc)
  {
  	struct super_block *sb;
0e1fdafd9   Dave Chinner   superblock: add f...
48
49
  	int	fs_objects = 0;
  	int	total_objects;
b0d40c92a   Dave Chinner   superblock: intro...
50
51
52
53
54
55
56
57
58
59
60
61
  
  	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..
  	 */
  	if (sc->nr_to_scan && !(sc->gfp_mask & __GFP_FS))
  		return -1;
  
  	if (!grab_super_passive(sb))
  		return -1;
0e1fdafd9   Dave Chinner   superblock: add f...
62
63
64
65
66
  	if (sb->s_op && sb->s_op->nr_cached_objects)
  		fs_objects = sb->s_op->nr_cached_objects(sb);
  
  	total_objects = sb->s_nr_dentry_unused +
  			sb->s_nr_inodes_unused + fs_objects + 1;
b0d40c92a   Dave Chinner   superblock: intro...
67
  	if (sc->nr_to_scan) {
0e1fdafd9   Dave Chinner   superblock: add f...
68
69
  		int	dentries;
  		int	inodes;
b0d40c92a   Dave Chinner   superblock: intro...
70

0e1fdafd9   Dave Chinner   superblock: add f...
71
72
73
74
75
76
77
78
79
80
81
82
83
84
  		/* proportion the scan between the caches */
  		dentries = (sc->nr_to_scan * sb->s_nr_dentry_unused) /
  							total_objects;
  		inodes = (sc->nr_to_scan * sb->s_nr_inodes_unused) /
  							total_objects;
  		if (fs_objects)
  			fs_objects = (sc->nr_to_scan * fs_objects) /
  							total_objects;
  		/*
  		 * prune the dcache first as the icache is pinned by it, then
  		 * prune the icache, followed by the filesystem specific caches
  		 */
  		prune_dcache_sb(sb, dentries);
  		prune_icache_sb(sb, inodes);
b0d40c92a   Dave Chinner   superblock: intro...
85

0e1fdafd9   Dave Chinner   superblock: add f...
86
87
88
89
90
91
  		if (fs_objects && sb->s_op->free_cached_objects) {
  			sb->s_op->free_cached_objects(sb, fs_objects);
  			fs_objects = sb->s_op->nr_cached_objects(sb);
  		}
  		total_objects = sb->s_nr_dentry_unused +
  				sb->s_nr_inodes_unused + fs_objects;
b0d40c92a   Dave Chinner   superblock: intro...
92
  	}
0e1fdafd9   Dave Chinner   superblock: add f...
93
  	total_objects = (total_objects / 100) * sysctl_vfs_cache_pressure;
b0d40c92a   Dave Chinner   superblock: intro...
94
  	drop_super(sb);
0e1fdafd9   Dave Chinner   superblock: add f...
95
  	return total_objects;
b0d40c92a   Dave Chinner   superblock: intro...
96
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
97
98
  /**
   *	alloc_super	-	create new superblock
fe2bbc483   Henrik Kretzschmar   [PATCH] add missi...
99
   *	@type:	filesystem type superblock should belong to
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
100
101
102
103
   *
   *	Allocates and initializes a new &struct super_block.  alloc_super()
   *	returns a pointer new superblock or %NULL if allocation had failed.
   */
cf5162499   Ingo Molnar   [PATCH] lockdep: ...
104
  static struct super_block *alloc_super(struct file_system_type *type)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
105
  {
11b0b5abb   Oliver Neukum   [PATCH] use kzall...
106
  	struct super_block *s = kzalloc(sizeof(struct super_block),  GFP_USER);
b87221de6   Alexey Dobriyan   const: mark remai...
107
  	static const struct super_operations default_op;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
108
109
  
  	if (s) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
110
111
112
113
114
  		if (security_sb_alloc(s)) {
  			kfree(s);
  			s = NULL;
  			goto out;
  		}
6416ccb78   Nick Piggin   fs: scale files_lock
115
116
117
118
119
120
121
122
123
124
125
126
127
128
  #ifdef CONFIG_SMP
  		s->s_files = alloc_percpu(struct list_head);
  		if (!s->s_files) {
  			security_sb_free(s);
  			kfree(s);
  			s = NULL;
  			goto out;
  		} else {
  			int i;
  
  			for_each_possible_cpu(i)
  				INIT_LIST_HEAD(per_cpu_ptr(s->s_files, i));
  		}
  #else
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
129
  		INIT_LIST_HEAD(&s->s_files);
6416ccb78   Nick Piggin   fs: scale files_lock
130
  #endif
95f28604a   Jens Axboe   fs: assign sb->s_...
131
  		s->s_bdi = &default_backing_dev_info;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
132
  		INIT_LIST_HEAD(&s->s_instances);
ceb5bdc2d   Nick Piggin   fs: dcache per-bu...
133
  		INIT_HLIST_BL_HEAD(&s->s_anon);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
134
  		INIT_LIST_HEAD(&s->s_inodes);
da3bbdd46   Kentaro Makita   fix soft lock up ...
135
  		INIT_LIST_HEAD(&s->s_dentry_lru);
98b745c64   Dave Chinner   inode: Make unuse...
136
  		INIT_LIST_HEAD(&s->s_inode_lru);
09cc9fc7a   Dave Chinner   inode: move to pe...
137
  		spin_lock_init(&s->s_inode_lru_lock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
138
  		init_rwsem(&s->s_umount);
7892f2f48   Ingo Molnar   [PATCH] mutex sub...
139
  		mutex_init(&s->s_lock);
897c6ff95   Arjan van de Ven   [PATCH] lockdep: ...
140
  		lockdep_set_class(&s->s_umount, &type->s_umount_key);
cf5162499   Ingo Molnar   [PATCH] lockdep: ...
141
142
143
144
145
146
  		/*
  		 * The locking rules for s_lock are up to the
  		 * filesystem. For example ext3fs has different
  		 * lock ordering than usbfs:
  		 */
  		lockdep_set_class(&s->s_lock, &type->s_lock_key);
ada723dcd   Peter Zijlstra   fs/super.c: add l...
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
  		/*
  		 * 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);
b20bd1a5e   Al Viro   get rid of S_BIAS
163
  		s->s_count = 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
164
  		atomic_set(&s->s_active, 1);
a11f3a057   Arjan van de Ven   [PATCH] sem2mutex...
165
  		mutex_init(&s->s_vfs_rename_mutex);
51ee049e7   Roland Dreier   vfs: add lockdep ...
166
  		lockdep_set_class(&s->s_vfs_rename_mutex, &type->s_vfs_rename_key);
d3be915fc   Ingo Molnar   [PATCH] sem2mutex...
167
168
  		mutex_init(&s->s_dquot.dqio_mutex);
  		mutex_init(&s->s_dquot.dqonoff_mutex);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
169
170
171
  		init_rwsem(&s->s_dquot.dqptr_sem);
  		init_waitqueue_head(&s->s_wait_unfrozen);
  		s->s_maxbytes = MAX_NON_LFS;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
172
173
  		s->s_op = &default_op;
  		s->s_time_gran = 1000000000;
c515e1fd3   Dan Magenheimer   mm/fs: add hooks ...
174
  		s->cleancache_poolid = -1;
b0d40c92a   Dave Chinner   superblock: intro...
175
176
177
  
  		s->s_shrink.seeks = DEFAULT_SEEKS;
  		s->s_shrink.shrink = prune_super;
8ab47664d   Dave Chinner   vfs: increase shr...
178
  		s->s_shrink.batch = 1024;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
179
180
181
182
183
184
185
186
187
188
189
190
191
  	}
  out:
  	return s;
  }
  
  /**
   *	destroy_super	-	frees a superblock
   *	@s: superblock to free
   *
   *	Frees a superblock.
   */
  static inline void destroy_super(struct super_block *s)
  {
6416ccb78   Nick Piggin   fs: scale files_lock
192
193
194
  #ifdef CONFIG_SMP
  	free_percpu(s->s_files);
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
195
  	security_sb_free(s);
79c0b2df7   Miklos Szeredi   add filesystem su...
196
  	kfree(s->s_subtype);
b3b304a23   Miklos Szeredi   mount options: ad...
197
  	kfree(s->s_options);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
198
199
200
201
202
203
  	kfree(s);
  }
  
  /* Superblock refcounting  */
  
  /*
35cf7ba0b   Al Viro   Bury __put_super_...
204
   * Drop a superblock's refcount.  The caller must hold sb_lock.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
205
   */
35cf7ba0b   Al Viro   Bury __put_super_...
206
  void __put_super(struct super_block *sb)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
207
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
208
  	if (!--sb->s_count) {
551de6f34   Al Viro   Leave superblocks...
209
  		list_del_init(&sb->s_list);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
210
  		destroy_super(sb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
211
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
212
213
214
215
216
217
218
219
220
  }
  
  /**
   *	put_super	-	drop a temporary reference to superblock
   *	@sb: superblock in question
   *
   *	Drops a temporary reference, frees superblock if there's no
   *	references left.
   */
03ba3782e   Jens Axboe   writeback: switch...
221
  void put_super(struct super_block *sb)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
222
223
224
225
226
227
228
229
  {
  	spin_lock(&sb_lock);
  	__put_super(sb);
  	spin_unlock(&sb_lock);
  }
  
  
  /**
1712ac8fd   Al Viro   Saner locking aro...
230
   *	deactivate_locked_super	-	drop an active reference to superblock
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
231
232
   *	@s: superblock to deactivate
   *
1712ac8fd   Al Viro   Saner locking aro...
233
234
   *	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
235
236
   *	tell fs driver to shut it down and drop the temporary reference we
   *	had just acquired.
1712ac8fd   Al Viro   Saner locking aro...
237
238
   *
   *	Caller holds exclusive lock on superblock; that lock is released.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
239
   */
1712ac8fd   Al Viro   Saner locking aro...
240
  void deactivate_locked_super(struct super_block *s)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
241
242
  {
  	struct file_system_type *fs = s->s_type;
b20bd1a5e   Al Viro   get rid of S_BIAS
243
  	if (atomic_dec_and_test(&s->s_active)) {
c515e1fd3   Dan Magenheimer   mm/fs: add hooks ...
244
  		cleancache_flush_fs(s);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
245
  		fs->kill_sb(s);
b0d40c92a   Dave Chinner   superblock: intro...
246
247
248
  
  		/* caches are now gone, we can safely kill the shrinker now */
  		unregister_shrinker(&s->s_shrink);
d863b50ab   Boaz Harrosh   vfs: call rcu_bar...
249
250
251
252
253
  		/*
  		 * We need to call rcu_barrier so all the delayed rcu free
  		 * inodes are flushed before we release the fs module.
  		 */
  		rcu_barrier();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
254
255
  		put_filesystem(fs);
  		put_super(s);
1712ac8fd   Al Viro   Saner locking aro...
256
257
  	} else {
  		up_write(&s->s_umount);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
258
259
  	}
  }
1712ac8fd   Al Viro   Saner locking aro...
260
  EXPORT_SYMBOL(deactivate_locked_super);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
261
262
  
  /**
1712ac8fd   Al Viro   Saner locking aro...
263
   *	deactivate_super	-	drop an active reference to superblock
74dbbdd7f   Al Viro   New helper: deact...
264
265
   *	@s: superblock to deactivate
   *
1712ac8fd   Al Viro   Saner locking aro...
266
267
268
   *	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...
269
   */
1712ac8fd   Al Viro   Saner locking aro...
270
  void deactivate_super(struct super_block *s)
74dbbdd7f   Al Viro   New helper: deact...
271
  {
1712ac8fd   Al Viro   Saner locking aro...
272
273
274
          if (!atomic_add_unless(&s->s_active, -1, 1)) {
  		down_write(&s->s_umount);
  		deactivate_locked_super(s);
74dbbdd7f   Al Viro   New helper: deact...
275
276
  	}
  }
1712ac8fd   Al Viro   Saner locking aro...
277
  EXPORT_SYMBOL(deactivate_super);
74dbbdd7f   Al Viro   New helper: deact...
278
279
  
  /**
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
280
281
282
283
284
285
286
287
288
289
   *	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
   *	dying when grab_super() had been called).
   */
9c4dbee79   Josh Triplett   [PATCH] fs: add l...
290
  static int grab_super(struct super_block *s) __releases(sb_lock)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
291
  {
b20bd1a5e   Al Viro   get rid of S_BIAS
292
293
  	if (atomic_inc_not_zero(&s->s_active)) {
  		spin_unlock(&sb_lock);
b20bd1a5e   Al Viro   get rid of S_BIAS
294
295
296
  		return 1;
  	}
  	/* it's going away */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
297
298
  	s->s_count++;
  	spin_unlock(&sb_lock);
1712ac8fd   Al Viro   Saner locking aro...
299
  	/* wait for it to die */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
300
  	down_write(&s->s_umount);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
301
302
  	up_write(&s->s_umount);
  	put_super(s);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
303
304
  	return 0;
  }
cf9a2ae8d   David Howells   [PATCH] BLOCK: Mo...
305
  /*
12ad3ab66   Dave Chinner   superblock: move ...
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
   *	grab_super_passive - acquire a passive reference
   *	@s: reference we are trying to grab
   *
   *	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);
  	if (list_empty(&sb->s_instances)) {
  		spin_unlock(&sb_lock);
  		return false;
  	}
  
  	sb->s_count++;
  	spin_unlock(&sb_lock);
  
  	if (down_read_trylock(&sb->s_umount)) {
  		if (sb->s_root)
  			return true;
  		up_read(&sb->s_umount);
  	}
  
  	put_super(sb);
  	return false;
  }
  
  /*
914e26379   Al Viro   [PATCH] severing ...
339
340
341
342
   * Superblock locking.  We really ought to get rid of these two.
   */
  void lock_super(struct super_block * sb)
  {
914e26379   Al Viro   [PATCH] severing ...
343
344
345
346
347
  	mutex_lock(&sb->s_lock);
  }
  
  void unlock_super(struct super_block * sb)
  {
914e26379   Al Viro   [PATCH] severing ...
348
349
350
351
352
  	mutex_unlock(&sb->s_lock);
  }
  
  EXPORT_SYMBOL(lock_super);
  EXPORT_SYMBOL(unlock_super);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
353
354
355
356
357
358
359
360
361
  /**
   *	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...
362
363
364
365
   *
   *	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
366
367
368
   */
  void generic_shutdown_super(struct super_block *sb)
  {
ee9b6d61a   Josef 'Jeff' Sipek   [PATCH] Mark stru...
369
  	const struct super_operations *sop = sb->s_op;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
370

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

63997e98a   Al Viro   split invalidate_...
376
377
378
  		fsnotify_unmount_inodes(&sb->s_inodes);
  
  		evict_inodes(sb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
379

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
380
381
  		if (sop->put_super)
  			sop->put_super(sb);
63997e98a   Al Viro   split invalidate_...
382
  		if (!list_empty(&sb->s_inodes)) {
7b4fe29e0   Dave Jones   [PATCH] More info...
383
384
385
386
  			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
387
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
388
389
390
  	}
  	spin_lock(&sb_lock);
  	/* should be initialized for __put_super_and_need_restart() */
551de6f34   Al Viro   Leave superblocks...
391
  	list_del_init(&sb->s_instances);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
  	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
   *	@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 *),
  			void *data)
  {
  	struct super_block *s = NULL;
d47301271   Matthias Kaehlcke   fs/super.c: use l...
411
  	struct super_block *old;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
412
413
414
415
  	int err;
  
  retry:
  	spin_lock(&sb_lock);
d47301271   Matthias Kaehlcke   fs/super.c: use l...
416
417
418
419
420
421
  	if (test) {
  		list_for_each_entry(old, &type->fs_supers, s_instances) {
  			if (!test(old, data))
  				continue;
  			if (!grab_super(old))
  				goto retry;
a3cfbb53b   Li Zefan   vfs: add missing ...
422
423
  			if (s) {
  				up_write(&s->s_umount);
d47301271   Matthias Kaehlcke   fs/super.c: use l...
424
  				destroy_super(s);
7a4dec538   Al Viro   Fix sget() race w...
425
  				s = NULL;
a3cfbb53b   Li Zefan   vfs: add missing ...
426
  			}
d3f214730   Al Viro   Move grabbing s_u...
427
  			down_write(&old->s_umount);
7a4dec538   Al Viro   Fix sget() race w...
428
429
430
431
  			if (unlikely(!(old->s_flags & MS_BORN))) {
  				deactivate_locked_super(old);
  				goto retry;
  			}
d47301271   Matthias Kaehlcke   fs/super.c: use l...
432
433
  			return old;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
434
435
436
  	}
  	if (!s) {
  		spin_unlock(&sb_lock);
cf5162499   Ingo Molnar   [PATCH] lockdep: ...
437
  		s = alloc_super(type);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
438
439
440
441
442
443
444
445
  		if (!s)
  			return ERR_PTR(-ENOMEM);
  		goto retry;
  	}
  		
  	err = set(s, data);
  	if (err) {
  		spin_unlock(&sb_lock);
a3cfbb53b   Li Zefan   vfs: add missing ...
446
  		up_write(&s->s_umount);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
447
448
449
450
451
452
453
454
455
  		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);
  	list_add(&s->s_instances, &type->fs_supers);
  	spin_unlock(&sb_lock);
  	get_filesystem(type);
b0d40c92a   Dave Chinner   superblock: intro...
456
  	register_shrinker(&s->s_shrink);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
457
458
459
460
461
462
463
464
465
466
467
468
  	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
469
470
471
472
473
474
475
476
  /**
   * sync_supers - helper for periodic superblock writeback
   *
   * Call the write_super method if present on all dirty superblocks in
   * the system.  This is for the periodic writeback used by most older
   * filesystems.  For data integrity superblock writeback use
   * sync_filesystems() instead.
   *
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
477
478
479
480
481
482
   * Note: check the dirty flag before waiting, so we don't
   * hold up the sync while mounting a device. (The newly
   * mounted device won't need syncing.)
   */
  void sync_supers(void)
  {
dca332528   Al Viro   no need for list_...
483
  	struct super_block *sb, *p = NULL;
618f06362   Kirill Korotaev   [PATCH] O(1) sb l...
484

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
485
  	spin_lock(&sb_lock);
dca332528   Al Viro   no need for list_...
486
  	list_for_each_entry(sb, &super_blocks, s_list) {
551de6f34   Al Viro   Leave superblocks...
487
488
  		if (list_empty(&sb->s_instances))
  			continue;
e50047533   Christoph Hellwig   cleanup sync_supers
489
  		if (sb->s_op->write_super && sb->s_dirt) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
490
491
  			sb->s_count++;
  			spin_unlock(&sb_lock);
e50047533   Christoph Hellwig   cleanup sync_supers
492

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
493
  			down_read(&sb->s_umount);
e50047533   Christoph Hellwig   cleanup sync_supers
494
495
  			if (sb->s_root && sb->s_dirt)
  				sb->s_op->write_super(sb);
618f06362   Kirill Korotaev   [PATCH] O(1) sb l...
496
  			up_read(&sb->s_umount);
e50047533   Christoph Hellwig   cleanup sync_supers
497

618f06362   Kirill Korotaev   [PATCH] O(1) sb l...
498
  			spin_lock(&sb_lock);
dca332528   Al Viro   no need for list_...
499
500
501
  			if (p)
  				__put_super(p);
  			p = sb;
618f06362   Kirill Korotaev   [PATCH] O(1) sb l...
502
503
  		}
  	}
dca332528   Al Viro   no need for list_...
504
505
  	if (p)
  		__put_super(p);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
506
507
  	spin_unlock(&sb_lock);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
508
  /**
01a05b337   Al Viro   new helper: itera...
509
510
511
512
513
514
515
516
517
   *	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_...
518
  	struct super_block *sb, *p = NULL;
01a05b337   Al Viro   new helper: itera...
519
520
  
  	spin_lock(&sb_lock);
dca332528   Al Viro   no need for list_...
521
  	list_for_each_entry(sb, &super_blocks, s_list) {
01a05b337   Al Viro   new helper: itera...
522
523
524
525
526
527
528
529
530
531
532
  		if (list_empty(&sb->s_instances))
  			continue;
  		sb->s_count++;
  		spin_unlock(&sb_lock);
  
  		down_read(&sb->s_umount);
  		if (sb->s_root)
  			f(sb, arg);
  		up_read(&sb->s_umount);
  
  		spin_lock(&sb_lock);
dca332528   Al Viro   no need for list_...
533
534
535
  		if (p)
  			__put_super(p);
  		p = sb;
01a05b337   Al Viro   new helper: itera...
536
  	}
dca332528   Al Viro   no need for list_...
537
538
  	if (p)
  		__put_super(p);
01a05b337   Al Viro   new helper: itera...
539
540
541
542
  	spin_unlock(&sb_lock);
  }
  
  /**
43e15cdbe   Al Viro   new helper: itera...
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
   *	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);
  	list_for_each_entry(sb, &type->fs_supers, s_instances) {
  		sb->s_count++;
  		spin_unlock(&sb_lock);
  
  		down_read(&sb->s_umount);
  		if (sb->s_root)
  			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
579
580
581
582
583
584
   *	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...
585
  struct super_block *get_super(struct block_device *bdev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
586
  {
618f06362   Kirill Korotaev   [PATCH] O(1) sb l...
587
  	struct super_block *sb;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
588
589
  	if (!bdev)
  		return NULL;
618f06362   Kirill Korotaev   [PATCH] O(1) sb l...
590

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
591
  	spin_lock(&sb_lock);
618f06362   Kirill Korotaev   [PATCH] O(1) sb l...
592
593
  rescan:
  	list_for_each_entry(sb, &super_blocks, s_list) {
551de6f34   Al Viro   Leave superblocks...
594
595
  		if (list_empty(&sb->s_instances))
  			continue;
618f06362   Kirill Korotaev   [PATCH] O(1) sb l...
596
597
  		if (sb->s_bdev == bdev) {
  			sb->s_count++;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
598
  			spin_unlock(&sb_lock);
618f06362   Kirill Korotaev   [PATCH] O(1) sb l...
599
  			down_read(&sb->s_umount);
df40c01a9   Al Viro   In get_super() an...
600
  			/* still alive? */
618f06362   Kirill Korotaev   [PATCH] O(1) sb l...
601
602
603
  			if (sb->s_root)
  				return sb;
  			up_read(&sb->s_umount);
df40c01a9   Al Viro   In get_super() an...
604
  			/* nope, got unmounted */
618f06362   Kirill Korotaev   [PATCH] O(1) sb l...
605
  			spin_lock(&sb_lock);
df40c01a9   Al Viro   In get_super() an...
606
607
  			__put_super(sb);
  			goto rescan;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
608
609
610
611
612
613
614
  		}
  	}
  	spin_unlock(&sb_lock);
  	return NULL;
  }
  
  EXPORT_SYMBOL(get_super);
4504230a7   Christoph Hellwig   freeze_bdev: grab...
615
616
617
618
619
620
621
  
  /**
   * 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...
622
   * reference or %NULL if none was found.
4504230a7   Christoph Hellwig   freeze_bdev: grab...
623
624
625
626
627
628
629
   */
  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...
630
  restart:
4504230a7   Christoph Hellwig   freeze_bdev: grab...
631
632
  	spin_lock(&sb_lock);
  	list_for_each_entry(sb, &super_blocks, s_list) {
551de6f34   Al Viro   Leave superblocks...
633
634
  		if (list_empty(&sb->s_instances))
  			continue;
1494583de   Al Viro   fix get_active_su...
635
636
637
638
639
640
  		if (sb->s_bdev == bdev) {
  			if (grab_super(sb)) /* drops sb_lock */
  				return sb;
  			else
  				goto restart;
  		}
4504230a7   Christoph Hellwig   freeze_bdev: grab...
641
642
643
644
  	}
  	spin_unlock(&sb_lock);
  	return NULL;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
645
   
df40c01a9   Al Viro   In get_super() an...
646
  struct super_block *user_get_super(dev_t dev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
647
  {
618f06362   Kirill Korotaev   [PATCH] O(1) sb l...
648
  	struct super_block *sb;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
649

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
650
  	spin_lock(&sb_lock);
618f06362   Kirill Korotaev   [PATCH] O(1) sb l...
651
652
  rescan:
  	list_for_each_entry(sb, &super_blocks, s_list) {
551de6f34   Al Viro   Leave superblocks...
653
654
  		if (list_empty(&sb->s_instances))
  			continue;
618f06362   Kirill Korotaev   [PATCH] O(1) sb l...
655
656
  		if (sb->s_dev ==  dev) {
  			sb->s_count++;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
657
  			spin_unlock(&sb_lock);
618f06362   Kirill Korotaev   [PATCH] O(1) sb l...
658
  			down_read(&sb->s_umount);
df40c01a9   Al Viro   In get_super() an...
659
  			/* still alive? */
618f06362   Kirill Korotaev   [PATCH] O(1) sb l...
660
661
662
  			if (sb->s_root)
  				return sb;
  			up_read(&sb->s_umount);
df40c01a9   Al Viro   In get_super() an...
663
  			/* nope, got unmounted */
618f06362   Kirill Korotaev   [PATCH] O(1) sb l...
664
  			spin_lock(&sb_lock);
df40c01a9   Al Viro   In get_super() an...
665
666
  			__put_super(sb);
  			goto rescan;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
667
668
669
670
671
  		}
  	}
  	spin_unlock(&sb_lock);
  	return NULL;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
672
  /**
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
673
674
675
676
677
678
679
680
681
682
683
   *	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...
684
  	int remount_ro;
4504230a7   Christoph Hellwig   freeze_bdev: grab...
685
686
687
  
  	if (sb->s_frozen != SB_UNFROZEN)
  		return -EBUSY;
9361401eb   David Howells   [PATCH] BLOCK: Ma...
688
  #ifdef CONFIG_BLOCK
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
689
690
  	if (!(flags & MS_RDONLY) && bdev_read_only(sb->s_bdev))
  		return -EACCES;
9361401eb   David Howells   [PATCH] BLOCK: Ma...
691
  #endif
4504230a7   Christoph Hellwig   freeze_bdev: grab...
692

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
693
694
695
  	if (flags & MS_RDONLY)
  		acct_auto_close(sb);
  	shrink_dcache_sb(sb);
60b0680fa   Jan Kara   vfs: Rename fsync...
696
  	sync_filesystem(sb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
697

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

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) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
703
704
  		if (force)
  			mark_files_ro(sb);
b0895513f   J. R. Okajima   remove unlock_ker...
705
  		else if (!fs_may_remount_ro(sb))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
706
707
708
709
  			return -EBUSY;
  	}
  
  	if (sb->s_op->remount_fs) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
710
  		retval = sb->s_op->remount_fs(sb, &flags, data);
b0895513f   J. R. Okajima   remove unlock_ker...
711
  		if (retval)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
712
713
714
  			return retval;
  	}
  	sb->s_flags = (sb->s_flags & ~MS_RMT_MASK) | (flags & MS_RMT_MASK);
c79d967de   Christoph Hellwig   quota: move remou...
715

d208bbdda   Nick Piggin   fs: improve remou...
716
717
718
719
720
721
722
723
724
725
  	/*
  	 * 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
726
727
  	return 0;
  }
a2a9537ac   Jens Axboe   Get rid of pdflus...
728
  static void do_emergency_remount(struct work_struct *work)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
729
  {
dca332528   Al Viro   no need for list_...
730
  	struct super_block *sb, *p = NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
731
732
  
  	spin_lock(&sb_lock);
dca332528   Al Viro   no need for list_...
733
  	list_for_each_entry(sb, &super_blocks, s_list) {
551de6f34   Al Viro   Leave superblocks...
734
735
  		if (list_empty(&sb->s_instances))
  			continue;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
736
737
  		sb->s_count++;
  		spin_unlock(&sb_lock);
443b94baa   Al Viro   Make sure that al...
738
  		down_write(&sb->s_umount);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
739
740
  		if (sb->s_root && sb->s_bdev && !(sb->s_flags & MS_RDONLY)) {
  			/*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
741
742
  			 * What lock protects sb->s_flags??
  			 */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
743
  			do_remount_sb(sb, MS_RDONLY, NULL, 1);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
744
  		}
443b94baa   Al Viro   Make sure that al...
745
  		up_write(&sb->s_umount);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
746
  		spin_lock(&sb_lock);
dca332528   Al Viro   no need for list_...
747
748
749
  		if (p)
  			__put_super(p);
  		p = sb;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
750
  	}
dca332528   Al Viro   no need for list_...
751
752
  	if (p)
  		__put_super(p);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
753
  	spin_unlock(&sb_lock);
a2a9537ac   Jens Axboe   Get rid of pdflus...
754
  	kfree(work);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
755
756
757
758
759
760
  	printk("Emergency Remount complete
  ");
  }
  
  void emergency_remount(void)
  {
a2a9537ac   Jens Axboe   Get rid of pdflus...
761
762
763
764
765
766
767
  	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
768
769
770
771
772
773
  }
  
  /*
   * 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...
774
  static DEFINE_IDA(unnamed_dev_ida);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
775
  static DEFINE_SPINLOCK(unnamed_dev_lock);/* protects the above */
c63e09ecc   Al Viro   Make allocation o...
776
  static int unnamed_dev_start = 0; /* don't bother trying below it */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
777

0ee5dc676   Al Viro   btrfs: kill magic...
778
  int get_anon_bdev(dev_t *p)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
779
780
781
782
783
  {
  	int dev;
  	int error;
  
   retry:
ad76cbc63   Alexey Dobriyan   [PATCH 2/2] anond...
784
  	if (ida_pre_get(&unnamed_dev_ida, GFP_ATOMIC) == 0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
785
786
  		return -ENOMEM;
  	spin_lock(&unnamed_dev_lock);
c63e09ecc   Al Viro   Make allocation o...
787
  	error = ida_get_new_above(&unnamed_dev_ida, unnamed_dev_start, &dev);
f21f62208   Al Viro   ... and the same ...
788
789
  	if (!error)
  		unnamed_dev_start = dev + 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
790
791
792
793
794
795
796
797
798
  	spin_unlock(&unnamed_dev_lock);
  	if (error == -EAGAIN)
  		/* We raced and lost with another CPU. */
  		goto retry;
  	else if (error)
  		return -EAGAIN;
  
  	if ((dev & MAX_ID_MASK) == (1 << MINORBITS)) {
  		spin_lock(&unnamed_dev_lock);
ad76cbc63   Alexey Dobriyan   [PATCH 2/2] anond...
799
  		ida_remove(&unnamed_dev_ida, dev);
f21f62208   Al Viro   ... and the same ...
800
801
  		if (unnamed_dev_start > dev)
  			unnamed_dev_start = dev;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
802
803
804
  		spin_unlock(&unnamed_dev_lock);
  		return -EMFILE;
  	}
0ee5dc676   Al Viro   btrfs: kill magic...
805
  	*p = MKDEV(0, dev & MINORMASK);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
806
807
  	return 0;
  }
0ee5dc676   Al Viro   btrfs: kill magic...
808
  EXPORT_SYMBOL(get_anon_bdev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
809

0ee5dc676   Al Viro   btrfs: kill magic...
810
  void free_anon_bdev(dev_t dev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
811
  {
0ee5dc676   Al Viro   btrfs: kill magic...
812
  	int slot = MINOR(dev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
813
  	spin_lock(&unnamed_dev_lock);
ad76cbc63   Alexey Dobriyan   [PATCH 2/2] anond...
814
  	ida_remove(&unnamed_dev_ida, slot);
c63e09ecc   Al Viro   Make allocation o...
815
816
  	if (slot < unnamed_dev_start)
  		unnamed_dev_start = slot;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
817
818
  	spin_unlock(&unnamed_dev_lock);
  }
0ee5dc676   Al Viro   btrfs: kill magic...
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
  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
837
838
  
  EXPORT_SYMBOL(kill_anon_super);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
839
840
841
842
843
844
845
846
  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 ...
847
848
849
850
851
852
853
854
855
856
  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(...
857
858
  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 ...
859
860
861
862
863
  {
  	struct super_block *sb;
  
  	sb = sget(fs_type, ns_test_super, ns_set_super, data);
  	if (IS_ERR(sb))
ceefda693   Al Viro   switch get_sb_ns(...
864
  		return ERR_CAST(sb);
909e6d947   Serge E. Hallyn   namespaces: move ...
865
866
867
868
869
870
  
  	if (!sb->s_root) {
  		int err;
  		sb->s_flags = flags;
  		err = fill_super(sb, data, flags & MS_SILENT ? 1 : 0);
  		if (err) {
74dbbdd7f   Al Viro   New helper: deact...
871
  			deactivate_locked_super(sb);
ceefda693   Al Viro   switch get_sb_ns(...
872
  			return ERR_PTR(err);
909e6d947   Serge E. Hallyn   namespaces: move ...
873
874
875
876
  		}
  
  		sb->s_flags |= MS_ACTIVE;
  	}
ceefda693   Al Viro   switch get_sb_ns(...
877
  	return dget(sb->s_root);
909e6d947   Serge E. Hallyn   namespaces: move ...
878
  }
ceefda693   Al Viro   switch get_sb_ns(...
879
  EXPORT_SYMBOL(mount_ns);
909e6d947   Serge E. Hallyn   namespaces: move ...
880

9361401eb   David Howells   [PATCH] BLOCK: Ma...
881
  #ifdef CONFIG_BLOCK
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
882
883
884
885
  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...
886
887
888
889
890
891
  
  	/*
  	 * 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
892
893
894
895
896
897
898
  	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...
899
  struct dentry *mount_bdev(struct file_system_type *fs_type,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
900
  	int flags, const char *dev_name, void *data,
152a08366   Al Viro   new helper: mount...
901
  	int (*fill_super)(struct super_block *, void *, int))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
902
903
904
  {
  	struct block_device *bdev;
  	struct super_block *s;
d4d776299   Tejun Heo   block: clean up b...
905
  	fmode_t mode = FMODE_READ | FMODE_EXCL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
906
  	int error = 0;
30c40d2c0   Al Viro   [PATCH] propagate...
907
908
  	if (!(flags & MS_RDONLY))
  		mode |= FMODE_WRITE;
d4d776299   Tejun Heo   block: clean up b...
909
  	bdev = blkdev_get_by_path(dev_name, mode, fs_type);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
910
  	if (IS_ERR(bdev))
152a08366   Al Viro   new helper: mount...
911
  		return ERR_CAST(bdev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
912
913
914
915
916
917
  
  	/*
  	 * 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...
918
919
920
921
922
923
  	mutex_lock(&bdev->bd_fsfreeze_mutex);
  	if (bdev->bd_fsfreeze_count > 0) {
  		mutex_unlock(&bdev->bd_fsfreeze_mutex);
  		error = -EBUSY;
  		goto error_bdev;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
924
  	s = sget(fs_type, test_bdev_super, set_bdev_super, bdev);
4fadd7bb2   Christoph Hellwig   freeze_bdev: kill...
925
  	mutex_unlock(&bdev->bd_fsfreeze_mutex);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
926
  	if (IS_ERR(s))
454e2398b   David Howells   [PATCH] VFS: Perm...
927
  		goto error_s;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
928
929
930
  
  	if (s->s_root) {
  		if ((flags ^ s->s_flags) & MS_RDONLY) {
74dbbdd7f   Al Viro   New helper: deact...
931
  			deactivate_locked_super(s);
454e2398b   David Howells   [PATCH] VFS: Perm...
932
933
  			error = -EBUSY;
  			goto error_bdev;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
934
  		}
454e2398b   David Howells   [PATCH] VFS: Perm...
935

4f331f01b   Tejun Heo   vfs: don't hold s...
936
937
  		/*
  		 * s_umount nests inside bd_mutex during
e525fd89d   Tejun Heo   block: make blkde...
938
939
940
941
  		 * __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...
942
943
  		 */
  		up_write(&s->s_umount);
d4d776299   Tejun Heo   block: clean up b...
944
  		blkdev_put(bdev, mode);
4f331f01b   Tejun Heo   vfs: don't hold s...
945
  		down_write(&s->s_umount);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
946
947
  	} else {
  		char b[BDEVNAME_SIZE];
9e1f1de02   Al Viro   more conservative...
948
  		s->s_flags = flags | MS_NOSEC;
30c40d2c0   Al Viro   [PATCH] propagate...
949
  		s->s_mode = mode;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
950
  		strlcpy(s->s_id, bdevname(bdev, b), sizeof(s->s_id));
e78c9a004   Pekka Enberg   [PATCH] fs: remov...
951
  		sb_set_blocksize(s, block_size(bdev));
9b04c997b   Theodore Ts'o   [PATCH] vfs: MS_V...
952
  		error = fill_super(s, data, flags & MS_SILENT ? 1 : 0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
953
  		if (error) {
74dbbdd7f   Al Viro   New helper: deact...
954
  			deactivate_locked_super(s);
454e2398b   David Howells   [PATCH] VFS: Perm...
955
  			goto error;
fa675765a   Greg Kroah-Hartman   Revert mount/umou...
956
  		}
454e2398b   David Howells   [PATCH] VFS: Perm...
957
958
  
  		s->s_flags |= MS_ACTIVE;
87d8fe1ee   Theodore Ts'o   add releasepage h...
959
  		bdev->bd_super = s;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
960
  	}
152a08366   Al Viro   new helper: mount...
961
  	return dget(s->s_root);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
962

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

ddbaaf302   H Hartley Sweeten   NULL noise in fs/...
976
  	bdev->bd_super = NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
977
978
  	generic_shutdown_super(sb);
  	sync_blockdev(bdev);
d4d776299   Tejun Heo   block: clean up b...
979
  	WARN_ON_ONCE(!(mode & FMODE_EXCL));
e525fd89d   Tejun Heo   block: make blkde...
980
  	blkdev_put(bdev, mode | FMODE_EXCL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
981
982
983
  }
  
  EXPORT_SYMBOL(kill_block_super);
9361401eb   David Howells   [PATCH] BLOCK: Ma...
984
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
985

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

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

e00075298   Eric Paris   LSM/SELinux: Inte...
1047
  		error = security_sb_copy_data(data, secdata);
454e2398b   David Howells   [PATCH] VFS: Perm...
1048
  		if (error)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1049
  			goto out_free_secdata;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1050
  	}
1a102ff92   Al Viro   vfs: bury ->get_sb()
1051
1052
1053
1054
  	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...
1055
  	}
9d412a43c   Al Viro   vfs: split off vf...
1056
1057
1058
  	sb = root->d_sb;
  	BUG_ON(!sb);
  	WARN_ON(!sb->s_bdi);
6c5103890   Linus Torvalds   Merge branch 'for...
1059
  	WARN_ON(sb->s_bdi == &default_backing_dev_info);
9d412a43c   Al Viro   vfs: split off vf...
1060
  	sb->s_flags |= MS_BORN;
454e2398b   David Howells   [PATCH] VFS: Perm...
1061

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

42cb56ae2   Jeff Layton   vfs: change sb->s...
1066
1067
1068
1069
  	/*
  	 * 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...
1070
  	 * violate this rule.
42cb56ae2   Jeff Layton   vfs: change sb->s...
1071
  	 */
9d412a43c   Al Viro   vfs: split off vf...
1072
1073
1074
  	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...
1075

9d412a43c   Al Viro   vfs: split off vf...
1076
  	up_write(&sb->s_umount);
8680e22f2   Gerald Schaefer   [PATCH] VFS: memo...
1077
  	free_secdata(secdata);
9d412a43c   Al Viro   vfs: split off vf...
1078
  	return root;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1079
  out_sb:
9d412a43c   Al Viro   vfs: split off vf...
1080
1081
  	dput(root);
  	deactivate_locked_super(sb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1082
1083
  out_free_secdata:
  	free_secdata(secdata);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1084
  out:
454e2398b   David Howells   [PATCH] VFS: Perm...
1085
  	return ERR_PTR(error);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1086
  }
18e9e5104   Josef Bacik   Introduce freeze_...
1087
  /**
7000d3c42   Randy Dunlap   fs/super: fix ker...
1088
1089
   * freeze_super - lock the filesystem and force it into a consistent state
   * @sb: the super to lock
18e9e5104   Josef Bacik   Introduce freeze_...
1090
1091
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
   *
   * 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.
   */
  int freeze_super(struct super_block *sb)
  {
  	int ret;
  
  	atomic_inc(&sb->s_active);
  	down_write(&sb->s_umount);
  	if (sb->s_frozen) {
  		deactivate_locked_super(sb);
  		return -EBUSY;
  	}
  
  	if (sb->s_flags & MS_RDONLY) {
  		sb->s_frozen = SB_FREEZE_TRANS;
  		smp_wmb();
  		up_write(&sb->s_umount);
  		return 0;
  	}
  
  	sb->s_frozen = SB_FREEZE_WRITE;
  	smp_wmb();
  
  	sync_filesystem(sb);
  
  	sb->s_frozen = SB_FREEZE_TRANS;
  	smp_wmb();
  
  	sync_blockdev(sb->s_bdev);
  	if (sb->s_op->freeze_fs) {
  		ret = sb->s_op->freeze_fs(sb);
  		if (ret) {
  			printk(KERN_ERR
  				"VFS:Filesystem freeze failed
  ");
  			sb->s_frozen = SB_UNFROZEN;
  			deactivate_locked_super(sb);
  			return ret;
  		}
  	}
  	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);
  	if (sb->s_frozen == SB_UNFROZEN) {
  		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
  ");
  			sb->s_frozen = SB_FREEZE_TRANS;
  			up_write(&sb->s_umount);
  			return error;
  		}
  	}
  
  out:
  	sb->s_frozen = SB_UNFROZEN;
  	smp_wmb();
  	wake_up(&sb->s_wait_unfrozen);
  	deactivate_locked_super(sb);
  
  	return 0;
  }
  EXPORT_SYMBOL(thaw_super);