Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]
Version: [ 2.6.11.8 ] [ 2.6.25 ] [ 2.6.25.8 ] [ 2.6.31.13 ] Architecture: [ i386 ]

Diff markup

Differences between /linux/fs/super.c (Version 2.6.31.13) and /linux/fs/super.c (Version 2.6.11.8)


  1 /*                                                  1 /*
  2  *  linux/fs/super.c                                2  *  linux/fs/super.c
  3  *                                                  3  *
  4  *  Copyright (C) 1991, 1992  Linus Torvalds        4  *  Copyright (C) 1991, 1992  Linus Torvalds
  5  *                                                  5  *
  6  *  super.c contains code to handle: - mount s      6  *  super.c contains code to handle: - mount structures
  7  *                                   - super-b      7  *                                   - super-block tables
  8  *                                   - filesys      8  *                                   - filesystem drivers list
  9  *                                   - mount s      9  *                                   - mount system call
 10  *                                   - umount      10  *                                   - umount system call
 11  *                                   - ustat s     11  *                                   - ustat system call
 12  *                                                 12  *
 13  * GK 2/5/95  -  Changed to support mounting t     13  * GK 2/5/95  -  Changed to support mounting the root fs via NFS
 14  *                                                 14  *
 15  *  Added kerneld support: Jacques Gelinas and     15  *  Added kerneld support: Jacques Gelinas and Bjorn Ekwall
 16  *  Added change_root: Werner Almesberger & Ha     16  *  Added change_root: Werner Almesberger & Hans Lermen, Feb '96
 17  *  Added options to /proc/mounts:                 17  *  Added options to /proc/mounts:
 18  *    Torbjörn Lindh (torbjorn.lindh@gopta.se !!  18  *    Torbjörn Lindh (torbjorn.lindh@gopta.se), April 14, 1996.
 19  *  Added devfs support: Richard Gooch <rgooch     19  *  Added devfs support: Richard Gooch <rgooch@atnf.csiro.au>, 13-JAN-1998
 20  *  Heavily rewritten for 'one fs - one tree'      20  *  Heavily rewritten for 'one fs - one tree' dcache architecture. AV, Mar 2000
 21  */                                                21  */
 22                                                    22 
                                                   >>  23 #include <linux/config.h>
 23 #include <linux/module.h>                          24 #include <linux/module.h>
 24 #include <linux/slab.h>                            25 #include <linux/slab.h>
 25 #include <linux/init.h>                            26 #include <linux/init.h>
 26 #include <linux/smp_lock.h>                        27 #include <linux/smp_lock.h>
 27 #include <linux/acct.h>                            28 #include <linux/acct.h>
 28 #include <linux/blkdev.h>                          29 #include <linux/blkdev.h>
 29 #include <linux/quotaops.h>                        30 #include <linux/quotaops.h>
 30 #include <linux/namei.h>                           31 #include <linux/namei.h>
                                                   >>  32 #include <linux/buffer_head.h>          /* for fsync_super() */
 31 #include <linux/mount.h>                           33 #include <linux/mount.h>
 32 #include <linux/security.h>                        34 #include <linux/security.h>
 33 #include <linux/syscalls.h>                        35 #include <linux/syscalls.h>
 34 #include <linux/vfs.h>                             36 #include <linux/vfs.h>
 35 #include <linux/writeback.h>            /* for     37 #include <linux/writeback.h>            /* for the emergency remount stuff */
 36 #include <linux/idr.h>                             38 #include <linux/idr.h>
 37 #include <linux/kobject.h>                         39 #include <linux/kobject.h>
 38 #include <linux/mutex.h>                       << 
 39 #include <linux/file.h>                        << 
 40 #include <asm/uaccess.h>                           40 #include <asm/uaccess.h>
 41 #include "internal.h"                          << 
 42                                                    41 
 43                                                    42 
                                                   >>  43 void get_filesystem(struct file_system_type *fs);
                                                   >>  44 void put_filesystem(struct file_system_type *fs);
                                                   >>  45 struct file_system_type *get_fs_type(const char *name);
                                                   >>  46 
 44 LIST_HEAD(super_blocks);                           47 LIST_HEAD(super_blocks);
 45 DEFINE_SPINLOCK(sb_lock);                          48 DEFINE_SPINLOCK(sb_lock);
 46                                                    49 
 47 /**                                                50 /**
 48  *      alloc_super     -       create new sup     51  *      alloc_super     -       create new superblock
 49  *      @type:  filesystem type superblock sho << 
 50  *                                                 52  *
 51  *      Allocates and initializes a new &struc     53  *      Allocates and initializes a new &struct super_block.  alloc_super()
 52  *      returns a pointer new superblock or %N     54  *      returns a pointer new superblock or %NULL if allocation had failed.
 53  */                                                55  */
 54 static struct super_block *alloc_super(struct  !!  56 static struct super_block *alloc_super(void)
 55 {                                                  57 {
 56         struct super_block *s = kzalloc(sizeof !!  58         struct super_block *s = kmalloc(sizeof(struct super_block),  GFP_USER);
 57         static struct super_operations default     59         static struct super_operations default_op;
 58                                                    60 
 59         if (s) {                                   61         if (s) {
                                                   >>  62                 memset(s, 0, sizeof(struct super_block));
 60                 if (security_sb_alloc(s)) {        63                 if (security_sb_alloc(s)) {
 61                         kfree(s);                  64                         kfree(s);
 62                         s = NULL;                  65                         s = NULL;
 63                         goto out;                  66                         goto out;
 64                 }                                  67                 }
 65                 INIT_LIST_HEAD(&s->s_dirty);       68                 INIT_LIST_HEAD(&s->s_dirty);
 66                 INIT_LIST_HEAD(&s->s_io);          69                 INIT_LIST_HEAD(&s->s_io);
 67                 INIT_LIST_HEAD(&s->s_more_io); << 
 68                 INIT_LIST_HEAD(&s->s_files);       70                 INIT_LIST_HEAD(&s->s_files);
 69                 INIT_LIST_HEAD(&s->s_instances     71                 INIT_LIST_HEAD(&s->s_instances);
 70                 INIT_HLIST_HEAD(&s->s_anon);       72                 INIT_HLIST_HEAD(&s->s_anon);
 71                 INIT_LIST_HEAD(&s->s_inodes);      73                 INIT_LIST_HEAD(&s->s_inodes);
 72                 INIT_LIST_HEAD(&s->s_dentry_lr << 
 73                 init_rwsem(&s->s_umount);          74                 init_rwsem(&s->s_umount);
 74                 mutex_init(&s->s_lock);        !!  75                 sema_init(&s->s_lock, 1);
 75                 lockdep_set_class(&s->s_umount !!  76                 down_write(&s->s_umount);
 76                 /*                             << 
 77                  * The locking rules for s_loc << 
 78                  * filesystem. For example ext << 
 79                  * lock ordering than usbfs:   << 
 80                  */                            << 
 81                 lockdep_set_class(&s->s_lock,  << 
 82                 /*                             << 
 83                  * sget() can have s_umount re << 
 84                  *                             << 
 85                  * When it cannot find a suita << 
 86                  * one (this one), and tries a << 
 87                  * one.                        << 
 88                  *                             << 
 89                  * In case that succeeds, it w << 
 90                  * lock of the old one. Since  << 
 91                  * locks, and this object isn' << 
 92                  * risk of deadlocks.          << 
 93                  *                             << 
 94                  * Annotate this by putting th << 
 95                  * subclass.                   << 
 96                  */                            << 
 97                 down_write_nested(&s->s_umount << 
 98                 s->s_count = S_BIAS;               77                 s->s_count = S_BIAS;
 99                 atomic_set(&s->s_active, 1);       78                 atomic_set(&s->s_active, 1);
100                 mutex_init(&s->s_vfs_rename_mu !!  79                 sema_init(&s->s_vfs_rename_sem,1);
101                 mutex_init(&s->s_dquot.dqio_mu !!  80                 sema_init(&s->s_dquot.dqio_sem, 1);
102                 mutex_init(&s->s_dquot.dqonoff !!  81                 sema_init(&s->s_dquot.dqonoff_sem, 1);
103                 init_rwsem(&s->s_dquot.dqptr_s     82                 init_rwsem(&s->s_dquot.dqptr_sem);
104                 init_waitqueue_head(&s->s_wait     83                 init_waitqueue_head(&s->s_wait_unfrozen);
105                 s->s_maxbytes = MAX_NON_LFS;       84                 s->s_maxbytes = MAX_NON_LFS;
106                 s->dq_op = sb_dquot_ops;           85                 s->dq_op = sb_dquot_ops;
107                 s->s_qcop = sb_quotactl_ops;       86                 s->s_qcop = sb_quotactl_ops;
108                 s->s_op = &default_op;             87                 s->s_op = &default_op;
109                 s->s_time_gran = 1000000000;       88                 s->s_time_gran = 1000000000;
110         }                                          89         }
111 out:                                               90 out:
112         return s;                                  91         return s;
113 }                                                  92 }
114                                                    93 
115 /**                                                94 /**
116  *      destroy_super   -       frees a superb     95  *      destroy_super   -       frees a superblock
117  *      @s: superblock to free                     96  *      @s: superblock to free
118  *                                                 97  *
119  *      Frees a superblock.                        98  *      Frees a superblock.
120  */                                                99  */
121 static inline void destroy_super(struct super_    100 static inline void destroy_super(struct super_block *s)
122 {                                                 101 {
123         security_sb_free(s);                      102         security_sb_free(s);
124         kfree(s->s_subtype);                   << 
125         kfree(s->s_options);                   << 
126         kfree(s);                                 103         kfree(s);
127 }                                                 104 }
128                                                   105 
129 /* Superblock refcounting  */                     106 /* Superblock refcounting  */
130                                                   107 
131 /*                                                108 /*
132  * Drop a superblock's refcount.  Returns non-    109  * Drop a superblock's refcount.  Returns non-zero if the superblock was
133  * destroyed.  The caller must hold sb_lock.      110  * destroyed.  The caller must hold sb_lock.
134  */                                               111  */
135 static int __put_super(struct super_block *sb) !! 112 int __put_super(struct super_block *sb)
136 {                                                 113 {
137         int ret = 0;                              114         int ret = 0;
138                                                   115 
139         if (!--sb->s_count) {                     116         if (!--sb->s_count) {
140                 destroy_super(sb);                117                 destroy_super(sb);
141                 ret = 1;                          118                 ret = 1;
142         }                                         119         }
143         return ret;                               120         return ret;
144 }                                                 121 }
145                                                   122 
146 /*                                                123 /*
147  * Drop a superblock's refcount.                  124  * Drop a superblock's refcount.
148  * Returns non-zero if the superblock is about    125  * Returns non-zero if the superblock is about to be destroyed and
149  * at least is already removed from super_bloc    126  * at least is already removed from super_blocks list, so if we are
150  * making a loop through super blocks then we     127  * making a loop through super blocks then we need to restart.
151  * The caller must hold sb_lock.                  128  * The caller must hold sb_lock.
152  */                                               129  */
153 int __put_super_and_need_restart(struct super_    130 int __put_super_and_need_restart(struct super_block *sb)
154 {                                                 131 {
155         /* check for race with generic_shutdow    132         /* check for race with generic_shutdown_super() */
156         if (list_empty(&sb->s_list)) {            133         if (list_empty(&sb->s_list)) {
157                 /* super block is removed, nee    134                 /* super block is removed, need to restart... */
158                 __put_super(sb);                  135                 __put_super(sb);
159                 return 1;                         136                 return 1;
160         }                                         137         }
161         /* can't be the last, since s_list is     138         /* can't be the last, since s_list is still in use */
162         sb->s_count--;                            139         sb->s_count--;
163         BUG_ON(sb->s_count == 0);                 140         BUG_ON(sb->s_count == 0);
164         return 0;                                 141         return 0;
165 }                                                 142 }
166                                                   143 
167 /**                                               144 /**
168  *      put_super       -       drop a tempora    145  *      put_super       -       drop a temporary reference to superblock
169  *      @sb: superblock in question            !! 146  *      @s: superblock in question
170  *                                                147  *
171  *      Drops a temporary reference, frees sup    148  *      Drops a temporary reference, frees superblock if there's no
172  *      references left.                          149  *      references left.
173  */                                               150  */
174 static void put_super(struct super_block *sb)     151 static void put_super(struct super_block *sb)
175 {                                                 152 {
176         spin_lock(&sb_lock);                      153         spin_lock(&sb_lock);
177         __put_super(sb);                          154         __put_super(sb);
178         spin_unlock(&sb_lock);                    155         spin_unlock(&sb_lock);
179 }                                                 156 }
180                                                   157 
181                                                   158 
182 /**                                               159 /**
183  *      deactivate_super        -       drop a    160  *      deactivate_super        -       drop an active reference to superblock
184  *      @s: superblock to deactivate              161  *      @s: superblock to deactivate
185  *                                                162  *
186  *      Drops an active reference to superbloc    163  *      Drops an active reference to superblock, acquiring a temprory one if
187  *      there is no active references left.  I    164  *      there is no active references left.  In that case we lock superblock,
188  *      tell fs driver to shut it down and dro    165  *      tell fs driver to shut it down and drop the temporary reference we
189  *      had just acquired.                        166  *      had just acquired.
190  */                                               167  */
191 void deactivate_super(struct super_block *s)      168 void deactivate_super(struct super_block *s)
192 {                                                 169 {
193         struct file_system_type *fs = s->s_typ    170         struct file_system_type *fs = s->s_type;
194         if (atomic_dec_and_lock(&s->s_active,     171         if (atomic_dec_and_lock(&s->s_active, &sb_lock)) {
195                 s->s_count -= S_BIAS-1;           172                 s->s_count -= S_BIAS-1;
196                 spin_unlock(&sb_lock);            173                 spin_unlock(&sb_lock);
197                 vfs_dq_off(s, 0);              << 
198                 down_write(&s->s_umount);         174                 down_write(&s->s_umount);
199                 fs->kill_sb(s);                   175                 fs->kill_sb(s);
200                 put_filesystem(fs);               176                 put_filesystem(fs);
201                 put_super(s);                     177                 put_super(s);
202         }                                         178         }
203 }                                                 179 }
204                                                   180 
205 EXPORT_SYMBOL(deactivate_super);                  181 EXPORT_SYMBOL(deactivate_super);
206                                                   182 
207 /**                                               183 /**
208  *      deactivate_locked_super -       drop a << 
209  *      @s: superblock to deactivate           << 
210  *                                             << 
211  *      Equivalent of up_write(&s->s_umount);  << 
212  *      it does not unlock it until it's all o << 
213  *      use to dispose of new superblock on -> << 
214  *      will see the sucker until it's all ove << 
215  *      deactivate_super is safe for that purp << 
216  *      safe to use or has NULL ->s_root when  << 
217  */                                            << 
218 void deactivate_locked_super(struct super_bloc << 
219 {                                              << 
220         struct file_system_type *fs = s->s_typ << 
221         if (atomic_dec_and_lock(&s->s_active,  << 
222                 s->s_count -= S_BIAS-1;        << 
223                 spin_unlock(&sb_lock);         << 
224                 vfs_dq_off(s, 0);              << 
225                 fs->kill_sb(s);                << 
226                 put_filesystem(fs);            << 
227                 put_super(s);                  << 
228         } else {                               << 
229                 up_write(&s->s_umount);        << 
230         }                                      << 
231 }                                              << 
232                                                << 
233 EXPORT_SYMBOL(deactivate_locked_super);        << 
234                                                << 
235 /**                                            << 
236  *      grab_super - acquire an active referen    184  *      grab_super - acquire an active reference
237  *      @s: reference we are trying to make ac    185  *      @s: reference we are trying to make active
238  *                                                186  *
239  *      Tries to acquire an active reference.     187  *      Tries to acquire an active reference.  grab_super() is used when we
240  *      had just found a superblock in super_b    188  *      had just found a superblock in super_blocks or fs_type->fs_supers
241  *      and want to turn it into a full-blown     189  *      and want to turn it into a full-blown active reference.  grab_super()
242  *      is called with sb_lock held and drops     190  *      is called with sb_lock held and drops it.  Returns 1 in case of
243  *      success, 0 if we had failed (superbloc    191  *      success, 0 if we had failed (superblock contents was already dead or
244  *      dying when grab_super() had been calle    192  *      dying when grab_super() had been called).
245  */                                               193  */
246 static int grab_super(struct super_block *s) _ !! 194 static int grab_super(struct super_block *s)
247 {                                                 195 {
248         s->s_count++;                             196         s->s_count++;
249         spin_unlock(&sb_lock);                    197         spin_unlock(&sb_lock);
250         down_write(&s->s_umount);                 198         down_write(&s->s_umount);
251         if (s->s_root) {                          199         if (s->s_root) {
252                 spin_lock(&sb_lock);              200                 spin_lock(&sb_lock);
253                 if (s->s_count > S_BIAS) {        201                 if (s->s_count > S_BIAS) {
254                         atomic_inc(&s->s_activ    202                         atomic_inc(&s->s_active);
255                         s->s_count--;             203                         s->s_count--;
256                         spin_unlock(&sb_lock);    204                         spin_unlock(&sb_lock);
257                         return 1;                 205                         return 1;
258                 }                                 206                 }
259                 spin_unlock(&sb_lock);            207                 spin_unlock(&sb_lock);
260         }                                         208         }
261         up_write(&s->s_umount);                   209         up_write(&s->s_umount);
262         put_super(s);                             210         put_super(s);
263         yield();                                  211         yield();
264         return 0;                                 212         return 0;
265 }                                                 213 }
266                                                   214 
267 /*                                             << 
268  * Superblock locking.  We really ought to get << 
269  */                                            << 
270 void lock_super(struct super_block * sb)       << 
271 {                                              << 
272         get_fs_excl();                         << 
273         mutex_lock(&sb->s_lock);               << 
274 }                                              << 
275                                                << 
276 void unlock_super(struct super_block * sb)     << 
277 {                                              << 
278         put_fs_excl();                         << 
279         mutex_unlock(&sb->s_lock);             << 
280 }                                              << 
281                                                << 
282 EXPORT_SYMBOL(lock_super);                     << 
283 EXPORT_SYMBOL(unlock_super);                   << 
284                                                << 
285 /**                                               215 /**
286  *      generic_shutdown_super  -       common    216  *      generic_shutdown_super  -       common helper for ->kill_sb()
287  *      @sb: superblock to kill                   217  *      @sb: superblock to kill
288  *                                                218  *
289  *      generic_shutdown_super() does all fs-i    219  *      generic_shutdown_super() does all fs-independent work on superblock
290  *      shutdown.  Typical ->kill_sb() should     220  *      shutdown.  Typical ->kill_sb() should pick all fs-specific objects
291  *      that need destruction out of superbloc    221  *      that need destruction out of superblock, call generic_shutdown_super()
292  *      and release aforementioned objects.  N    222  *      and release aforementioned objects.  Note: dentries and inodes _are_
293  *      taken care of and do not need specific    223  *      taken care of and do not need specific handling.
294  *                                             << 
295  *      Upon calling this function, the filesy << 
296  *      rearrange the set of dentries belongin << 
297  *      change the attachments of dentries to  << 
298  */                                               224  */
299 void generic_shutdown_super(struct super_block    225 void generic_shutdown_super(struct super_block *sb)
300 {                                                 226 {
301         const struct super_operations *sop = s !! 227         struct dentry *root = sb->s_root;
302                                                !! 228         struct super_operations *sop = sb->s_op;
303                                                   229 
304         if (sb->s_root) {                      !! 230         if (root) {
305                 shrink_dcache_for_umount(sb);  !! 231                 sb->s_root = NULL;
306                 sync_filesystem(sb);           !! 232                 shrink_dcache_parent(root);
307                 get_fs_excl();                 !! 233                 shrink_dcache_anon(&sb->s_anon);
                                                   >> 234                 dput(root);
                                                   >> 235                 fsync_super(sb);
                                                   >> 236                 lock_super(sb);
308                 sb->s_flags &= ~MS_ACTIVE;        237                 sb->s_flags &= ~MS_ACTIVE;
309                                                << 
310                 /* bad name - it should be evi    238                 /* bad name - it should be evict_inodes() */
311                 invalidate_inodes(sb);            239                 invalidate_inodes(sb);
                                                   >> 240                 lock_kernel();
312                                                   241 
                                                   >> 242                 if (sop->write_super && sb->s_dirt)
                                                   >> 243                         sop->write_super(sb);
313                 if (sop->put_super)               244                 if (sop->put_super)
314                         sop->put_super(sb);       245                         sop->put_super(sb);
315                                                   246 
316                 /* Forget any remaining inodes    247                 /* Forget any remaining inodes */
317                 if (invalidate_inodes(sb)) {      248                 if (invalidate_inodes(sb)) {
318                         printk("VFS: Busy inod !! 249                         printk("VFS: Busy inodes after unmount. "
319                            "Self-destruct in 5 !! 250                            "Self-destruct in 5 seconds.  Have a nice day...\n");
320                            sb->s_id);          << 
321                 }                                 251                 }
322                 put_fs_excl();                 !! 252 
                                                   >> 253                 unlock_kernel();
                                                   >> 254                 unlock_super(sb);
323         }                                         255         }
324         spin_lock(&sb_lock);                      256         spin_lock(&sb_lock);
325         /* should be initialized for __put_sup    257         /* should be initialized for __put_super_and_need_restart() */
326         list_del_init(&sb->s_list);               258         list_del_init(&sb->s_list);
327         list_del(&sb->s_instances);               259         list_del(&sb->s_instances);
328         spin_unlock(&sb_lock);                    260         spin_unlock(&sb_lock);
329         up_write(&sb->s_umount);                  261         up_write(&sb->s_umount);
330 }                                                 262 }
331                                                   263 
332 EXPORT_SYMBOL(generic_shutdown_super);            264 EXPORT_SYMBOL(generic_shutdown_super);
333                                                   265 
334 /**                                               266 /**
335  *      sget    -       find or create a super    267  *      sget    -       find or create a superblock
336  *      @type:  filesystem type superblock sho    268  *      @type:  filesystem type superblock should belong to
337  *      @test:  comparison callback               269  *      @test:  comparison callback
338  *      @set:   setup callback                    270  *      @set:   setup callback
339  *      @data:  argument to each of them          271  *      @data:  argument to each of them
340  */                                               272  */
341 struct super_block *sget(struct file_system_ty    273 struct super_block *sget(struct file_system_type *type,
342                         int (*test)(struct sup    274                         int (*test)(struct super_block *,void *),
343                         int (*set)(struct supe    275                         int (*set)(struct super_block *,void *),
344                         void *data)               276                         void *data)
345 {                                                 277 {
346         struct super_block *s = NULL;             278         struct super_block *s = NULL;
347         struct super_block *old;               !! 279         struct list_head *p;
348         int err;                                  280         int err;
349                                                   281 
350 retry:                                            282 retry:
351         spin_lock(&sb_lock);                      283         spin_lock(&sb_lock);
352         if (test) {                            !! 284         if (test) list_for_each(p, &type->fs_supers) {
353                 list_for_each_entry(old, &type !! 285                 struct super_block *old;
354                         if (!test(old, data))  !! 286                 old = list_entry(p, struct super_block, s_instances);
355                                 continue;      !! 287                 if (!test(old, data))
356                         if (!grab_super(old))  !! 288                         continue;
357                                 goto retry;    !! 289                 if (!grab_super(old))
358                         if (s) {               !! 290                         goto retry;
359                                 up_write(&s->s !! 291                 if (s)
360                                 destroy_super( !! 292                         destroy_super(s);
361                         }                      !! 293                 return old;
362                         return old;            << 
363                 }                              << 
364         }                                         294         }
365         if (!s) {                                 295         if (!s) {
366                 spin_unlock(&sb_lock);            296                 spin_unlock(&sb_lock);
367                 s = alloc_super(type);         !! 297                 s = alloc_super();
368                 if (!s)                           298                 if (!s)
369                         return ERR_PTR(-ENOMEM    299                         return ERR_PTR(-ENOMEM);
370                 goto retry;                       300                 goto retry;
371         }                                         301         }
372                                                   302                 
373         err = set(s, data);                       303         err = set(s, data);
374         if (err) {                                304         if (err) {
375                 spin_unlock(&sb_lock);            305                 spin_unlock(&sb_lock);
376                 up_write(&s->s_umount);        << 
377                 destroy_super(s);                 306                 destroy_super(s);
378                 return ERR_PTR(err);              307                 return ERR_PTR(err);
379         }                                         308         }
380         s->s_type = type;                         309         s->s_type = type;
381         strlcpy(s->s_id, type->name, sizeof(s-    310         strlcpy(s->s_id, type->name, sizeof(s->s_id));
382         list_add_tail(&s->s_list, &super_block    311         list_add_tail(&s->s_list, &super_blocks);
383         list_add(&s->s_instances, &type->fs_su    312         list_add(&s->s_instances, &type->fs_supers);
384         spin_unlock(&sb_lock);                    313         spin_unlock(&sb_lock);
385         get_filesystem(type);                     314         get_filesystem(type);
386         return s;                                 315         return s;
387 }                                                 316 }
388                                                   317 
389 EXPORT_SYMBOL(sget);                              318 EXPORT_SYMBOL(sget);
390                                                   319 
391 void drop_super(struct super_block *sb)           320 void drop_super(struct super_block *sb)
392 {                                                 321 {
393         up_read(&sb->s_umount);                   322         up_read(&sb->s_umount);
394         put_super(sb);                            323         put_super(sb);
395 }                                                 324 }
396                                                   325 
397 EXPORT_SYMBOL(drop_super);                        326 EXPORT_SYMBOL(drop_super);
398                                                   327 
399 /**                                            !! 328 static inline void write_super(struct super_block *sb)
400  * sync_supers - helper for periodic superbloc !! 329 {
401  *                                             !! 330         lock_super(sb);
402  * Call the write_super method if present on a !! 331         if (sb->s_root && sb->s_dirt)
403  * the system.  This is for the periodic write !! 332                 if (sb->s_op->write_super)
404  * filesystems.  For data integrity superblock !! 333                         sb->s_op->write_super(sb);
405  * sync_filesystems() instead.                 !! 334         unlock_super(sb);
406  *                                             !! 335 }
                                                   >> 336 
                                                   >> 337 /*
407  * Note: check the dirty flag before waiting,     338  * Note: check the dirty flag before waiting, so we don't
408  * hold up the sync while mounting a device. (    339  * hold up the sync while mounting a device. (The newly
409  * mounted device won't need syncing.)            340  * mounted device won't need syncing.)
410  */                                               341  */
411 void sync_supers(void)                            342 void sync_supers(void)
412 {                                                 343 {
413         struct super_block *sb;                !! 344         struct super_block * sb;
414                                                << 
415         spin_lock(&sb_lock);                   << 
416 restart:                                          345 restart:
417         list_for_each_entry(sb, &super_blocks, !! 346         spin_lock(&sb_lock);
418                 if (sb->s_op->write_super && s !! 347         sb = sb_entry(super_blocks.next);
                                                   >> 348         while (sb != sb_entry(&super_blocks))
                                                   >> 349                 if (sb->s_dirt) {
419                         sb->s_count++;            350                         sb->s_count++;
420                         spin_unlock(&sb_lock);    351                         spin_unlock(&sb_lock);
421                                                << 
422                         down_read(&sb->s_umoun    352                         down_read(&sb->s_umount);
423                         if (sb->s_root && sb-> !! 353                         write_super(sb);
424                                 sb->s_op->writ !! 354                         drop_super(sb);
425                         up_read(&sb->s_umount) !! 355                         goto restart;
426                                                !! 356                 } else
427                         spin_lock(&sb_lock);   !! 357                         sb = sb_entry(sb->s_list.next);
428                         if (__put_super_and_ne !! 358         spin_unlock(&sb_lock);
429                                 goto restart;  !! 359 }
430                 }                              !! 360 
                                                   >> 361 /*
                                                   >> 362  * Call the ->sync_fs super_op against all filesytems which are r/w and
                                                   >> 363  * which implement it.
                                                   >> 364  *
                                                   >> 365  * This operation is careful to avoid the livelock which could easily happen
                                                   >> 366  * if two or more filesystems are being continuously dirtied.  s_need_sync_fs
                                                   >> 367  * is used only here.  We set it against all filesystems and then clear it as
                                                   >> 368  * we sync them.  So redirtied filesystems are skipped.
                                                   >> 369  *
                                                   >> 370  * But if process A is currently running sync_filesytems and then process B
                                                   >> 371  * calls sync_filesystems as well, process B will set all the s_need_sync_fs
                                                   >> 372  * flags again, which will cause process A to resync everything.  Fix that with
                                                   >> 373  * a local mutex.
                                                   >> 374  *
                                                   >> 375  * (Fabian) Avoid sync_fs with clean fs & wait mode 0
                                                   >> 376  */
                                                   >> 377 void sync_filesystems(int wait)
                                                   >> 378 {
                                                   >> 379         struct super_block *sb;
                                                   >> 380         static DECLARE_MUTEX(mutex);
                                                   >> 381 
                                                   >> 382         down(&mutex);           /* Could be down_interruptible */
                                                   >> 383         spin_lock(&sb_lock);
                                                   >> 384         for (sb = sb_entry(super_blocks.next); sb != sb_entry(&super_blocks);
                                                   >> 385                         sb = sb_entry(sb->s_list.next)) {
                                                   >> 386                 if (!sb->s_op->sync_fs)
                                                   >> 387                         continue;
                                                   >> 388                 if (sb->s_flags & MS_RDONLY)
                                                   >> 389                         continue;
                                                   >> 390                 sb->s_need_sync_fs = 1;
                                                   >> 391         }
                                                   >> 392         spin_unlock(&sb_lock);
                                                   >> 393 
                                                   >> 394 restart:
                                                   >> 395         spin_lock(&sb_lock);
                                                   >> 396         for (sb = sb_entry(super_blocks.next); sb != sb_entry(&super_blocks);
                                                   >> 397                         sb = sb_entry(sb->s_list.next)) {
                                                   >> 398                 if (!sb->s_need_sync_fs)
                                                   >> 399                         continue;
                                                   >> 400                 sb->s_need_sync_fs = 0;
                                                   >> 401                 if (sb->s_flags & MS_RDONLY)
                                                   >> 402                         continue;       /* hm.  Was remounted r/o meanwhile */
                                                   >> 403                 sb->s_count++;
                                                   >> 404                 spin_unlock(&sb_lock);
                                                   >> 405                 down_read(&sb->s_umount);
                                                   >> 406                 if (sb->s_root && (wait || sb->s_dirt))
                                                   >> 407                         sb->s_op->sync_fs(sb, wait);
                                                   >> 408                 drop_super(sb);
                                                   >> 409                 goto restart;
431         }                                         410         }
432         spin_unlock(&sb_lock);                    411         spin_unlock(&sb_lock);
                                                   >> 412         up(&mutex);
433 }                                                 413 }
434                                                   414 
435 /**                                               415 /**
436  *      get_super - get the superblock of a de    416  *      get_super - get the superblock of a device
437  *      @bdev: device to get the superblock fo    417  *      @bdev: device to get the superblock for
438  *                                                418  *      
439  *      Scans the superblock list and finds th    419  *      Scans the superblock list and finds the superblock of the file system
440  *      mounted on the device given. %NULL is     420  *      mounted on the device given. %NULL is returned if no match is found.
441  */                                               421  */
442                                                   422 
443 struct super_block * get_super(struct block_de    423 struct super_block * get_super(struct block_device *bdev)
444 {                                                 424 {
445         struct super_block *sb;                !! 425         struct list_head *p;
446                                                << 
447         if (!bdev)                                426         if (!bdev)
448                 return NULL;                      427                 return NULL;
449                                                << 
450         spin_lock(&sb_lock);                   << 
451 rescan:                                           428 rescan:
452         list_for_each_entry(sb, &super_blocks, !! 429         spin_lock(&sb_lock);
453                 if (sb->s_bdev == bdev) {      !! 430         list_for_each(p, &super_blocks) {
454                         sb->s_count++;         !! 431                 struct super_block *s = sb_entry(p);
                                                   >> 432                 if (s->s_bdev == bdev) {
                                                   >> 433                         s->s_count++;
455                         spin_unlock(&sb_lock);    434                         spin_unlock(&sb_lock);
456                         down_read(&sb->s_umoun !! 435                         down_read(&s->s_umount);
457                         if (sb->s_root)        !! 436                         if (s->s_root)
458                                 return sb;     !! 437                                 return s;
459                         up_read(&sb->s_umount) !! 438                         drop_super(s);
460                         /* restart only when s !! 439                         goto rescan;
461                         spin_lock(&sb_lock);   << 
462                         if (__put_super_and_ne << 
463                                 goto rescan;   << 
464                 }                                 440                 }
465         }                                         441         }
466         spin_unlock(&sb_lock);                    442         spin_unlock(&sb_lock);
467         return NULL;                              443         return NULL;
468 }                                                 444 }
469                                                   445 
470 EXPORT_SYMBOL(get_super);                         446 EXPORT_SYMBOL(get_super);
471                                                   447  
472 struct super_block * user_get_super(dev_t dev)    448 struct super_block * user_get_super(dev_t dev)
473 {                                                 449 {
474         struct super_block *sb;                !! 450         struct list_head *p;
475                                                   451 
476         spin_lock(&sb_lock);                   << 
477 rescan:                                           452 rescan:
478         list_for_each_entry(sb, &super_blocks, !! 453         spin_lock(&sb_lock);
479                 if (sb->s_dev ==  dev) {       !! 454         list_for_each(p, &super_blocks) {
480                         sb->s_count++;         !! 455                 struct super_block *s = sb_entry(p);
                                                   >> 456                 if (s->s_dev ==  dev) {
                                                   >> 457                         s->s_count++;
481                         spin_unlock(&sb_lock);    458                         spin_unlock(&sb_lock);
482                         down_read(&sb->s_umoun !! 459                         down_read(&s->s_umount);
483                         if (sb->s_root)        !! 460                         if (s->s_root)
484                                 return sb;     !! 461                                 return s;
485                         up_read(&sb->s_umount) !! 462                         drop_super(s);
486                         /* restart only when s !! 463                         goto rescan;
487                         spin_lock(&sb_lock);   << 
488                         if (__put_super_and_ne << 
489                                 goto rescan;   << 
490                 }                                 464                 }
491         }                                         465         }
492         spin_unlock(&sb_lock);                    466         spin_unlock(&sb_lock);
493         return NULL;                              467         return NULL;
494 }                                                 468 }
495                                                   469 
496 SYSCALL_DEFINE2(ustat, unsigned, dev, struct u !! 470 EXPORT_SYMBOL(user_get_super);
                                                   >> 471 
                                                   >> 472 asmlinkage long sys_ustat(unsigned dev, struct ustat __user * ubuf)
497 {                                                 473 {
498         struct super_block *s;                    474         struct super_block *s;
499         struct ustat tmp;                         475         struct ustat tmp;
500         struct kstatfs sbuf;                      476         struct kstatfs sbuf;
501         int err = -EINVAL;                        477         int err = -EINVAL;
502                                                   478 
503         s = user_get_super(new_decode_dev(dev)    479         s = user_get_super(new_decode_dev(dev));
504         if (s == NULL)                            480         if (s == NULL)
505                 goto out;                         481                 goto out;
506         err = vfs_statfs(s->s_root, &sbuf);    !! 482         err = vfs_statfs(s, &sbuf);
507         drop_super(s);                            483         drop_super(s);
508         if (err)                                  484         if (err)
509                 goto out;                         485                 goto out;
510                                                   486 
511         memset(&tmp,0,sizeof(struct ustat));      487         memset(&tmp,0,sizeof(struct ustat));
512         tmp.f_tfree = sbuf.f_bfree;               488         tmp.f_tfree = sbuf.f_bfree;
513         tmp.f_tinode = sbuf.f_ffree;              489         tmp.f_tinode = sbuf.f_ffree;
514                                                   490 
515         err = copy_to_user(ubuf,&tmp,sizeof(st    491         err = copy_to_user(ubuf,&tmp,sizeof(struct ustat)) ? -EFAULT : 0;
516 out:                                              492 out:
517         return err;                               493         return err;
518 }                                                 494 }
519                                                   495 
520 /**                                               496 /**
                                                   >> 497  *      mark_files_ro
                                                   >> 498  *      @sb: superblock in question
                                                   >> 499  *
                                                   >> 500  *      All files are marked read/only.  We don't care about pending
                                                   >> 501  *      delete files so this should be used in 'force' mode only
                                                   >> 502  */
                                                   >> 503 
                                                   >> 504 static void mark_files_ro(struct super_block *sb)
                                                   >> 505 {
                                                   >> 506         struct file *f;
                                                   >> 507 
                                                   >> 508         file_list_lock();
                                                   >> 509         list_for_each_entry(f, &sb->s_files, f_list) {
                                                   >> 510                 if (S_ISREG(f->f_dentry->d_inode->i_mode) && file_count(f))
                                                   >> 511                         f->f_mode &= ~FMODE_WRITE;
                                                   >> 512         }
                                                   >> 513         file_list_unlock();
                                                   >> 514 }
                                                   >> 515 
                                                   >> 516 /**
521  *      do_remount_sb - asks filesystem to cha    517  *      do_remount_sb - asks filesystem to change mount options.
522  *      @sb:    superblock in question            518  *      @sb:    superblock in question
523  *      @flags: numeric part of options           519  *      @flags: numeric part of options
524  *      @data:  the rest of options               520  *      @data:  the rest of options
525  *      @force: whether or not to force the ch    521  *      @force: whether or not to force the change
526  *                                                522  *
527  *      Alters the mount options of a mounted     523  *      Alters the mount options of a mounted file system.
528  */                                               524  */
529 int do_remount_sb(struct super_block *sb, int     525 int do_remount_sb(struct super_block *sb, int flags, void *data, int force)
530 {                                                 526 {
531         int retval;                               527         int retval;
532         int remount_rw;                        << 
533                                                   528         
534 #ifdef CONFIG_BLOCK                            << 
535         if (!(flags & MS_RDONLY) && bdev_read_    529         if (!(flags & MS_RDONLY) && bdev_read_only(sb->s_bdev))
536                 return -EACCES;                   530                 return -EACCES;
537 #endif                                         << 
538         if (flags & MS_RDONLY)                    531         if (flags & MS_RDONLY)
539                 acct_auto_close(sb);              532                 acct_auto_close(sb);
540         shrink_dcache_sb(sb);                     533         shrink_dcache_sb(sb);
541         sync_filesystem(sb);                   !! 534         fsync_super(sb);
542                                                   535 
543         /* If we are remounting RDONLY and cur    536         /* If we are remounting RDONLY and current sb is read/write,
544            make sure there are no rw files ope    537            make sure there are no rw files opened */
545         if ((flags & MS_RDONLY) && !(sb->s_fla    538         if ((flags & MS_RDONLY) && !(sb->s_flags & MS_RDONLY)) {
546                 if (force)                        539                 if (force)
547                         mark_files_ro(sb);        540                         mark_files_ro(sb);
548                 else if (!fs_may_remount_ro(sb    541                 else if (!fs_may_remount_ro(sb))
549                         return -EBUSY;            542                         return -EBUSY;
550                 retval = vfs_dq_off(sb, 1);    << 
551                 if (retval < 0 && retval != -E << 
552                         return -EBUSY;         << 
553         }                                         543         }
554         remount_rw = !(flags & MS_RDONLY) && ( << 
555                                                   544 
556         if (sb->s_op->remount_fs) {               545         if (sb->s_op->remount_fs) {
                                                   >> 546                 lock_super(sb);
557                 retval = sb->s_op->remount_fs(    547                 retval = sb->s_op->remount_fs(sb, &flags, data);
                                                   >> 548                 unlock_super(sb);
558                 if (retval)                       549                 if (retval)
559                         return retval;            550                         return retval;
560         }                                         551         }
561         sb->s_flags = (sb->s_flags & ~MS_RMT_M    552         sb->s_flags = (sb->s_flags & ~MS_RMT_MASK) | (flags & MS_RMT_MASK);
562         if (remount_rw)                        << 
563                 vfs_dq_quota_on_remount(sb);   << 
564         return 0;                                 553         return 0;
565 }                                                 554 }
566                                                   555 
567 static void do_emergency_remount(struct work_s !! 556 static void do_emergency_remount(unsigned long foo)
568 {                                                 557 {
569         struct super_block *sb;                   558         struct super_block *sb;
570                                                   559 
571         spin_lock(&sb_lock);                      560         spin_lock(&sb_lock);
572         list_for_each_entry(sb, &super_blocks,    561         list_for_each_entry(sb, &super_blocks, s_list) {
573                 sb->s_count++;                    562                 sb->s_count++;
574                 spin_unlock(&sb_lock);            563                 spin_unlock(&sb_lock);
575                 down_write(&sb->s_umount);     !! 564                 down_read(&sb->s_umount);
576                 if (sb->s_root && sb->s_bdev &    565                 if (sb->s_root && sb->s_bdev && !(sb->s_flags & MS_RDONLY)) {
577                         /*                        566                         /*
578                          * ->remount_fs needs     567                          * ->remount_fs needs lock_kernel().
579                          *                        568                          *
580                          * What lock protects     569                          * What lock protects sb->s_flags??
581                          */                       570                          */
                                                   >> 571                         lock_kernel();
582                         do_remount_sb(sb, MS_R    572                         do_remount_sb(sb, MS_RDONLY, NULL, 1);
                                                   >> 573                         unlock_kernel();
583                 }                                 574                 }
584                 up_write(&sb->s_umount);       !! 575                 drop_super(sb);
585                 put_super(sb);                 << 
586                 spin_lock(&sb_lock);              576                 spin_lock(&sb_lock);
587         }                                         577         }
588         spin_unlock(&sb_lock);                    578         spin_unlock(&sb_lock);
589         kfree(work);                           << 
590         printk("Emergency Remount complete\n")    579         printk("Emergency Remount complete\n");
591 }                                                 580 }
592                                                   581 
593 void emergency_remount(void)                      582 void emergency_remount(void)
594 {                                                 583 {
595         struct work_struct *work;              !! 584         pdflush_operation(do_emergency_remount, 0);
596                                                << 
597         work = kmalloc(sizeof(*work), GFP_ATOM << 
598         if (work) {                            << 
599                 INIT_WORK(work, do_emergency_r << 
600                 schedule_work(work);           << 
601         }                                      << 
602 }                                                 585 }
603                                                   586 
604 /*                                                587 /*
605  * Unnamed block devices are dummy devices use    588  * Unnamed block devices are dummy devices used by virtual
606  * filesystems which don't use real block-devi    589  * filesystems which don't use real block-devices.  -- jrs
607  */                                               590  */
608                                                   591 
609 static DEFINE_IDA(unnamed_dev_ida);            !! 592 static struct idr unnamed_dev_idr;
610 static DEFINE_SPINLOCK(unnamed_dev_lock);/* pr    593 static DEFINE_SPINLOCK(unnamed_dev_lock);/* protects the above */
611 static int unnamed_dev_start = 0; /* don't bot << 
612                                                   594 
613 int set_anon_super(struct super_block *s, void    595 int set_anon_super(struct super_block *s, void *data)
614 {                                                 596 {
615         int dev;                                  597         int dev;
616         int error;                                598         int error;
617                                                   599 
618  retry:                                           600  retry:
619         if (ida_pre_get(&unnamed_dev_ida, GFP_ !! 601         if (idr_pre_get(&unnamed_dev_idr, GFP_ATOMIC) == 0)
620                 return -ENOMEM;                   602                 return -ENOMEM;
621         spin_lock(&unnamed_dev_lock);             603         spin_lock(&unnamed_dev_lock);
622         error = ida_get_new_above(&unnamed_dev !! 604         error = idr_get_new(&unnamed_dev_idr, NULL, &dev);
623         if (!error)                            << 
624                 unnamed_dev_start = dev + 1;   << 
625         spin_unlock(&unnamed_dev_lock);           605         spin_unlock(&unnamed_dev_lock);
626         if (error == -EAGAIN)                     606         if (error == -EAGAIN)
627                 /* We raced and lost with anot    607                 /* We raced and lost with another CPU. */
628                 goto retry;                       608                 goto retry;
629         else if (error)                           609         else if (error)
630                 return -EAGAIN;                   610                 return -EAGAIN;
631                                                   611 
632         if ((dev & MAX_ID_MASK) == (1 << MINOR    612         if ((dev & MAX_ID_MASK) == (1 << MINORBITS)) {
633                 spin_lock(&unnamed_dev_lock);     613                 spin_lock(&unnamed_dev_lock);
634                 ida_remove(&unnamed_dev_ida, d !! 614                 idr_remove(&unnamed_dev_idr, dev);
635                 if (unnamed_dev_start > dev)   << 
636                         unnamed_dev_start = de << 
637                 spin_unlock(&unnamed_dev_lock)    615                 spin_unlock(&unnamed_dev_lock);
638                 return -EMFILE;                   616                 return -EMFILE;
639         }                                         617         }
640         s->s_dev = MKDEV(0, dev & MINORMASK);     618         s->s_dev = MKDEV(0, dev & MINORMASK);
641         return 0;                                 619         return 0;
642 }                                                 620 }
643                                                   621 
644 EXPORT_SYMBOL(set_anon_super);                    622 EXPORT_SYMBOL(set_anon_super);
645                                                   623 
646 void kill_anon_super(struct super_block *sb)      624 void kill_anon_super(struct super_block *sb)
647 {                                                 625 {
648         int slot = MINOR(sb->s_dev);              626         int slot = MINOR(sb->s_dev);
649                                                   627 
650         generic_shutdown_super(sb);               628         generic_shutdown_super(sb);
651         spin_lock(&unnamed_dev_lock);             629         spin_lock(&unnamed_dev_lock);
652         ida_remove(&unnamed_dev_ida, slot);    !! 630         idr_remove(&unnamed_dev_idr, slot);
653         if (slot < unnamed_dev_start)          << 
654                 unnamed_dev_start = slot;      << 
655         spin_unlock(&unnamed_dev_lock);           631         spin_unlock(&unnamed_dev_lock);
656 }                                                 632 }
657                                                   633 
658 EXPORT_SYMBOL(kill_anon_super);                   634 EXPORT_SYMBOL(kill_anon_super);
659                                                   635 
                                                   >> 636 void __init unnamed_dev_init(void)
                                                   >> 637 {
                                                   >> 638         idr_init(&unnamed_dev_idr);
                                                   >> 639 }
                                                   >> 640 
660 void kill_litter_super(struct super_block *sb)    641 void kill_litter_super(struct super_block *sb)
661 {                                                 642 {
662         if (sb->s_root)                           643         if (sb->s_root)
663                 d_genocide(sb->s_root);           644                 d_genocide(sb->s_root);
664         kill_anon_super(sb);                      645         kill_anon_super(sb);
665 }                                                 646 }
666                                                   647 
667 EXPORT_SYMBOL(kill_litter_super);                 648 EXPORT_SYMBOL(kill_litter_super);
668                                                   649 
669 static int ns_test_super(struct super_block *s << 
670 {                                              << 
671         return sb->s_fs_info == data;          << 
672 }                                              << 
673                                                << 
674 static int ns_set_super(struct super_block *sb << 
675 {                                              << 
676         sb->s_fs_info = data;                  << 
677         return set_anon_super(sb, NULL);       << 
678 }                                              << 
679                                                << 
680 int get_sb_ns(struct file_system_type *fs_type << 
681         int (*fill_super)(struct super_block * << 
682         struct vfsmount *mnt)                  << 
683 {                                              << 
684         struct super_block *sb;                << 
685                                                << 
686         sb = sget(fs_type, ns_test_super, ns_s << 
687         if (IS_ERR(sb))                        << 
688                 return PTR_ERR(sb);            << 
689                                                << 
690         if (!sb->s_root) {                     << 
691                 int err;                       << 
692                 sb->s_flags = flags;           << 
693                 err = fill_super(sb, data, fla << 
694                 if (err) {                     << 
695                         deactivate_locked_supe << 
696                         return err;            << 
697                 }                              << 
698                                                << 
699                 sb->s_flags |= MS_ACTIVE;      << 
700         }                                      << 
701                                                << 
702         simple_set_mnt(mnt, sb);               << 
703         return 0;                              << 
704 }                                              << 
705                                                << 
706 EXPORT_SYMBOL(get_sb_ns);                      << 
707                                                << 
708 #ifdef CONFIG_BLOCK                            << 
709 static int set_bdev_super(struct super_block *    650 static int set_bdev_super(struct super_block *s, void *data)
710 {                                                 651 {
711         s->s_bdev = data;                         652         s->s_bdev = data;
712         s->s_dev = s->s_bdev->bd_dev;             653         s->s_dev = s->s_bdev->bd_dev;
713         return 0;                                 654         return 0;
714 }                                                 655 }
715                                                   656 
716 static int test_bdev_super(struct super_block     657 static int test_bdev_super(struct super_block *s, void *data)
717 {                                                 658 {
718         return (void *)s->s_bdev == data;         659         return (void *)s->s_bdev == data;
719 }                                                 660 }
720                                                   661 
721 int get_sb_bdev(struct file_system_type *fs_ty !! 662 static void bdev_uevent(struct block_device *bdev, enum kobject_action action)
                                                   >> 663 {
                                                   >> 664         if (bdev->bd_disk) {
                                                   >> 665                 if (bdev->bd_part)
                                                   >> 666                         kobject_uevent(&bdev->bd_part->kobj, action, NULL);
                                                   >> 667                 else
                                                   >> 668                         kobject_uevent(&bdev->bd_disk->kobj, action, NULL);
                                                   >> 669         }
                                                   >> 670 }
                                                   >> 671 
                                                   >> 672 struct super_block *get_sb_bdev(struct file_system_type *fs_type,
722         int flags, const char *dev_name, void     673         int flags, const char *dev_name, void *data,
723         int (*fill_super)(struct super_block * !! 674         int (*fill_super)(struct super_block *, void *, int))
724         struct vfsmount *mnt)                  << 
725 {                                                 675 {
726         struct block_device *bdev;                676         struct block_device *bdev;
727         struct super_block *s;                    677         struct super_block *s;
728         fmode_t mode = FMODE_READ;             << 
729         int error = 0;                            678         int error = 0;
730                                                   679 
731         if (!(flags & MS_RDONLY))              !! 680         bdev = open_bdev_excl(dev_name, flags, fs_type);
732                 mode |= FMODE_WRITE;           << 
733                                                << 
734         bdev = open_bdev_exclusive(dev_name, m << 
735         if (IS_ERR(bdev))                         681         if (IS_ERR(bdev))
736                 return PTR_ERR(bdev);          !! 682                 return (struct super_block *)bdev;
737                                                   683 
738         /*                                        684         /*
739          * once the super is inserted into the    685          * once the super is inserted into the list by sget, s_umount
740          * will protect the lockfs code from t    686          * will protect the lockfs code from trying to start a snapshot
741          * while we are mounting                  687          * while we are mounting
742          */                                       688          */
743         down(&bdev->bd_mount_sem);                689         down(&bdev->bd_mount_sem);
744         s = sget(fs_type, test_bdev_super, set    690         s = sget(fs_type, test_bdev_super, set_bdev_super, bdev);
745         up(&bdev->bd_mount_sem);                  691         up(&bdev->bd_mount_sem);
746         if (IS_ERR(s))                            692         if (IS_ERR(s))
747                 goto error_s;                  !! 693                 goto out;
748                                                   694 
749         if (s->s_root) {                          695         if (s->s_root) {
750                 if ((flags ^ s->s_flags) & MS_    696                 if ((flags ^ s->s_flags) & MS_RDONLY) {
751                         deactivate_locked_supe !! 697                         up_write(&s->s_umount);
752                         error = -EBUSY;        !! 698                         deactivate_super(s);
753                         goto error_bdev;       !! 699                         s = ERR_PTR(-EBUSY);
754                 }                                 700                 }
755                                                !! 701                 goto out;
756                 close_bdev_exclusive(bdev, mod << 
757         } else {                                  702         } else {
758                 char b[BDEVNAME_SIZE];            703                 char b[BDEVNAME_SIZE];
759                                                   704 
760                 s->s_flags = flags;               705                 s->s_flags = flags;
761                 s->s_mode = mode;              << 
762                 strlcpy(s->s_id, bdevname(bdev    706                 strlcpy(s->s_id, bdevname(bdev, b), sizeof(s->s_id));
763                 sb_set_blocksize(s, block_size !! 707                 s->s_old_blocksize = block_size(bdev);
764                 error = fill_super(s, data, fl !! 708                 sb_set_blocksize(s, s->s_old_blocksize);
                                                   >> 709                 error = fill_super(s, data, flags & MS_VERBOSE ? 1 : 0);
765                 if (error) {                      710                 if (error) {
766                         deactivate_locked_supe !! 711                         up_write(&s->s_umount);
767                         goto error;            !! 712                         deactivate_super(s);
                                                   >> 713                         s = ERR_PTR(error);
                                                   >> 714                 } else {
                                                   >> 715                         s->s_flags |= MS_ACTIVE;
                                                   >> 716                         bdev_uevent(bdev, KOBJ_MOUNT);
768                 }                                 717                 }
769                                                << 
770                 s->s_flags |= MS_ACTIVE;       << 
771                 bdev->bd_super = s;            << 
772         }                                         718         }
773                                                   719 
774         simple_set_mnt(mnt, s);                !! 720         return s;
775         return 0;                              << 
776                                                   721 
777 error_s:                                       !! 722 out:
778         error = PTR_ERR(s);                    !! 723         close_bdev_excl(bdev);
779 error_bdev:                                    !! 724         return s;
780         close_bdev_exclusive(bdev, mode);      << 
781 error:                                         << 
782         return error;                          << 
783 }                                                 725 }
784                                                   726 
785 EXPORT_SYMBOL(get_sb_bdev);                       727 EXPORT_SYMBOL(get_sb_bdev);
786                                                   728 
787 void kill_block_super(struct super_block *sb)     729 void kill_block_super(struct super_block *sb)
788 {                                                 730 {
789         struct block_device *bdev = sb->s_bdev    731         struct block_device *bdev = sb->s_bdev;
790         fmode_t mode = sb->s_mode;             << 
791                                                   732 
792         bdev->bd_super = NULL;                 !! 733         bdev_uevent(bdev, KOBJ_UMOUNT);
793         generic_shutdown_super(sb);               734         generic_shutdown_super(sb);
794         sync_blockdev(bdev);                   !! 735         set_blocksize(bdev, sb->s_old_blocksize);
795         close_bdev_exclusive(bdev, mode);      !! 736         close_bdev_excl(bdev);
796 }                                                 737 }
797                                                   738 
798 EXPORT_SYMBOL(kill_block_super);                  739 EXPORT_SYMBOL(kill_block_super);
799 #endif                                         << 
800                                                   740 
801 int get_sb_nodev(struct file_system_type *fs_t !! 741 struct super_block *get_sb_nodev(struct file_system_type *fs_type,
802         int flags, void *data,                    742         int flags, void *data,
803         int (*fill_super)(struct super_block * !! 743         int (*fill_super)(struct super_block *, void *, int))
804         struct vfsmount *mnt)                  << 
805 {                                                 744 {
806         int error;                                745         int error;
807         struct super_block *s = sget(fs_type,     746         struct super_block *s = sget(fs_type, NULL, set_anon_super, NULL);
808                                                   747 
809         if (IS_ERR(s))                            748         if (IS_ERR(s))
810                 return PTR_ERR(s);             !! 749                 return s;
811                                                   750 
812         s->s_flags = flags;                       751         s->s_flags = flags;
813                                                   752 
814         error = fill_super(s, data, flags & MS !! 753         error = fill_super(s, data, flags & MS_VERBOSE ? 1 : 0);
815         if (error) {                              754         if (error) {
816                 deactivate_locked_super(s);    !! 755                 up_write(&s->s_umount);
817                 return error;                  !! 756                 deactivate_super(s);
                                                   >> 757                 return ERR_PTR(error);
818         }                                         758         }
819         s->s_flags |= MS_ACTIVE;                  759         s->s_flags |= MS_ACTIVE;
820         simple_set_mnt(mnt, s);                !! 760         return s;
821         return 0;                              << 
822 }                                                 761 }
823                                                   762 
824 EXPORT_SYMBOL(get_sb_nodev);                      763 EXPORT_SYMBOL(get_sb_nodev);
825                                                   764 
826 static int compare_single(struct super_block *    765 static int compare_single(struct super_block *s, void *p)
827 {                                                 766 {
828         return 1;                                 767         return 1;
829 }                                                 768 }
830                                                   769 
831 int get_sb_single(struct file_system_type *fs_ !! 770 struct super_block *get_sb_single(struct file_system_type *fs_type,
832         int flags, void *data,                    771         int flags, void *data,
833         int (*fill_super)(struct super_block * !! 772         int (*fill_super)(struct super_block *, void *, int))
834         struct vfsmount *mnt)                  << 
835 {                                                 773 {
836         struct super_block *s;                    774         struct super_block *s;
837         int error;                                775         int error;
838                                                   776 
839         s = sget(fs_type, compare_single, set_    777         s = sget(fs_type, compare_single, set_anon_super, NULL);
840         if (IS_ERR(s))                            778         if (IS_ERR(s))
841                 return PTR_ERR(s);             !! 779                 return s;
842         if (!s->s_root) {                         780         if (!s->s_root) {
843                 s->s_flags = flags;               781                 s->s_flags = flags;
844                 error = fill_super(s, data, fl !! 782                 error = fill_super(s, data, flags & MS_VERBOSE ? 1 : 0);
845                 if (error) {                      783                 if (error) {
846                         deactivate_locked_supe !! 784                         up_write(&s->s_umount);
847                         return error;          !! 785                         deactivate_super(s);
                                                   >> 786                         return ERR_PTR(error);
848                 }                                 787                 }
849                 s->s_flags |= MS_ACTIVE;          788                 s->s_flags |= MS_ACTIVE;
850         }                                         789         }
851         do_remount_sb(s, flags, data, 0);         790         do_remount_sb(s, flags, data, 0);
852         simple_set_mnt(mnt, s);                !! 791         return s;
853         return 0;                              << 
854 }                                                 792 }
855                                                   793 
856 EXPORT_SYMBOL(get_sb_single);                     794 EXPORT_SYMBOL(get_sb_single);
857                                                   795 
858 struct vfsmount *                                 796 struct vfsmount *
859 vfs_kern_mount(struct file_system_type *type,  !! 797 do_kern_mount(const char *fstype, int flags, const char *name, void *data)
860 {                                                 798 {
                                                   >> 799         struct file_system_type *type = get_fs_type(fstype);
                                                   >> 800         struct super_block *sb = ERR_PTR(-ENOMEM);
861         struct vfsmount *mnt;                     801         struct vfsmount *mnt;
862         char *secdata = NULL;                  << 
863         int error;                                802         int error;
                                                   >> 803         char *secdata = NULL;
864                                                   804 
865         if (!type)                                805         if (!type)
866                 return ERR_PTR(-ENODEV);          806                 return ERR_PTR(-ENODEV);
867                                                   807 
868         error = -ENOMEM;                       << 
869         mnt = alloc_vfsmnt(name);                 808         mnt = alloc_vfsmnt(name);
870         if (!mnt)                                 809         if (!mnt)
871                 goto out;                         810                 goto out;
872                                                   811 
873         if (data && !(type->fs_flags & FS_BINA !! 812         if (data) {
874                 secdata = alloc_secdata();        813                 secdata = alloc_secdata();
875                 if (!secdata)                  !! 814                 if (!secdata) {
                                                   >> 815                         sb = ERR_PTR(-ENOMEM);
876                         goto out_mnt;             816                         goto out_mnt;
                                                   >> 817                 }
877                                                   818 
878                 error = security_sb_copy_data( !! 819                 error = security_sb_copy_data(type, data, secdata);
879                 if (error)                     !! 820                 if (error) {
                                                   >> 821                         sb = ERR_PTR(error);
880                         goto out_free_secdata;    822                         goto out_free_secdata;
                                                   >> 823                 }
881         }                                         824         }
882                                                   825 
883         error = type->get_sb(type, flags, name !! 826         sb = type->get_sb(type, flags, name, data);
884         if (error < 0)                         !! 827         if (IS_ERR(sb))
885                 goto out_free_secdata;            828                 goto out_free_secdata;
886         BUG_ON(!mnt->mnt_sb);                  !! 829         error = security_sb_kern_mount(sb, secdata);
887                                                << 
888         error = security_sb_kern_mount(mnt->mn << 
889         if (error)                                830         if (error)
890                 goto out_sb;                      831                 goto out_sb;
891                                                !! 832         mnt->mnt_sb = sb;
892         mnt->mnt_mountpoint = mnt->mnt_root;   !! 833         mnt->mnt_root = dget(sb->s_root);
                                                   >> 834         mnt->mnt_mountpoint = sb->s_root;
893         mnt->mnt_parent = mnt;                    835         mnt->mnt_parent = mnt;
894         up_write(&mnt->mnt_sb->s_umount);      !! 836         mnt->mnt_namespace = current->namespace;
895         free_secdata(secdata);                 !! 837         up_write(&sb->s_umount);
                                                   >> 838         put_filesystem(type);
896         return mnt;                               839         return mnt;
897 out_sb:                                           840 out_sb:
898         dput(mnt->mnt_root);                   !! 841         up_write(&sb->s_umount);
899         deactivate_locked_super(mnt->mnt_sb);  !! 842         deactivate_super(sb);
                                                   >> 843         sb = ERR_PTR(error);
900 out_free_secdata:                                 844 out_free_secdata:
901         free_secdata(secdata);                    845         free_secdata(secdata);
902 out_mnt:                                          846 out_mnt:
903         free_vfsmnt(mnt);                         847         free_vfsmnt(mnt);
904 out:                                              848 out:
905         return ERR_PTR(error);                 << 
906 }                                              << 
907                                                << 
908 EXPORT_SYMBOL_GPL(vfs_kern_mount);             << 
909                                                << 
910 static struct vfsmount *fs_set_subtype(struct  << 
911 {                                              << 
912         int err;                               << 
913         const char *subtype = strchr(fstype, ' << 
914         if (subtype) {                         << 
915                 subtype++;                     << 
916                 err = -EINVAL;                 << 
917                 if (!subtype[0])               << 
918                         goto err;              << 
919         } else                                 << 
920                 subtype = "";                  << 
921                                                << 
922         mnt->mnt_sb->s_subtype = kstrdup(subty << 
923         err = -ENOMEM;                         << 
924         if (!mnt->mnt_sb->s_subtype)           << 
925                 goto err;                      << 
926         return mnt;                            << 
927                                                << 
928  err:                                          << 
929         mntput(mnt);                           << 
930         return ERR_PTR(err);                   << 
931 }                                              << 
932                                                << 
933 struct vfsmount *                              << 
934 do_kern_mount(const char *fstype, int flags, c << 
935 {                                              << 
936         struct file_system_type *type = get_fs << 
937         struct vfsmount *mnt;                  << 
938         if (!type)                             << 
939                 return ERR_PTR(-ENODEV);       << 
940         mnt = vfs_kern_mount(type, flags, name << 
941         if (!IS_ERR(mnt) && (type->fs_flags &  << 
942             !mnt->mnt_sb->s_subtype)           << 
943                 mnt = fs_set_subtype(mnt, fsty << 
944         put_filesystem(type);                     849         put_filesystem(type);
945         return mnt;                            !! 850         return (struct vfsmount *)sb;
946 }                                                 851 }
                                                   >> 852 
947 EXPORT_SYMBOL_GPL(do_kern_mount);                 853 EXPORT_SYMBOL_GPL(do_kern_mount);
948                                                   854 
949 struct vfsmount *kern_mount_data(struct file_s !! 855 struct vfsmount *kern_mount(struct file_system_type *type)
950 {                                                 856 {
951         return vfs_kern_mount(type, MS_KERNMOU !! 857         return do_kern_mount(type->name, 0, type->name, NULL);
952 }                                                 858 }
953                                                   859 
954 EXPORT_SYMBOL_GPL(kern_mount_data);            !! 860 EXPORT_SYMBOL(kern_mount);
955                                                   861 
  This page was automatically generated by the LXR engine.