Blame view

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

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
38
39
  LIST_HEAD(super_blocks);
  DEFINE_SPINLOCK(sb_lock);
5accdf82b   Jan Kara   fs: Improve files...
40
41
42
43
44
  static char *sb_writers_name[SB_FREEZE_LEVELS] = {
  	"sb_writers",
  	"sb_pagefaults",
  	"sb_internal",
  };
b0d40c92a   Dave Chinner   superblock: intro...
45
46
47
48
49
50
51
52
53
54
  /*
   * 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...
55
56
  	int	fs_objects = 0;
  	int	total_objects;
b0d40c92a   Dave Chinner   superblock: intro...
57
58
59
60
61
62
63
64
65
66
67
  
  	sb = container_of(shrink, struct super_block, s_shrink);
  
  	/*
  	 * Deadlock avoidance.  We may hold various FS locks, and we don't want
  	 * to recurse into the FS that called us in clear_inode() and friends..
  	 */
  	if (sc->nr_to_scan && !(sc->gfp_mask & __GFP_FS))
  		return -1;
  
  	if (!grab_super_passive(sb))
8e125cd85   Minchan Kim   vmscan: remove ob...
68
  		return -1;
b0d40c92a   Dave Chinner   superblock: intro...
69

0e1fdafd9   Dave Chinner   superblock: add f...
70
71
72
73
74
  	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...
