Blame view

fs/super.c 28.5 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
  
  	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))
09f363c73   Mikulas Patocka   vmscan: fix shrin...
61
  		return !sc->nr_to_scan ? 0 : -1;
b0d40c92a   Dave Chinner   superblock: intro...
62

0e1fdafd9   Dave Chinner   superblock: add f...
63
64
65
66
67
  	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...
68
  	if (sc->nr_to_scan) {
0e1fdafd9   Dave Chinner   superblock: add f...
69
70
  		int	dentries;
  		int	inodes;
b0d40c92a   Dave Chinner   superblock: intro...
71

0e1fdafd9   Dave Chinner   superblock: add f...
72
73
74
75
76
77
78
79
80
81
82
83
84
85
  		/* 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...
86

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

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

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

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
381
382
  		if (sop->put_super)
  			sop->put_super(sb);
63997e98a   Al Viro   split invalidate_...
383
  		if (!list_empty(&sb->s_inodes)) {
7b4fe29e0   Dave Jones   [PATCH] More info...
384
385
386
387
  			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
388
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
389
390
391
  	}
  	spin_lock(&sb_lock);
  	/* should be initialized for __put_super_and_need_restart() */
551de6f34   Al Viro   Leave superblocks...
392
  	list_del_init(&sb->s_instances);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
  	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...
412
  	struct super_block *old;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
413
414
415
416
  	int err;
  
  retry:
  	spin_lock(&sb_lock);
d47301271   Matthias Kaehlcke   fs/super.c: use l...
417
418
419
420
421
422
  	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 ...
423
424
  			if (s) {
  				up_write(&s->s_umount);
d47301271   Matthias Kaehlcke   fs/super.c: use l...
425
  				destroy_super(s);
7a4dec538   Al Viro   Fix sget() race w...
426
  				s = NULL;
a3cfbb53b   Li Zefan   vfs: add missing ...
427
  			}
d3f214730   Al Viro   Move grabbing s_u...
428
  			down_write(&old->s_umount);
7a4dec538   Al Viro   Fix sget() race w...
429
430
431
432
  			if (unlikely(!(old->s_flags & MS_BORN))) {
  				deactivate_locked_super(old);
  				goto retry;
  			}
d47301271   Matthias Kaehlcke   fs/super.c: use l...
433
434
  			return old;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
435
436
437
  	}
  	if (!s) {
  		spin_unlock(&sb_lock);
cf5162499   Ingo Molnar   [PATCH] lockdep: ...
438
  		s = alloc_super(type);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
439
440
441
442
443
444
445
446
  		if (!s)
  			return ERR_PTR(-ENOMEM);
  		goto retry;
  	}
  		
  	err = set(s, data);
  	if (err) {
  		spin_unlock(&sb_lock);
a3cfbb53b   Li Zefan   vfs: add missing ...
447
  		up_write(&s->s_umount);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
448
449
450
451
452
453
454
455
456
  		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...
457
  	register_shrinker(&s->s_shrink);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
458
459
460
461
462
463
464
465
466
467
468
469
  	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
470
471
472
473
474
475
476
477
  /**
   * 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
478
479
480
481
482
483
   * 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_...
484
  	struct super_block *sb, *p = NULL;
618f06362   Kirill Korotaev   [PATCH] O(1) sb l...
485

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

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

618f06362   Kirill Korotaev   [PATCH] O(1) sb l...
499
  			spin_lock(&sb_lock);
dca332528   Al Viro   no need for list_...
500
501
502
  			if (p)
  				__put_super(p);
  			p = sb;
618f06362   Kirill Korotaev   [PATCH] O(1) sb l...
503
504
  		}
  	}
dca332528   Al Viro   no need for list_...
505
506
  	if (p)
  		__put_super(p);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
507
508
  	spin_unlock(&sb_lock);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
509
  /**
01a05b337   Al Viro   new helper: itera...
510
511
512
513
514
515
516
517
518
   *	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_...
519
  	struct super_block *sb, *p = NULL;
01a05b337   Al Viro   new helper: itera...
520
521
  
  	spin_lock(&sb_lock);
dca332528   Al Viro   no need for list_...
522
  	list_for_each_entry(sb, &super_blocks, s_list) {
01a05b337   Al Viro   new helper: itera...
523
524
525
526
527
528
529
530
531
532
533
  		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_...
534
535
536
  		if (p)
  			__put_super(p);
  		p = sb;
01a05b337   Al Viro   new helper: itera...
537
  	}
dca332528   Al Viro   no need for list_...
538
539
  	if (p)
  		__put_super(p);
01a05b337   Al Viro   new helper: itera...
540
541
542
543
  	spin_unlock(&sb_lock);
  }
  
  /**
43e15cdbe   Al Viro   new helper: itera...
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
579
   *	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
580
581
582
583
584
585
   *	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...
586
  struct super_block *get_super(struct block_device *bdev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
587
  {
618f06362   Kirill Korotaev   [PATCH] O(1) sb l...
588
  	struct super_block *sb;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
589
590
  	if (!bdev)
  		return NULL;
618f06362   Kirill Korotaev   [PATCH] O(1) sb l...
591

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

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

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

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

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
701
702
  	/* 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...
703
  	if (remount_ro) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
704
705
  		if (force)
  			mark_files_ro(sb);
b0895513f   J. R. Okajima   remove unlock_ker...
706
  		else if (!fs_may_remount_ro(sb))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
707
708
709
710
  			return -EBUSY;
  	}
  
  	if (sb->s_op->remount_fs) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
711
  		retval = sb->s_op->remount_fs(sb, &flags, data);
2833eb2b4   Miklos Szeredi   vfs: ignore error...
712
713
714
715
716
717
718
719
  		if (retval) {
  			if (!force)
  				return retval;
  			/* 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
720
721
  	}
  	sb->s_flags = (sb->s_flags & ~MS_RMT_MASK) | (flags & MS_RMT_MASK);
c79d967de   Christoph Hellwig   quota: move remou...
722

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

0ee5dc676   Al Viro   btrfs: kill magic...
785
  int get_anon_bdev(dev_t *p)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
786
787
788
789
790
  {
  	int dev;
  	int error;
  
   retry:
ad76cbc63   Alexey Dobriyan   [PATCH 2/2] anond...
791
  	if (ida_pre_get(&unnamed_dev_ida, GFP_ATOMIC) == 0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
792
793
  		return -ENOMEM;
  	spin_lock(&unnamed_dev_lock);
c63e09ecc   Al Viro   Make allocation o...
794
  	error = ida_get_new_above(&unnamed_dev_ida, unnamed_dev_start, &dev);
f21f62208   Al Viro   ... and the same ...
795
796
  	if (!error)
  		unnamed_dev_start = dev + 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
797
798
799
800
801
802
803
804
805
  	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...
806
  		ida_remove(&unnamed_dev_ida, dev);
f21f62208   Al Viro   ... and the same ...
807
808
  		if (unnamed_dev_start > dev)
  			unnamed_dev_start = dev;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
809
810
811
  		spin_unlock(&unnamed_dev_lock);
  		return -EMFILE;
  	}
0ee5dc676   Al Viro   btrfs: kill magic...
812
  	*p = MKDEV(0, dev & MINORMASK);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
813
814
  	return 0;
  }
0ee5dc676   Al Viro   btrfs: kill magic...
815
  EXPORT_SYMBOL(get_anon_bdev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
816

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

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

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

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

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

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

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

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

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

42cb56ae2   Jeff Layton   vfs: change sb->s...
1073
1074
1075
1076
  	/*
  	 * 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...
1077
  	 * violate this rule.
42cb56ae2   Jeff Layton   vfs: change sb->s...
1078
  	 */
9d412a43c   Al Viro   vfs: split off vf...
1079
1080
1081
  	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...
1082

9d412a43c   Al Viro   vfs: split off vf...
1083
  	up_write(&sb->s_umount);
8680e22f2   Gerald Schaefer   [PATCH] VFS: memo...
1084
  	free_secdata(secdata);
9d412a43c   Al Viro   vfs: split off vf...
1085
  	return root;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1086
  out_sb:
9d412a43c   Al Viro   vfs: split off vf...
1087
1088
  	dput(root);
  	deactivate_locked_super(sb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1089
1090
  out_free_secdata:
  	free_secdata(secdata);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1091
  out:
454e2398b   David Howells   [PATCH] VFS: Perm...
1092
  	return ERR_PTR(error);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1093
  }
18e9e5104   Josef Bacik   Introduce freeze_...
1094
  /**
7000d3c42   Randy Dunlap   fs/super: fix ker...
1095
1096
   * freeze_super - lock the filesystem and force it into a consistent state
   * @sb: the super to lock
18e9e5104   Josef Bacik   Introduce freeze_...
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
   *
   * 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);