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