75
  	if (sc->nr_to_scan) {
0e1fdafd9   Dave Chinner   superblock: add f...
76
77
  		int	dentries;
  		int	inodes;
b0d40c92a   Dave Chinner   superblock: intro...
78

0e1fdafd9   Dave Chinner   superblock: add f...
79
80
81
82
83
84
85
86
87
88
89
90
91
92
  		/* 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...
93

0e1fdafd9   Dave Chinner   superblock: add f...
94
95
96
97
98
99
  		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...
100
  	}
0e1fdafd9   Dave Chinner   superblock: add f...
101
  	total_objects = (total_objects / 100) * sysctl_vfs_cache_pressure;
b0d40c92a   Dave Chinner   superblock: intro...
102
  	drop_super(sb);
0e1fdafd9   Dave Chinner   superblock: add f...
103
  	return total_objects;
b0d40c92a   Dave Chinner   superblock: intro...
104
  }
5accdf82b   Jan Kara   fs: Improve files...
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
  static int init_sb_writers(struct super_block *s, struct file_system_type *type)
  {
  	int err;
  	int i;
  
  	for (i = 0; i < SB_FREEZE_LEVELS; i++) {
  		err = percpu_counter_init(&s->s_writers.counter[i], 0);
  		if (err < 0)
  			goto err_out;
  		lockdep_init_map(&s->s_writers.lock_map[i], sb_writers_name[i],
  				 &type->s_writers_key[i], 0);
  	}
  	init_waitqueue_head(&s->s_writers.wait);
  	init_waitqueue_head(&s->s_writers.wait_unfrozen);
  	return 0;
  err_out:
  	while (--i >= 0)
  		percpu_counter_destroy(&s->s_writers.counter[i]);
  	return err;
  }
  
  static void destroy_sb_writers(struct super_block *s)
  {
  	int i;
  
  	for (i = 0; i < SB_FREEZE_LEVELS; i++)
  		percpu_counter_destroy(&s->s_writers.counter[i]);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
133
134
  /**
   *	alloc_super	-	create new superblock
fe2bbc483   Henrik Kretzschmar   [PATCH] add missi...
135
   *	@type:	filesystem type superblock should belong to
9249e17fe   David Howells   VFS: Pass mount f...
136
   *	@flags: the mount flags
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
137
138
139
140
   *
   *	Allocates and initializes a new &struct super_block.  alloc_super()
   *	returns a pointer new superblock or %NULL if allocation had failed.
   */
9249e17fe   David Howells   VFS: Pass mount f...
141
  static struct super_block *alloc_super(struct file_system_type *type, int flags)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
142
  {
11b0b5abb   Oliver Neukum   [PATCH] use kzall...
143
  	struct super_block *s = kzalloc(sizeof(struct super_block),  GFP_USER);
b87221de6   Alexey Dobriyan   const: mark remai...
144
  	static const struct super_operations default_op;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
145
146
  
  	if (s) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
147
  		if (security_sb_alloc(s)) {
5accdf82b   Jan Kara   fs: Improve files...
148
149
150
151
  			/*
  			 * We cannot call security_sb_free() without
  			 * security_sb_alloc() succeeding. So bail out manually
  			 */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
152
153
154
155
  			kfree(s);
  			s = NULL;
  			goto out;
  		}
6416ccb78   Nick Piggin   fs: scale files_lock
156
157
  #ifdef CONFIG_SMP
  		s->s_files = alloc_percpu(struct list_head);
5accdf82b   Jan Kara   fs: Improve files...
158
159
160
  		if (!s->s_files)
  			goto err_out;
  		else {
6416ccb78   Nick Piggin   fs: scale files_lock
161
162
163
164
165
166
  			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
167
  		INIT_LIST_HEAD(&s->s_files);
6416ccb78   Nick Piggin   fs: scale files_lock
168
  #endif
5accdf82b   Jan Kara   fs: Improve files...
169
170
  		if (init_sb_writers(s, type))
  			goto err_out;
9249e17fe   David Howells   VFS: Pass mount f...
171
  		s->s_flags = flags;
95f28604a   Jens Axboe   fs: assign sb->s_...
172
  		s->s_bdi = &default_backing_dev_info;
a5166169f   Al Viro   vfs: convert fs_s...
173
  		INIT_HLIST_NODE(&s->s_instances);
ceb5bdc2d   Nick Piggin   fs: dcache per-bu...
174
  		INIT_HLIST_BL_HEAD(&s->s_anon);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
175
  		INIT_LIST_HEAD(&s->s_inodes);
da3bbdd46   Kentaro Makita   fix soft lock up ...
176
  		INIT_LIST_HEAD(&s->s_dentry_lru);
98b745c64   Dave Chinner   inode: Make unuse...
177
  		INIT_LIST_HEAD(&s->s_inode_lru);
09cc9fc7a   Dave Chinner   inode: move to pe...
178
  		spin_lock_init(&s->s_inode_lru_lock);
39f7c4db1   Miklos Szeredi   vfs: keep list of...
179
  		INIT_LIST_HEAD(&s->s_mounts);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
180
  		init_rwsem(&s->s_umount);
7892f2f48   Ingo Molnar   [PATCH] mutex sub...
181
  		mutex_init(&s->s_lock);
897c6ff95   Arjan van de Ven   [PATCH] lockdep: ...
182
  		lockdep_set_class(&s->s_umount, &type->s_umount_key);
cf5162499   Ingo Molnar   [PATCH] lockdep: ...
183
184
185
186
187
188
  		/*
  		 * 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...
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
  		/*
  		 * 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
205
  		s->s_count = 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
206
  		atomic_set(&s->s_active, 1);
a11f3a057   Arjan van de Ven   [PATCH] sem2mutex...
207
  		mutex_init(&s->s_vfs_rename_mutex);
51ee049e7   Roland Dreier   vfs: add lockdep ...
208
  		lockdep_set_class(&s->s_vfs_rename_mutex, &type->s_vfs_rename_key);
d3be915fc   Ingo Molnar   [PATCH] sem2mutex...
209
210
  		mutex_init(&s->s_dquot.dqio_mutex);
  		mutex_init(&s->s_dquot.dqonoff_mutex);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
211
  		init_rwsem(&s->s_dquot.dqptr_sem);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
212
  		s->s_maxbytes = MAX_NON_LFS;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
213
214
  		s->s_op = &default_op;
  		s->s_time_gran = 1000000000;
c515e1fd3   Dan Magenheimer   mm/fs: add hooks ...
215
  		s->cleancache_poolid = -1;
b0d40c92a   Dave Chinner   superblock: intro...
216
217
218
  
  		s->s_shrink.seeks = DEFAULT_SEEKS;
  		s->s_shrink.shrink = prune_super;
8ab47664d   Dave Chinner   vfs: increase shr...
219
  		s->s_shrink.batch = 1024;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
220
221
222
  	}
  out:
  	return s;
5accdf82b   Jan Kara   fs: Improve files...
223
224
225
226
227
228
229
230
231
232
  err_out:
  	security_sb_free(s);
  #ifdef CONFIG_SMP
  	if (s->s_files)
  		free_percpu(s->s_files);
  #endif
  	destroy_sb_writers(s);
  	kfree(s);
  	s = NULL;
  	goto out;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
233
234
235
236
237
238
239
240
241
242
  }
  
  /**
   *	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
243
244
245
  #ifdef CONFIG_SMP
  	free_percpu(s->s_files);
  #endif
5accdf82b   Jan Kara   fs: Improve files...
246
  	destroy_sb_writers(s);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
247
  	security_sb_free(s);
39f7c4db1   Miklos Szeredi   vfs: keep list of...
248
  	WARN_ON(!list_empty(&s->s_mounts));
79c0b2df7   Miklos Szeredi   add filesystem su...
249
  	kfree(s->s_subtype);
b3b304a23   Miklos Szeredi   mount options: ad...
250
  	kfree(s->s_options);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
251
252
253
254
255
256
  	kfree(s);
  }
  
  /* Superblock refcounting  */
  
  /*
35cf7ba0b   Al Viro   Bury __put_super_...
257
   * Drop a superblock's refcount.  The caller must hold sb_lock.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
258
   */
f47ec3f28   Al Viro   trim fs/internal.h
259
  static void __put_super(struct super_block *sb)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
260
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
261
  	if (!--sb->s_count) {
551de6f34   Al Viro   Leave superblocks...
262
  		list_del_init(&sb->s_list);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
263
  		destroy_super(sb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
264
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
265
266
267
268
269
270
271
272
273
  }
  
  /**
   *	put_super	-	drop a temporary reference to superblock
   *	@sb: superblock in question
   *
   *	Drops a temporary reference, frees superblock if there's no
   *	references left.
   */
f47ec3f28   Al Viro   trim fs/internal.h
274
  static void put_super(struct super_block *sb)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
275
276
277
278
279
280
281
282
  {
  	spin_lock(&sb_lock);
  	__put_super(sb);
  	spin_unlock(&sb_lock);
  }
  
  
  /**
1712ac8fd   Al Viro   Saner locking aro...
283
   *	deactivate_locked_super	-	drop an active reference to superblock
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
284
285
   *	@s: superblock to deactivate
   *
1712ac8fd   Al Viro   Saner locking aro...
286
287
   *	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
288
289
   *	tell fs driver to shut it down and drop the temporary reference we
   *	had just acquired.
1712ac8fd   Al Viro   Saner locking aro...
290
291
   *
   *	Caller holds exclusive lock on superblock; that lock is released.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
292
   */
1712ac8fd   Al Viro   Saner locking aro...
293
  void deactivate_locked_super(struct super_block *s)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
294
295
  {
  	struct file_system_type *fs = s->s_type;
b20bd1a5e   Al Viro   get rid of S_BIAS
296
  	if (atomic_dec_and_test(&s->s_active)) {
3167760f8   Dan Magenheimer   mm: cleancache: s...
297
  		cleancache_invalidate_fs(s);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
298
  		fs->kill_sb(s);
b0d40c92a   Dave Chinner   superblock: intro...
299
300
301
  
  		/* caches are now gone, we can safely kill the shrinker now */
  		unregister_shrinker(&s->s_shrink);
d863b50ab   Boaz Harrosh   vfs: call rcu_bar...
302
303
304
305
306
  		/*
  		 * 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
307
308
  		put_filesystem(fs);
  		put_super(s);
1712ac8fd   Al Viro   Saner locking aro...
309
310
  	} else {
  		up_write(&s->s_umount);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
311
312
  	}
  }
1712ac8fd   Al Viro   Saner locking aro...
313
  EXPORT_SYMBOL(deactivate_locked_super);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
314
315
  
  /**
1712ac8fd   Al Viro   Saner locking aro...
316
   *	deactivate_super	-	drop an active reference to superblock
74dbbdd7f   Al Viro   New helper: deact...
317
318
   *	@s: superblock to deactivate
   *
1712ac8fd   Al Viro   Saner locking aro...
319
320
321
   *	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...
322
   */
1712ac8fd   Al Viro   Saner locking aro...
323
  void deactivate_super(struct super_block *s)
74dbbdd7f   Al Viro   New helper: deact...
324
  {
1712ac8fd   Al Viro   Saner locking aro...
325
326
327
          if (!atomic_add_unless(&s->s_active, -1, 1)) {
  		down_write(&s->s_umount);
  		deactivate_locked_super(s);
74dbbdd7f   Al Viro   New helper: deact...
328
329
  	}
  }
1712ac8fd   Al Viro   Saner locking aro...
330
  EXPORT_SYMBOL(deactivate_super);
74dbbdd7f   Al Viro   New helper: deact...
331
332
  
  /**
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
333
334
335
336
337
338
339
340
341
342
   *	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...
343
  static int grab_super(struct super_block *s) __releases(sb_lock)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
344
  {
b20bd1a5e   Al Viro   get rid of S_BIAS
345
346
  	if (atomic_inc_not_zero(&s->s_active)) {
  		spin_unlock(&sb_lock);
b20bd1a5e   Al Viro   get rid of S_BIAS
347
348
349
  		return 1;
  	}
  	/* it's going away */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
350
351
  	s->s_count++;
  	spin_unlock(&sb_lock);
1712ac8fd   Al Viro   Saner locking aro...
352
  	/* wait for it to die */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
353
  	down_write(&s->s_umount);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
354
355
  	up_write(&s->s_umount);
  	put_super(s);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
356
357
  	return 0;
  }
cf9a2ae8d   David Howells   [PATCH] BLOCK: Mo...
358
  /*
12ad3ab66   Dave Chinner   superblock: move ...
359
   *	grab_super_passive - acquire a passive reference
331cbdeed   Wanpeng Li   writeback: Fix so...
360
   *	@sb: reference we are trying to grab
12ad3ab66   Dave Chinner   superblock: move ...
361
362
363
364
365
366
367
368
369
370
371
372
   *
   *	Tries to acquire a passive reference. This is used in places where we
   *	cannot take an active reference but we need to ensure that the
   *	superblock does not go away while we are working on it. It returns
   *	false if a reference was not gained, and returns true with the s_umount
   *	lock held in read mode if a reference is gained. On successful return,
   *	the caller must drop the s_umount lock and the passive reference when
   *	done.
   */
  bool grab_super_passive(struct super_block *sb)
  {
  	spin_lock(&sb_lock);
a5166169f   Al Viro   vfs: convert fs_s...
373
  	if (hlist_unhashed(&sb->s_instances)) {
12ad3ab66   Dave Chinner   superblock: move ...
374
375
376
377
378
379
380
381
  		spin_unlock(&sb_lock);
  		return false;
  	}
  
  	sb->s_count++;
  	spin_unlock(&sb_lock);
  
  	if (down_read_trylock(&sb->s_umount)) {
dabe0dc19   Al Viro   vfs: fix the rest...
382
  		if (sb->s_root && (sb->s_flags & MS_BORN))
12ad3ab66   Dave Chinner   superblock: move ...
383
384
385
386
387
388
389
390
391
  			return true;
  		up_read(&sb->s_umount);
  	}
  
  	put_super(sb);
  	return false;
  }
  
  /*
914e26379   Al Viro   [PATCH] severing ...
392
393
394
395
   * Superblock locking.  We really ought to get rid of these two.
   */
  void lock_super(struct super_block * sb)
  {
914e26379   Al Viro   [PATCH] severing ...
396
397
398
399
400
  	mutex_lock(&sb->s_lock);
  }
  
  void unlock_super(struct super_block * sb)
  {
914e26379   Al Viro   [PATCH] severing ...
401
402
403
404
405
  	mutex_unlock(&sb->s_lock);
  }
  
  EXPORT_SYMBOL(lock_super);
  EXPORT_SYMBOL(unlock_super);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
406
407
408
409
410
411
412
413
414
  /**
   *	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...
415
416
417
418
   *
   *	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
419
420
421
   */
  void generic_shutdown_super(struct super_block *sb)
  {
ee9b6d61a   Josef 'Jeff' Sipek   [PATCH] Mark stru...
422
  	const struct super_operations *sop = sb->s_op;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
423

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

63997e98a   Al Viro   split invalidate_...
429
430
431
  		fsnotify_unmount_inodes(&sb->s_inodes);
  
  		evict_inodes(sb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
432

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
433
434
  		if (sop->put_super)
  			sop->put_super(sb);
63997e98a   Al Viro   split invalidate_...
435
  		if (!list_empty(&sb->s_inodes)) {
7b4fe29e0   Dave Jones   [PATCH] More info...
436
437
438
439
  			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
440
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
441
442
443
  	}
  	spin_lock(&sb_lock);
  	/* should be initialized for __put_super_and_need_restart() */
a5166169f   Al Viro   vfs: convert fs_s...
444
  	hlist_del_init(&sb->s_instances);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
445
446
447
448
449
450
451
452
453
454
455
  	spin_unlock(&sb_lock);
  	up_write(&sb->s_umount);
  }
  
  EXPORT_SYMBOL(generic_shutdown_super);
  
  /**
   *	sget	-	find or create a superblock
   *	@type:	filesystem type superblock should belong to
   *	@test:	comparison callback
   *	@set:	setup callback
9249e17fe   David Howells   VFS: Pass mount f...
456
   *	@flags:	mount flags
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
457
458
459
460
461
   *	@data:	argument to each of them
   */
  struct super_block *sget(struct file_system_type *type,
  			int (*test)(struct super_block *,void *),
  			int (*set)(struct super_block *,void *),
9249e17fe   David Howells   VFS: Pass mount f...
462
  			int flags,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
463
464
465
  			void *data)
  {
  	struct super_block *s = NULL;
a5166169f   Al Viro   vfs: convert fs_s...
466
  	struct hlist_node *node;
d47301271   Matthias Kaehlcke   fs/super.c: use l...
467
  	struct super_block *old;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
468
469
470
471
  	int err;
  
  retry:
  	spin_lock(&sb_lock);
d47301271   Matthias Kaehlcke   fs/super.c: use l...
472
  	if (test) {
a5166169f   Al Viro   vfs: convert fs_s...
473
  		hlist_for_each_entry(old, node, &type->fs_supers, s_instances) {
d47301271   Matthias Kaehlcke   fs/super.c: use l...
474
475
476
477
  			if (!test(old, data))
  				continue;
  			if (!grab_super(old))
  				goto retry;
a3cfbb53b   Li Zefan   vfs: add missing ...
478
479
  			if (s) {
  				up_write(&s->s_umount);
d47301271   Matthias Kaehlcke   fs/super.c: use l...
480
  				destroy_super(s);
7a4dec538   Al Viro   Fix sget() race w...
481
  				s = NULL;
a3cfbb53b   Li Zefan   vfs: add missing ...
482
  			}
d3f214730   Al Viro   Move grabbing s_u...
483
  			down_write(&old->s_umount);
7a4dec538   Al Viro   Fix sget() race w...
484
485
486
487
  			if (unlikely(!(old->s_flags & MS_BORN))) {
  				deactivate_locked_super(old);
  				goto retry;
  			}
d47301271   Matthias Kaehlcke   fs/super.c: use l...
488
489
  			return old;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
490
491
492
  	}
  	if (!s) {
  		spin_unlock(&sb_lock);
9249e17fe   David Howells   VFS: Pass mount f...
493
  		s = alloc_super(type, flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
494
495
496
497
498
499
500
501
  		if (!s)
  			return ERR_PTR(-ENOMEM);
  		goto retry;
  	}
  		
  	err = set(s, data);
  	if (err) {
  		spin_unlock(&sb_lock);
a3cfbb53b   Li Zefan   vfs: add missing ...
502
  		up_write(&s->s_umount);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
503
504
505
506
507
508
  		destroy_super(s);
  		return ERR_PTR(err);
  	}
  	s->s_type = type;
  	strlcpy(s->s_id, type->name, sizeof(s->s_id));
  	list_add_tail(&s->s_list, &super_blocks);
a5166169f   Al Viro   vfs: convert fs_s...
509
  	hlist_add_head(&s->s_instances, &type->fs_supers);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
510
511
  	spin_unlock(&sb_lock);
  	get_filesystem(type);
b0d40c92a   Dave Chinner   superblock: intro...
512
  	register_shrinker(&s->s_shrink);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
513
514
515
516
517
518
519
520
521
522
523
524
  	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
525
  /**
01a05b337   Al Viro   new helper: itera...
526
527
528
529
530
531
532
533
534
   *	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_...
535
  	struct super_block *sb, *p = NULL;
01a05b337   Al Viro   new helper: itera...
536
537
  
  	spin_lock(&sb_lock);
dca332528   Al Viro   no need for list_...
538
  	list_for_each_entry(sb, &super_blocks, s_list) {
a5166169f   Al Viro   vfs: convert fs_s...
539
  		if (hlist_unhashed(&sb->s_instances))
01a05b337   Al Viro   new helper: itera...
540
541
542
543
544
  			continue;
  		sb->s_count++;
  		spin_unlock(&sb_lock);
  
  		down_read(&sb->s_umount);
dabe0dc19   Al Viro   vfs: fix the rest...
545
  		if (sb->s_root && (sb->s_flags & MS_BORN))
01a05b337   Al Viro   new helper: itera...
546
547
548
549
  			f(sb, arg);
  		up_read(&sb->s_umount);
  
  		spin_lock(&sb_lock);
dca332528   Al Viro   no need for list_...
550
551
552
  		if (p)
  			__put_super(p);
  		p = sb;
01a05b337   Al Viro   new helper: itera...
553
  	}
dca332528   Al Viro   no need for list_...
554
555
  	if (p)
  		__put_super(p);
01a05b337   Al Viro   new helper: itera...
556
557
558
559
  	spin_unlock(&sb_lock);
  }
  
  /**
43e15cdbe   Al Viro   new helper: itera...
560
561
562
563
564
565
566
567
568
569
570
571
   *	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;
a5166169f   Al Viro   vfs: convert fs_s...
572
  	struct hlist_node *node;
43e15cdbe   Al Viro   new helper: itera...
573
574
  
  	spin_lock(&sb_lock);
a5166169f   Al Viro   vfs: convert fs_s...
575
  	hlist_for_each_entry(sb, node, &type->fs_supers, s_instances) {
43e15cdbe   Al Viro   new helper: itera...
576
577
578
579
  		sb->s_count++;
  		spin_unlock(&sb_lock);
  
  		down_read(&sb->s_umount);
dabe0dc19   Al Viro   vfs: fix the rest...
580
  		if (sb->s_root && (sb->s_flags & MS_BORN))
43e15cdbe   Al Viro   new helper: itera...
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
  			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
597
598
599
600
601
602
   *	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...
603
  struct super_block *get_super(struct block_device *bdev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
604
  {
618f06362   Kirill Korotaev   [PATCH] O(1) sb l...
605
  	struct super_block *sb;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
606
607
  	if (!bdev)
  		return NULL;
618f06362   Kirill Korotaev   [PATCH] O(1) sb l...
608

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
609
  	spin_lock(&sb_lock);
618f06362   Kirill Korotaev   [PATCH] O(1) sb l...
610
611
  rescan:
  	list_for_each_entry(sb, &super_blocks, s_list) {
a5166169f   Al Viro   vfs: convert fs_s...
612
  		if (hlist_unhashed(&sb->s_instances))
551de6f34   Al Viro   Leave superblocks...
613
  			continue;
618f06362   Kirill Korotaev   [PATCH] O(1) sb l...
614
615
  		if (sb->s_bdev == bdev) {
  			sb->s_count++;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
616
  			spin_unlock(&sb_lock);
618f06362   Kirill Korotaev   [PATCH] O(1) sb l...
617
  			down_read(&sb->s_umount);
df40c01a9   Al Viro   In get_super() an...
618
  			/* still alive? */
dabe0dc19   Al Viro   vfs: fix the rest...
619
  			if (sb->s_root && (sb->s_flags & MS_BORN))
618f06362   Kirill Korotaev   [PATCH] O(1) sb l...
620
621
  				return sb;
  			up_read(&sb->s_umount);
df40c01a9   Al Viro   In get_super() an...
622
  			/* nope, got unmounted */
618f06362   Kirill Korotaev   [PATCH] O(1) sb l...
623
  			spin_lock(&sb_lock);
df40c01a9   Al Viro   In get_super() an...
624
625
  			__put_super(sb);
  			goto rescan;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
626
627
628
629
630
631
632
  		}
  	}
  	spin_unlock(&sb_lock);
  	return NULL;
  }
  
  EXPORT_SYMBOL(get_super);
4504230a7   Christoph Hellwig   freeze_bdev: grab...
633
634
  
  /**
6b6dc836a   Jan Kara   vfs: Provide func...
635
636
637
638
639
640
641
642
643
644
645
646
   *	get_super_thawed - get thawed superblock of a device
   *	@bdev: device to get the superblock for
   *
   *	Scans the superblock list and finds the superblock of the file system
   *	mounted on the device. The superblock is returned once it is thawed
   *	(or immediately if it was not frozen). %NULL is returned if no match
   *	is found.
   */
  struct super_block *get_super_thawed(struct block_device *bdev)
  {
  	while (1) {
  		struct super_block *s = get_super(bdev);
5accdf82b   Jan Kara   fs: Improve files...
647
  		if (!s || s->s_writers.frozen == SB_UNFROZEN)
6b6dc836a   Jan Kara   vfs: Provide func...
648
649
  			return s;
  		up_read(&s->s_umount);
5accdf82b   Jan Kara   fs: Improve files...
650
651
  		wait_event(s->s_writers.wait_unfrozen,
  			   s->s_writers.frozen == SB_UNFROZEN);
6b6dc836a   Jan Kara   vfs: Provide func...
652
653
654
655
656
657
  		put_super(s);
  	}
  }
  EXPORT_SYMBOL(get_super_thawed);
  
  /**
4504230a7   Christoph Hellwig   freeze_bdev: grab...
658
659
660
661
662
   * 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...
663
   * reference or %NULL if none was found.
4504230a7   Christoph Hellwig   freeze_bdev: grab...
664
665
666
667
668
669
670
   */
  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...
671
  restart:
4504230a7   Christoph Hellwig   freeze_bdev: grab...
672
673
  	spin_lock(&sb_lock);
  	list_for_each_entry(sb, &super_blocks, s_list) {
a5166169f   Al Viro   vfs: convert fs_s...
674
  		if (hlist_unhashed(&sb->s_instances))
551de6f34   Al Viro   Leave superblocks...
675
  			continue;
1494583de   Al Viro   fix get_active_su...
676
677
678
679
680
681
  		if (sb->s_bdev == bdev) {
  			if (grab_super(sb)) /* drops sb_lock */
  				return sb;
  			else
  				goto restart;
  		}
4504230a7   Christoph Hellwig   freeze_bdev: grab...
682
683
684
685
  	}
  	spin_unlock(&sb_lock);
  	return NULL;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
686
   
df40c01a9   Al Viro   In get_super() an...
687
  struct super_block *user_get_super(dev_t dev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
688
  {
618f06362   Kirill Korotaev   [PATCH] O(1) sb l...
689
  	struct super_block *sb;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
690

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
691
  	spin_lock(&sb_lock);
618f06362   Kirill Korotaev   [PATCH] O(1) sb l...
692
693
  rescan:
  	list_for_each_entry(sb, &super_blocks, s_list) {
a5166169f   Al Viro   vfs: convert fs_s...
694
  		if (hlist_unhashed(&sb->s_instances))
551de6f34   Al Viro   Leave superblocks...
695
  			continue;
618f06362   Kirill Korotaev   [PATCH] O(1) sb l...
696
697
  		if (sb->s_dev ==  dev) {
  			sb->s_count++;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
698
  			spin_unlock(&sb_lock);
618f06362   Kirill Korotaev   [PATCH] O(1) sb l...
699
  			down_read(&sb->s_umount);
df40c01a9   Al Viro   In get_super() an...
700
  			/* still alive? */
dabe0dc19   Al Viro   vfs: fix the rest...
701
  			if (sb->s_root && (sb->s_flags & MS_BORN))
618f06362   Kirill Korotaev   [PATCH] O(1) sb l...
702
703
  				return sb;
  			up_read(&sb->s_umount);
df40c01a9   Al Viro   In get_super() an...
704
  			/* nope, got unmounted */
618f06362   Kirill Korotaev   [PATCH] O(1) sb l...
705
  			spin_lock(&sb_lock);
df40c01a9   Al Viro   In get_super() an...
706
707
  			__put_super(sb);
  			goto rescan;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
708
709
710
711
712
  		}
  	}
  	spin_unlock(&sb_lock);
  	return NULL;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
713
  /**
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
714
715
716
717
718
719
720
721
722
723
724
   *	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...
725
  	int remount_ro;
4504230a7   Christoph Hellwig   freeze_bdev: grab...
726

5accdf82b   Jan Kara   fs: Improve files...
727
  	if (sb->s_writers.frozen != SB_UNFROZEN)
4504230a7   Christoph Hellwig   freeze_bdev: grab...
728
  		return -EBUSY;
9361401eb   David Howells   [PATCH] BLOCK: Ma...
729
  #ifdef CONFIG_BLOCK
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
730
731
  	if (!(flags & MS_RDONLY) && bdev_read_only(sb->s_bdev))
  		return -EACCES;
9361401eb   David Howells   [PATCH] BLOCK: Ma...
732
  #endif
4504230a7   Christoph Hellwig   freeze_bdev: grab...
733

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
734
735
736
  	if (flags & MS_RDONLY)
  		acct_auto_close(sb);
  	shrink_dcache_sb(sb);
60b0680fa   Jan Kara   vfs: Rename fsync...
737
  	sync_filesystem(sb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
738

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

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
741
742
  	/* 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...
743
  	if (remount_ro) {
4ed5e82fe   Miklos Szeredi   vfs: protect remo...
744
  		if (force) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
745
  			mark_files_ro(sb);
4ed5e82fe   Miklos Szeredi   vfs: protect remo...
746
747
748
749
  		} else {
  			retval = sb_prepare_remount_readonly(sb);
  			if (retval)
  				return retval;
4ed5e82fe   Miklos Szeredi   vfs: protect remo...
750
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
751
752
753
  	}
  
  	if (sb->s_op->remount_fs) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
754
  		retval = sb->s_op->remount_fs(sb, &flags, data);
2833eb2b4   Miklos Szeredi   vfs: ignore error...
755
756
  		if (retval) {
  			if (!force)
4ed5e82fe   Miklos Szeredi   vfs: protect remo...
757
  				goto cancel_readonly;
2833eb2b4   Miklos Szeredi   vfs: ignore error...
758
759
760
761
762
  			/* 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
763
764
  	}
  	sb->s_flags = (sb->s_flags & ~MS_RMT_MASK) | (flags & MS_RMT_MASK);
4ed5e82fe   Miklos Szeredi   vfs: protect remo...
765
766
767
  	/* Needs to be ordered wrt mnt_is_readonly() */
  	smp_wmb();
  	sb->s_readonly_remount = 0;
c79d967de   Christoph Hellwig   quota: move remou...
768

d208bbdda   Nick Piggin   fs: improve remou...
769
770
771
772
773
774
775
776
777
778
  	/*
  	 * 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
779
  	return 0;
4ed5e82fe   Miklos Szeredi   vfs: protect remo...
780
781
782
783
  
  cancel_readonly:
  	sb->s_readonly_remount = 0;
  	return retval;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
784
  }
a2a9537ac   Jens Axboe   Get rid of pdflus...
785
  static void do_emergency_remount(struct work_struct *work)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
786
  {
dca332528   Al Viro   no need for list_...
787
  	struct super_block *sb, *p = NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
788
789
  
  	spin_lock(&sb_lock);
dca332528   Al Viro   no need for list_...
790
  	list_for_each_entry(sb, &super_blocks, s_list) {
a5166169f   Al Viro   vfs: convert fs_s...
791
  		if (hlist_unhashed(&sb->s_instances))
551de6f34   Al Viro   Leave superblocks...
792
  			continue;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
793
794
  		sb->s_count++;
  		spin_unlock(&sb_lock);
443b94baa   Al Viro   Make sure that al...
795
  		down_write(&sb->s_umount);
dabe0dc19   Al Viro   vfs: fix the rest...
796
797
  		if (sb->s_root && sb->s_bdev && (sb->s_flags & MS_BORN) &&
  		    !(sb->s_flags & MS_RDONLY)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
798
  			/*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
799
800
  			 * What lock protects sb->s_flags??
  			 */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
801
  			do_remount_sb(sb, MS_RDONLY, NULL, 1);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
802
  		}
443b94baa   Al Viro   Make sure that al...
803
  		up_write(&sb->s_umount);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
804
  		spin_lock(&sb_lock);
dca332528   Al Viro   no need for list_...
805
806
807
  		if (p)
  			__put_super(p);
  		p = sb;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
808
  	}
dca332528   Al Viro   no need for list_...
809
810
  	if (p)
  		__put_super(p);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
811
  	spin_unlock(&sb_lock);
a2a9537ac   Jens Axboe   Get rid of pdflus...
812
  	kfree(work);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
813
814
815
816
817
818
  	printk("Emergency Remount complete
  ");
  }
  
  void emergency_remount(void)
  {
a2a9537ac   Jens Axboe   Get rid of pdflus...
819
820
821
822
823
824
825
  	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
826
827
828
829
830
831
  }
  
  /*
   * 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...
832
  static DEFINE_IDA(unnamed_dev_ida);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
833
  static DEFINE_SPINLOCK(unnamed_dev_lock);/* protects the above */
c63e09ecc   Al Viro   Make allocation o...
834
  static int unnamed_dev_start = 0; /* don't bother trying below it */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
835

0ee5dc676   Al Viro   btrfs: kill magic...
836
  int get_anon_bdev(dev_t *p)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
837
838
839
840
841
  {
  	int dev;
  	int error;
  
   retry:
ad76cbc63   Alexey Dobriyan   [PATCH 2/2] anond...
842
  	if (ida_pre_get(&unnamed_dev_ida, GFP_ATOMIC) == 0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
843
844
  		return -ENOMEM;
  	spin_lock(&unnamed_dev_lock);
c63e09ecc   Al Viro   Make allocation o...
845
  	error = ida_get_new_above(&unnamed_dev_ida, unnamed_dev_start, &dev);
f21f62208   Al Viro   ... and the same ...
846
847
  	if (!error)
  		unnamed_dev_start = dev + 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
848
849
850
851
852
853
854
855
856
  	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...
857
  		ida_remove(&unnamed_dev_ida, dev);
f21f62208   Al Viro   ... and the same ...
858
859
  		if (unnamed_dev_start > dev)
  			unnamed_dev_start = dev;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
860
861
862
  		spin_unlock(&unnamed_dev_lock);
  		return -EMFILE;
  	}
0ee5dc676   Al Viro   btrfs: kill magic...
863
  	*p = MKDEV(0, dev & MINORMASK);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
864
865
  	return 0;
  }
0ee5dc676   Al Viro   btrfs: kill magic...
866
  EXPORT_SYMBOL(get_anon_bdev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
867

0ee5dc676   Al Viro   btrfs: kill magic...
868
  void free_anon_bdev(dev_t dev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
869
  {
0ee5dc676   Al Viro   btrfs: kill magic...
870
  	int slot = MINOR(dev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
871
  	spin_lock(&unnamed_dev_lock);
ad76cbc63   Alexey Dobriyan   [PATCH 2/2] anond...
872
  	ida_remove(&unnamed_dev_ida, slot);
c63e09ecc   Al Viro   Make allocation o...
873
874
  	if (slot < unnamed_dev_start)
  		unnamed_dev_start = slot;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
875
876
  	spin_unlock(&unnamed_dev_lock);
  }
0ee5dc676   Al Viro   btrfs: kill magic...
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
  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
895
896
  
  EXPORT_SYMBOL(kill_anon_super);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
897
898
899
900
901
902
903
904
  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 ...
905
906
907
908
909
910
911
912
913
914
  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(...
915
916
  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 ...
917
918
  {
  	struct super_block *sb;
9249e17fe   David Howells   VFS: Pass mount f...
919
  	sb = sget(fs_type, ns_test_super, ns_set_super, flags, data);
909e6d947   Serge E. Hallyn   namespaces: move ...
920
  	if (IS_ERR(sb))
ceefda693   Al Viro   switch get_sb_ns(...
921
  		return ERR_CAST(sb);
909e6d947   Serge E. Hallyn   namespaces: move ...
922
923
924
  
  	if (!sb->s_root) {
  		int err;
909e6d947   Serge E. Hallyn   namespaces: move ...
925
926
  		err = fill_super(sb, data, flags & MS_SILENT ? 1 : 0);
  		if (err) {
74dbbdd7f   Al Viro   New helper: deact...
927
  			deactivate_locked_super(sb);
ceefda693   Al Viro   switch get_sb_ns(...
928
  			return ERR_PTR(err);
909e6d947   Serge E. Hallyn   namespaces: move ...
929
930
931
932
  		}
  
  		sb->s_flags |= MS_ACTIVE;
  	}
ceefda693   Al Viro   switch get_sb_ns(...
933
  	return dget(sb->s_root);
909e6d947   Serge E. Hallyn   namespaces: move ...
934
  }
ceefda693   Al Viro   switch get_sb_ns(...
935
  EXPORT_SYMBOL(mount_ns);
909e6d947   Serge E. Hallyn   namespaces: move ...
936

9361401eb   David Howells   [PATCH] BLOCK: Ma...
937
  #ifdef CONFIG_BLOCK
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
938
939
940
941
  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...
942
943
944
945
946
947
  
  	/*
  	 * 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
948
949
950
951
952
953
954
  	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...
955
  struct dentry *mount_bdev(struct file_system_type *fs_type,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
956
  	int flags, const char *dev_name, void *data,
152a08366   Al Viro   new helper: mount...
957
  	int (*fill_super)(struct super_block *, void *, int))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
958
959
960
  {
  	struct block_device *bdev;
  	struct super_block *s;
d4d776299   Tejun Heo   block: clean up b...
961
  	fmode_t mode = FMODE_READ | FMODE_EXCL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
962
  	int error = 0;
30c40d2c0   Al Viro   [PATCH] propagate...
963
964
  	if (!(flags & MS_RDONLY))
  		mode |= FMODE_WRITE;
d4d776299   Tejun Heo   block: clean up b...
965
  	bdev = blkdev_get_by_path(dev_name, mode, fs_type);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
966
  	if (IS_ERR(bdev))
152a08366   Al Viro   new helper: mount...
967
  		return ERR_CAST(bdev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
968
969
970
971
972
973
  
  	/*
  	 * 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...
974
975
976
977
978
979
  	mutex_lock(&bdev->bd_fsfreeze_mutex);
  	if (bdev->bd_fsfreeze_count > 0) {
  		mutex_unlock(&bdev->bd_fsfreeze_mutex);
  		error = -EBUSY;
  		goto error_bdev;
  	}
9249e17fe   David Howells   VFS: Pass mount f...
980
981
  	s = sget(fs_type, test_bdev_super, set_bdev_super, flags | MS_NOSEC,
  		 bdev);
4fadd7bb2   Christoph Hellwig   freeze_bdev: kill...
982
  	mutex_unlock(&bdev->bd_fsfreeze_mutex);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
983
  	if (IS_ERR(s))
454e2398b   David Howells   [PATCH] VFS: Perm...
984
  		goto error_s;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
985
986
987
  
  	if (s->s_root) {
  		if ((flags ^ s->s_flags) & MS_RDONLY) {
74dbbdd7f   Al Viro   New helper: deact...
988
  			deactivate_locked_super(s);
454e2398b   David Howells   [PATCH] VFS: Perm...
989
990
  			error = -EBUSY;
  			goto error_bdev;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
991
  		}
454e2398b   David Howells   [PATCH] VFS: Perm...
992

4f331f01b   Tejun Heo   vfs: don't hold s...
993
994
  		/*
  		 * s_umount nests inside bd_mutex during
e525fd89d   Tejun Heo   block: make blkde...
995
996
997
998
  		 * __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...
999
1000
  		 */
  		up_write(&s->s_umount);
d4d776299   Tejun Heo   block: clean up b...
1001
  		blkdev_put(bdev, mode);
4f331f01b   Tejun Heo   vfs: don't hold s...
1002
  		down_write(&s->s_umount);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1003
1004
  	} else {
  		char b[BDEVNAME_SIZE];
30c40d2c0   Al Viro   [PATCH] propagate...
1005
  		s->s_mode = mode;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1006
  		strlcpy(s->s_id, bdevname(bdev, b), sizeof(s->s_id));
e78c9a004   Pekka Enberg   [PATCH] fs: remov...
1007
  		sb_set_blocksize(s, block_size(bdev));
9b04c997b   Theodore Ts'o   [PATCH] vfs: MS_V...
1008
  		error = fill_super(s, data, flags & MS_SILENT ? 1 : 0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1009
  		if (error) {
74dbbdd7f   Al Viro   New helper: deact...
1010
  			deactivate_locked_super(s);
454e2398b   David Howells   [PATCH] VFS: Perm...
1011
  			goto error;
fa675765a   Greg Kroah-Hartman   Revert mount/umou...
1012
  		}
454e2398b   David Howells   [PATCH] VFS: Perm...
1013
1014
  
  		s->s_flags |= MS_ACTIVE;
87d8fe1ee   Theodore Ts'o   add releasepage h...
1015
  		bdev->bd_super = s;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1016
  	}
152a08366   Al Viro   new helper: mount...
1017
  	return dget(s->s_root);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1018

454e2398b   David Howells   [PATCH] VFS: Perm...
1019
1020
1021
  error_s:
  	error = PTR_ERR(s);
  error_bdev:
d4d776299   Tejun Heo   block: clean up b...
1022
  	blkdev_put(bdev, mode);
454e2398b   David Howells   [PATCH] VFS: Perm...
1023
  error:
152a08366   Al Viro   new helper: mount...
1024
1025
1026
  	return ERR_PTR(error);
  }
  EXPORT_SYMBOL(mount_bdev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1027
1028
1029
  void kill_block_super(struct super_block *sb)
  {
  	struct block_device *bdev = sb->s_bdev;
30c40d2c0   Al Viro   [PATCH] propagate...
1030
  	fmode_t mode = sb->s_mode;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1031

ddbaaf302   H Hartley Sweeten   NULL noise in fs/...
1032
  	bdev->bd_super = NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1033
1034
  	generic_shutdown_super(sb);
  	sync_blockdev(bdev);
d4d776299   Tejun Heo   block: clean up b...
1035
  	WARN_ON_ONCE(!(mode & FMODE_EXCL));
e525fd89d   Tejun Heo   block: make blkde...
1036
  	blkdev_put(bdev, mode | FMODE_EXCL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1037
1038
1039
  }
  
  EXPORT_SYMBOL(kill_block_super);
9361401eb   David Howells   [PATCH] BLOCK: Ma...
1040
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1041

3c26ff6e4   Al Viro   convert get_sb_no...
1042
  struct dentry *mount_nodev(struct file_system_type *fs_type,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1043
  	int flags, void *data,
3c26ff6e4   Al Viro   convert get_sb_no...
1044
  	int (*fill_super)(struct super_block *, void *, int))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1045
1046
  {
  	int error;
9249e17fe   David Howells   VFS: Pass mount f...
1047
  	struct super_block *s = sget(fs_type, NULL, set_anon_super, flags, NULL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1048
1049
  
  	if (IS_ERR(s))
3c26ff6e4   Al Viro   convert get_sb_no...
1050
  		return ERR_CAST(s);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1051

9b04c997b   Theodore Ts'o   [PATCH] vfs: MS_V...
1052
  	error = fill_super(s, data, flags & MS_SILENT ? 1 : 0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1053
  	if (error) {
74dbbdd7f   Al Viro   New helper: deact...
1054
  		deactivate_locked_super(s);
3c26ff6e4   Al Viro   convert get_sb_no...
1055
  		return ERR_PTR(error);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1056
1057
  	}
  	s->s_flags |= MS_ACTIVE;
3c26ff6e4   Al Viro   convert get_sb_no...
1058
  	return dget(s->s_root);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1059
  }
3c26ff6e4   Al Viro   convert get_sb_no...
1060
  EXPORT_SYMBOL(mount_nodev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1061
1062
1063
1064
  static int compare_single(struct super_block *s, void *p)
  {
  	return 1;
  }
fc14f2fef   Al Viro   convert get_sb_si...
1065
  struct dentry *mount_single(struct file_system_type *fs_type,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1066
  	int flags, void *data,
fc14f2fef   Al Viro   convert get_sb_si...
1067
  	int (*fill_super)(struct super_block *, void *, int))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1068
1069
1070
  {
  	struct super_block *s;
  	int error;
9249e17fe   David Howells   VFS: Pass mount f...
1071
  	s = sget(fs_type, compare_single, set_anon_super, flags, NULL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1072
  	if (IS_ERR(s))
fc14f2fef   Al Viro   convert get_sb_si...
1073
  		return ERR_CAST(s);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1074
  	if (!s->s_root) {
9b04c997b   Theodore Ts'o   [PATCH] vfs: MS_V...
1075
  		error = fill_super(s, data, flags & MS_SILENT ? 1 : 0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1076
  		if (error) {
74dbbdd7f   Al Viro   New helper: deact...
1077
  			deactivate_locked_super(s);
fc14f2fef   Al Viro   convert get_sb_si...
1078
  			return ERR_PTR(error);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1079
1080
  		}
  		s->s_flags |= MS_ACTIVE;
9329d1bea   Kay Sievers   vfs: get_sb_singl...
1081
1082
  	} else {
  		do_remount_sb(s, flags, data, 0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1083
  	}
fc14f2fef   Al Viro   convert get_sb_si...
1084
1085
1086
  	return dget(s->s_root);
  }
  EXPORT_SYMBOL(mount_single);
9d412a43c   Al Viro   vfs: split off vf...
1087
1088
  struct dentry *
  mount_fs(struct file_system_type *type, int flags, const char *name, void *data)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1089
  {
c96e41e92   Al Viro   beginning of tran...
1090
  	struct dentry *root;
9d412a43c   Al Viro   vfs: split off vf...
1091
  	struct super_block *sb;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1092
  	char *secdata = NULL;
9d412a43c   Al Viro   vfs: split off vf...
1093
  	int error = -ENOMEM;
8089352a1   Al Viro   Mirror MS_KERNMOU...
1094

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

e00075298   Eric Paris   LSM/SELinux: Inte...
1100
  		error = security_sb_copy_data(data, secdata);
454e2398b   David Howells   [PATCH] VFS: Perm...
1101
  		if (error)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1102
  			goto out_free_secdata;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1103
  	}
1a102ff92   Al Viro   vfs: bury ->get_sb()
1104
1105
1106
1107
  	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...
1108
  	}
9d412a43c   Al Viro   vfs: split off vf...
1109
1110
1111
  	sb = root->d_sb;
  	BUG_ON(!sb);
  	WARN_ON(!sb->s_bdi);
6c5103890   Linus Torvalds   Merge branch 'for...
1112
  	WARN_ON(sb->s_bdi == &default_backing_dev_info);
9d412a43c   Al Viro   vfs: split off vf...
1113
  	sb->s_flags |= MS_BORN;
454e2398b   David Howells   [PATCH] VFS: Perm...
1114

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

42cb56ae2   Jeff Layton   vfs: change sb->s...
1119
1120
1121
1122
  	/*
  	 * 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...
1123
  	 * violate this rule.
42cb56ae2   Jeff Layton   vfs: change sb->s...
1124
  	 */
9d412a43c   Al Viro   vfs: split off vf...
1125
1126
1127
  	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...
1128

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

18e9e5104   Josef Bacik   Introduce freeze_...
1328
1329
1330
1331
1332
1333
  	if (sb->s_op->freeze_fs) {
  		ret = sb->s_op->freeze_fs(sb);
  		if (ret) {
  			printk(KERN_ERR
  				"VFS:Filesystem freeze failed
  ");
5accdf82b   Jan Kara   fs: Improve files...
1334
  			sb->s_writers.frozen = SB_UNFROZEN;
e1616300a   Kazuya Mio   wake up s_wait_un...
1335
  			smp_wmb();
5accdf82b   Jan Kara   fs: Improve files...
1336
  			wake_up(&sb->s_writers.wait_unfrozen);
18e9e5104   Josef Bacik   Introduce freeze_...
1337
1338
1339
1340
  			deactivate_locked_super(sb);
  			return ret;
  		}
  	}
5accdf82b   Jan Kara   fs: Improve files...
1341
1342
1343
1344
1345
  	/*
  	 * This is just for debugging purposes so that fs can warn if it
  	 * sees write activity when frozen is set to SB_FREEZE_COMPLETE.
  	 */
  	sb->s_writers.frozen = SB_FREEZE_COMPLETE;
18e9e5104   Josef Bacik   Introduce freeze_...
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
  	up_write(&sb->s_umount);
  	return 0;
  }
  EXPORT_SYMBOL(freeze_super);
  
  /**
   * thaw_super -- unlock filesystem
   * @sb: the super to thaw
   *
   * Unlocks the filesystem and marks it writeable again after freeze_super().
   */
  int thaw_super(struct super_block *sb)
  {
  	int error;
  
  	down_write(&sb->s_umount);
5accdf82b   Jan Kara   fs: Improve files...
1362
  	if (sb->s_writers.frozen == SB_UNFROZEN) {
18e9e5104   Josef Bacik   Introduce freeze_...
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
  		up_write(&sb->s_umount);
  		return -EINVAL;
  	}
  
  	if (sb->s_flags & MS_RDONLY)
  		goto out;
  
  	if (sb->s_op->unfreeze_fs) {
  		error = sb->s_op->unfreeze_fs(sb);
  		if (error) {
  			printk(KERN_ERR
  				"VFS:Filesystem thaw failed
  ");
18e9e5104   Josef Bacik   Introduce freeze_...
1376
1377
1378
1379
1380
1381
  			up_write(&sb->s_umount);
  			return error;
  		}
  	}
  
  out:
5accdf82b   Jan Kara   fs: Improve files...
1382
  	sb->s_writers.frozen = SB_UNFROZEN;
18e9e5104   Josef Bacik   Introduce freeze_...
1383
  	smp_wmb();
5accdf82b   Jan Kara   fs: Improve files...
1384
  	wake_up(&sb->s_writers.wait_unfrozen);
18e9e5104   Josef Bacik   Introduce freeze_...
1385
1386
1387
1388
1389
  	deactivate_locked_super(sb);
  
  	return 0;
  }
  EXPORT_SYMBOL(thaw_super);