linux/fs/namespace.c
<<
"
" >>"
" "
" " "
" " Prefs "
" "
"
   1/*
   2 *  linux/fs/namespace.c
   3 *
   4 * (C) Copyright Al Viro 2000, 2001
   5 *      Released under GPL  v2
   6 *
   7 * Based on code from fs/super.c, copyright Linus Torvalds and others2
   8 * Heavily rewritten2
   9 */
  10
  11#include <linux/syscalls.h>
  12#include <linux/slab.h>
  13#include <linux/sched.h>
  14#include <linux/smp_lock.h>
  15#include <linux/init.h>
  16#include <linux/kernel.h>
  17#include <linux/acct.h>
  18#include <linux/capability.h>
  19#include <linux/cpumask.h>
  20#include <linux/module.h>
  21#include <linux/sysfs.h>
  22#include <linux/seq_file.h>
  23#include <linux/mnt_namespace.h>
  24#include <linux/namei.h>
  25#include <linux/security.h>
  26#include <linux/mount.h>
  27#include <linux/ramfs.h>
  28#include <linux/log2.h>
  29#include <linux/idr.h>
  30#include <asm/uaccess.h>
  31#include <asm/unistd.h>
  32#include "pnode.h"
  33#include "internal.h"
  34
  35#define HASH_SHIFT ilog2(PAGE_SIZE / sizeof(struct list_head))
  36#define HASH_SIZE (1UL << HASH_SHIFT)
  37
  38/* spinlock for vfsmount related operations, inplace of dcache_lock */
  39__cacheline_aligned_in_smp DEFINE_SPINLOCK(vfsmount_lock);
  40
  41static int event;
  42static DEFINE_IDA(mnt_id_ida);
  43static DEFINE_IDA(mnt_group_ida);
  44
  45static struct list_head *mount_hashtable __read_mostly;
  46static struct kmem_cache *mnt_cache __read_mostly;
  47static struct rw_semaphore namespace_sem;
  48
  49/* /sys/fs */
  50struct kobject *fs_kobj;
  51EXPORT_SYMBOL_GPL(fs_kobj);
  52
  53static inline unsigned long hash(struct vfsmount *mnt, struct dentry *dentry)
  54{
  55        unsigned long tmp = ((unsigned long)mnt / L1_CACHE_BYTES);
  56        tmp += ((unsigned long)dentry / L1_CACHE_BYTES);
  57        tmp = tmp + (tmp >> HASH_SHIFT);
  58        return tmp & (HASH_SIZE - 1);
  59}
  60
  61#define MNT_WRITER_UNDERFLOW_LIMIT -(1<<16)
  62
  63/* allocation is serialized by namespace_sem */
  64static int mnt_alloc_id(struct vfsmount *mnt)
  65{
  66        int res;
  67
  68retry:
  69        ida_pre_get(&mnt_id_ida, GFP_KERNEL);
  70        spin_lock(&vfsmount_lock);
  71        res = ida_get_new(&mnt_id_ida, &mnt->mnt_id);
  72        spin_unlock(&vfsmount_lock);
  73        if (res == -EAGAIN)
  74                goto retry;
  75
  76        return res;
  77}
  78
  79static void mnt_free_id(struct vfsmount *mnt)
  80{
  81        spin_lock(&vfsmount_lock);
  82        ida_remove(&mnt_id_ida, mnt->mnt_id);
  83        spin_unlock(&vfsmount_lock);
  84}
  85
  86/*
  87 * Allocate a new peer group ID
  88 *
  89 * mnt_group_ida is protected by namespace_sem
  90 */
  91static int mnt_alloc_group_id(struct vfsmount *mnt)
  92{
  93        if (!ida_pre_get(&mnt_group_ida, GFP_KERNEL))
  94                return -ENOMEM;
  95
  96        return ida_get_new_above(&mnt_group_ida, 1, &mnt->mnt_group_id);
  97}
  98
  99/*
 100 * Release a peer group ID
 101 */
 102void mnt_release_group_id(struct vfsmount *mnt)
 103{
 104        ida_remove(&mnt_group_ida, mnt->mnt_group_id);
 105        mnt->mnt_group_id = 0;
 106}
 107
 108struct vfsmount *alloc_vfsmnt(const char *name)
 109{
 110        struct vfsmount *mnt = kmem_cache_zalloc(mnt_cache, GFP_KERNEL);
 111        if (mnt) {
 112                int err;
 113
 114                err = mnt_alloc_id(mnt);
 115                if (err)
 116                        goto out_free_cache;
 117
 118                if (name) {
 119                        mnt->mnt_devname = kstrdup(name, GFP_KERNEL);
 120                        if (!mnt->mnt_devname)
 121                                goto out_free_id;
 122                }
 123
 124                atomic_set(&mnt->mnt_count, 1);
 125                INIT_LIST_HEAD(&mnt->mnt_hash);
 126                INIT_LIST_HEAD(&mnt->mnt_child);
 127                INIT_LIST_HEAD(&mnt->mnt_mounts);
 128                INIT_LIST_HEAD(&mnt->mnt_list);
 129                INIT_LIST_HEAD(&mnt->mnt_expire);
 130                INIT_LIST_HEAD(&mnt->mnt_share);
 131                INIT_LIST_HEAD(&mnt->mnt_slave_list);
 132                INIT_LIST_HEAD(&mnt->mnt_slave);
 133                atomic_set(&mnt->__mnt_writers, 0);
 134        }
 135        return mnt;
 136
 137out_free_id:
 138        mnt_free_id(mnt);
 139out_free_cache:
 140        kmem_cache_free(mnt_cache, mnt);
 141        return NULL;
 142}
 143
 144/*
 145 * Most r/o checks on a fs are for operations that take
 146 * discrete amounts of time, like a write() or unlink()2
 147 * We must keep track of when those operations start
 148 * (for permission checks) and when they end, so that
 149 * we can determine when writes are able to occur to
 150 * a filesystem2
 151 */
 152/*
 153 * __mnt_is_readonly: check whether a mount is read-only
 154 * @mnt: the mount to check for its write status
 155 *
 156 * This shouldn't be used directly ouside of the VFS2
 157 * It does not guarantee that the filesystem will stay
 158 * r/w, just that it is right *now*.  This can not and
 159 * should not be used in place of IS_RDONLY(inode)2
 160 * mnt_want/drop_write() will _keep_ the filesystem
 161 * r/w2
 162 */
 163int __mnt_is_readonly(struct vfsmount *mnt)
 164{
 165        if (mnt->mnt_flags & MNT_READONLY)
 166                return 1;
 167        if (mnt->mnt_sb->s_flags & MS_RDONLY)
 168                return 1;
 169        return 0;
 170}
 171EXPORT_SYMBOL_GPL(__mnt_is_readonly);
 172
 173struct mnt_writer {
 174        /*
 175         * If holding multiple instances of this lock, they
 176         * must be ordered by cpu number2
 177         */
 178        spinlock_t lock;
 179        struct lock_class_key lock_class; /* compiles out with !lockdep */
 180        unsigned long count;
 181        struct vfsmount *mnt;
 182} ____cacheline_aligned_in_smp;
 183static DEFINE_PER_CPU(struct mnt_writer, mnt_writers);
 184
 185static int __init init_mnt_writers(void)
 186{
 187        int cpu;
 188        for_each_possible_cpu(cpu) {
 189                struct mnt_writer *writer = &per_cpu(mnt_writers, cpu);
 190                spin_lock_init(&writer->lock);
 191                lockdep_set_class(&writer->lock, &writer->lock_class);
 192                writer->count = 0;
 193        }
 194        return 0;
 195}
 196fs_initcall(init_mnt_writers);
 197
 198static void unlock_mnt_writers(void)
 199{
 200        int cpu;
 201        struct mnt_writer *cpu_writer;
 202
 203        for_each_possible_cpu(cpu) {
 204                cpu_writer = &per_cpu(mnt_writers, cpu);
 205                spin_unlock(&cpu_writer->lock);
 206        }
 207}
 208
 209static inline void __clear_mnt_count(struct mnt_writer *cpu_writer)
 210{
 211        if (!cpu_writer->mnt)
 212                return;
 213        /*
 214         * This is in case anyone ever leaves an invalid,
 215         * old ->mnt and a count of 02
 216         */
 217        if (!cpu_writer->count)
 218                return;
 219        atomic_add(cpu_writer->count, &cpu_writer->mnt->__mnt_writers);
 220        cpu_writer->count = 0;
 221}
 222 /*
 223 * must hold cpu_writer->lock
 224 */
 225static inline void use_cpu_writer_for_mount(struct mnt_writer *cpu_writer,
 226                                          struct vfsmount *mnt)
 227{
 228        if (cpu_writer->mnt == mnt)
 229                return;
 230        __clear_mnt_count(cpu_writer);
 231        cpu_writer->mnt = mnt;
 232}
 233
 234/*
 235 * Most r/o checks on a fs are for operations that take
 236 * discrete amounts of time, like a write() or unlink()2
 237 * We must keep track of when those operations start
 238 * (for permission checks) and when they end, so that
 239 * we can determine when writes are able to occur to
 240 * a filesystem2
 241 */
 242/**
 243 * mnt_want_write - get write access to a mount
 244 * @mnt: the mount on which to take a write
 245 *
 246 * This tells the low-level filesystem that a write is
 247 * about to be performed to it, and makes sure that
 248 * writes are allowed before returning success.  When
 249 * the write operation is finished, mnt_drop_write()
 250 * must be called.  This is effectively a refcount2
 251 */
 252int mnt_want_write(struct vfsmount *mnt)
 253{
 254        int ret = 0;
 255        struct mnt_writer *cpu_writer;
 256
 257        cpu_writer = &get_cpu_var(mnt_writers);
 258        spin_lock(&cpu_writer->lock);
 259        if (__mnt_is_readonly(mnt)) {
 260                ret = -EROFS;
 261                goto out;
 262        }
 263        use_cpu_writer_for_mount(cpu_writer, mnt);
 264        cpu_writer->count++;
 265out:
 266        spin_unlock(&cpu_writer->lock);
 267        put_cpu_var(mnt_writers);
 268        return ret;
 269}
 270EXPORT_SYMBOL_GPL(mnt_want_write);
 271
 272static void lock_mnt_writers(void)
 273{
 274        int cpu;
 275        struct mnt_writer *cpu_writer;
 276
 277        for_each_possible_cpu(cpu) {
 278                cpu_writer = &per_cpu(mnt_writers, cpu);
 279                spin_lock(&cpu_writer->lock);
 280                __clear_mnt_count(cpu_writer);
 281                cpu_writer->mnt = NULL;
 282        }
 283}
 284
 285/*
 286 * These per-cpu write counts are not guaranteed to have
 287 * matched increments and decrements on any given cpu2
 288 * A file open()ed for write on one cpu and close()d on
 289 * another cpu will imbalance this count2  Make sure it
 290 * does not get too far out of whack2
 291 */
 292static void handle_write_count_underflow(struct vfsmount *mnt)
 293{
 294        if (atomic_read(&mnt->__mnt_writers) >=
 295            MNT_WRITER_UNDERFLOW_LIMIT)
 296                return;
 297        /*
 298         * It isn't necessary to hold all of the locks
 299         * at the same time, but doing it this way makes
 300         * us share a lot more code2
 301         */
 302        lock_mnt_writers();
 303        /*
 304         * vfsmount_lock is for mnt_flags2
 305         */
 306        spin_lock(&vfsmount_lock);
 307        /*
 308         * If coalescing the per-cpu writer counts did not
 309         * get us back to a positive writer count, we have
 310         * a bug2
 311         */
 312        if ((atomic_read(&mnt->__mnt_writers) < 0) &&
 313            !(mnt->mnt_flags & MNT_IMBALANCED_WRITE_COUNT)) {
 314                WARN(1, KERN_DEBUG "leak detected on mount(%p) writers "
 315                                "count: %d\n",
 316                        mnt, atomic_read(&mnt->__mnt_writers));
 317                /* use the flag to keep the dmesg spam down */
 318                mnt->mnt_flags |= MNT_IMBALANCED_WRITE_COUNT;
 319        }
 320        spin_unlock(&vfsmount_lock);
 321        unlock_mnt_writers();
 322}
 323
 324/**
 325 * mnt_drop_write - give up write access to a mount
 326 * @mnt: the mount on which to give up write access
 327 *
 328 * Tells the low-level filesystem that we are done
 329 * performing writes to it2  Must be matched with
 330 * mnt_want_write() call above2
 331 */
 332void mnt_drop_write(struct vfsmount *mnt)
 333{
 334        int must_check_underflow = 0;
 335        struct mnt_writer *cpu_writer;
 336
 337        cpu_writer = &get_cpu_var(mnt_writers);
 338        spin_lock(&cpu_writer->lock);
 339
 340        use_cpu_writer_for_mount(cpu_writer, mnt);
 341        if (cpu_writer->count > 0) {
 342                cpu_writer->count--;
 343        } else {
 344                must_check_underflow = 1;
 345                atomic_dec(&mnt->__mnt_writers);
 346        }
 347
 348        spin_unlock(&cpu_writer->lock);
 349        /*
 350         * Logically, we could call this each time,
 351         * but the __mnt_writers cacheline tends to
 352         * be cold, and makes this expensive2
 353         */
 354        if (must_check_underflow)
 355                handle_write_count_underflow(mnt);
 356        /*
 357         * This could be done right after the spinlock
 358         * is taken because the spinlock keeps us on
 359         * the cpu, and disables preemption.  However,
 360         * putting it here bounds the amount that
 361         * __mnt_writers can underflow.  Without it,
 362         * we could theoretically wrap __mnt_writers2
 363         */
 364        put_cpu_var(mnt_writers);
 365}
 366EXPORT_SYMBOL_GPL(mnt_drop_write);
 367
 368static int mnt_make_readonly(struct vfsmount *mnt)
 369{
 370        int ret = 0;
 371
 372        lock_mnt_writers();
 373        /*
 374         * With all the locks held, this value is stable
 375         */
 376        if (atomic_read(&mnt->__mnt_writers) > 0) {
 377                ret = -EBUSY;
 378                goto out;
 379        }
 380        /*
 381         * nobody can do a successful mnt_want_write() with all
 382         * of the counts in MNT_DENIED_WRITE and the locks held2
 383         */
 384        spin_lock(&vfsmount_lock);
 385        if (!ret)
 386                mnt->mnt_flags |= MNT_READONLY;
 387        spin_unlock(&vfsmount_lock);
 388out:
 389        unlock_mnt_writers();
 390        return ret;
 391}
 392
 393static void __mnt_unmake_readonly(struct vfsmount *mnt)
 394{
 395        spin_lock(&vfsmount_lock);
 396        mnt->mnt_flags &= ~MNT_READONLY;
 397        spin_unlock(&vfsmount_lock);
 398}
 399
 400int simple_set_mnt(struct vfsmount *mnt, struct super_block *sb)
 401{
 402        mnt->mnt_sb = sb;
 403        mnt->mnt_root = dget(sb->s_root);
 404        return 0;
 405}
 406
 407EXPORT_SYMBOL(simple_set_mnt);
 408
 409void free_vfsmnt(struct vfsmount *mnt)
 410{
 411        kfree(mnt->mnt_devname);
 412        mnt_free_id(mnt);
 413        kmem_cache_free(mnt_cache, mnt);
 414}
 415
 416/*
 417 * find the first or last mount at @dentry on vfsmount @mnt depending on
 418 * @dir. If @dir is set return the first mount else return the last mount2
 419 */
 420struct vfsmount *__lookup_mnt(struct vfsmount *mnt, struct dentry *dentry,
 421                              int dir)
 422{
 423        struct list_head *head = mount_hashtable + hash(mnt, dentry);
 424        struct list_head *tmp = head;
 425        struct vfsmount *p, *found = NULL;
 426
 427        for (;;) {
 428                tmp = dir ? tmp->next : tmp->prev;
 429                p = NULL;
 430                if (tmp == head)
 431                        break;
 432                p = list_entry(tmp, struct vfsmount, mnt_hash);
 433                if (p->mnt_parent == mnt && p->mnt_mountpoint == dentry) {
 434                        found = p;
 435                        break;
 436                }
 437        }
 438        return found;
 439}
 440
 441/*
 442 * lookup_mnt increments the ref count before returning
 443 * the vfsmount struct2
 444 */
 445struct vfsmount *lookup_mnt(struct vfsmount *mnt, struct dentry *dentry)
 446{
 447        struct vfsmount *child_mnt;
 448        spin_lock(&vfsmount_lock);
 449        if ((child_mnt = __lookup_mnt(mnt, dentry, 1)))
 450                mntget(child_mnt);
 451        spin_unlock(&vfsmount_lock);
 452        return child_mnt;
 453}
 454
 455static inline int check_mnt(struct vfsmount *mnt)
 456{
 457        return mnt->mnt_ns == current->nsproxy->mnt_ns;
 458}
 459
 460static void touch_mnt_namespace(struct mnt_namespace *ns)
 461{
 462        if (ns) {
 463                ns->event = ++event;
 464                wake_up_interruptible(&ns->poll);
 465        }
 466}
 467
 468static void __touch_mnt_namespace(struct mnt_namespace *ns)
 469{
 470        if (ns && ns->event != event) {
 471                ns->event = event;
 472                wake_up_interruptible(&ns->poll);
 473        }
 474}
 475
 476static void detach_mnt(struct vfsmount *mnt, struct path *old_path)
 477{
 478        old_path->dentry = mnt->mnt_mountpoint;
 479        old_path->mnt = mnt->mnt_parent;
 480        mnt->mnt_parent = mnt;
 481        mnt->mnt_mountpoint = mnt->mnt_root;
 482        list_del_init(&mnt->mnt_child);
 483        list_del_init(&mnt->mnt_hash);
 484        old_path->dentry->d_mounted--;
 485}
 486
 487void mnt_set_mountpoint(struct vfsmount *mnt, struct dentry *dentry,
 488                        struct vfsmount *child_mnt)
 489{
 490        child_mnt->mnt_parent = mntget(mnt);
 491        child_mnt->mnt_mountpoint = dget(dentry);
 492        dentry->d_mounted++;
 493}
 494
 495static void attach_mnt(struct vfsmount *mnt, struct path *path)
 496{
 497        mnt_set_mountpoint(path->mnt, path->dentry, mnt);
 498        list_add_tail(&mnt->mnt_hash, mount_hashtable +
 499                        hash(path->mnt, path->dentry));
 500        list_add_tail(&mnt->mnt_child, &path->mnt->mnt_mounts);
 501}
 502
 503/*
 504 * the caller must hold vfsmount_lock
 505 */
 506static void commit_tree(struct vfsmount *mnt)
 507{
 508        struct vfsmount *parent = mnt->mnt_parent;
 509        struct vfsmount *m;
 510        LIST_HEAD(head);
 511        struct mnt_namespace *n = parent->mnt_ns;
 512
 513        BUG_ON(parent == mnt);
 514
 515        list_add_tail(&head, &mnt->mnt_list);
 516        list_for_each_entry(m, &head, mnt_list)
 517                m->mnt_ns = n;
 518        list_splice(&head, n->list.prev);
 519
 520        list_add_tail(&mnt->mnt_hash, mount_hashtable +
 521                                hash(parent, mnt->mnt_mountpoint));
 522        list_add_tail(&mnt->mnt_child, &parent->mnt_mounts);
 523        touch_mnt_namespace(n);
 524}
 525
 526static struct vfsmount *next_mnt(struct vfsmount *p, struct vfsmount *root)
 527{
 528        struct list_head *next = p->mnt_mounts.next;
 529        if (next == &p->mnt_mounts) {
 530                while (1) {
 531                        if (p == root)
 532                                return NULL;
 533                        next = p->mnt_child.next;
 534                        if (next != &p->mnt_parent->mnt_mounts)
 535                                break;
 536                        p = p->mnt_parent;
 537                }
 538        }
 539        return list_entry(next, struct vfsmount, mnt_child);
 540}
 541
 542static struct vfsmount *skip_mnt_tree(struct vfsmount *p)
 543{
 544        struct list_head *prev = p->mnt_mounts.prev;
 545        while (prev != &p->mnt_mounts) {
 546                p = list_entry(prev, struct vfsmount, mnt_child);
 547                prev = p->mnt_mounts.prev;
 548        }
 549        return p;
 550}
 551
 552static struct vfsmount *clone_mnt(struct vfsmount *old, struct dentry *root,
 553                                        int flag)
 554{
 555        struct super_block *sb = old->mnt_sb;
 556        struct vfsmount *mnt = alloc_vfsmnt(old->mnt_devname);
 557
 558        if (mnt) {
 559                if (flag & (CL_SLAVE | CL_PRIVATE))
 560                        mnt->mnt_group_id = 0; /* not a peer of original */
 561                else
 562                        mnt->mnt_group_id = old->mnt_group_id;
 563
 564                if ((flag & CL_MAKE_SHARED) && !mnt->mnt_group_id) {
 565                        int err = mnt_alloc_group_id(mnt);
 566                        if (err)
 567                                goto out_free;
 568                }
 569
 570                mnt->mnt_flags = old->mnt_flags;
 571                atomic_inc(&sb->s_active);
 572                mnt->mnt_sb = sb;
 573                mnt->mnt_root = dget(root);
 574                mnt->mnt_mountpoint = mnt->mnt_root;
 575                mnt->mnt_parent = mnt;
 576
 577                if (flag & CL_SLAVE) {
 578                        list_add(&mnt->mnt_slave, &old->mnt_slave_list);
 579                        mnt->mnt_master = old;
 580                        CLEAR_MNT_SHARED(mnt);
 581                } else if (!(flag & CL_PRIVATE)) {
 582                        if ((flag & CL_PROPAGATION) || IS_MNT_SHARED(old))
 583                                list_add(&mnt->mnt_share, &old->mnt_share);
 584                        if (IS_MNT_SLAVE(old))
 585                                list_add(&mnt->mnt_slave, &old->mnt_slave);
 586                        mnt->mnt_master = old->mnt_master;
 587                }
 588                if (flag & CL_MAKE_SHARED)
 589                        set_mnt_shared(mnt);
 590
 591                /* stick the duplicate mount on the same expiry list
 592                 * as the original if that was on one */
 593                if (flag & CL_EXPIRE) {
 594                        if (!list_empty(&old->mnt_expire))
 595                                list_add(&mnt->mnt_expire, &old->mnt_expire);
 596                }
 597        }
 598        return mnt;
 599
 600 out_free:
 601        free_vfsmnt(mnt);
 602        return NULL;
 603}
 604
 605static inline void __mntput(struct vfsmount *mnt)
 606{
 607        int cpu;
 608        struct super_block *sb = mnt->mnt_sb;
 609        /*
 610         * We don't have to hold all of the locks at the
 611         * same time here because we know that we're the
 612         * last reference to mnt and that no new writers
 613         * can come in.
 614         */
 615        for_each_possible_cpu(cpu) {
 616                struct mnt_writer *cpu_writer = &per_cpu(mnt_writers, cpu);
 617                if (cpu_writer->mnt != mnt)
 618                        continue;
 619                spin_lock(&cpu_writer->lock);
 620                atomic_add(cpu_writer->count, &mnt->__mnt_writers);
 621                cpu_writer->count = 0;
 622                /*
 623                 * Might as well do this so that no one
 624                 * ever sees the pointer and expects
 625                 * it to be valid.
 626                 */
 627                cpu_writer->mnt = NULL;
 628                spin_unlock(&cpu_writer->lock);
 629        }
 630        /*
 631         * This probably indicates that somebody messed
 632         * up a mnt_want/drop_write() pair.  If this
 633         * happens, the filesystem was probably unable
 634         * to make r/w->r/o transitions.
 635         */
 636        WARN_ON(atomic_read(&mnt->__mnt_writers));
 637        dput(mnt->mnt_root);
 638        free_vfsmnt(mnt);
 639        deactivate_super(sb);
 640}
 641
 642void mntput_no_expire(struct vfsmount *mnt)
 643{
 644repeat:
 645        if (atomic_dec_and_lock(&mnt->mnt_count, &vfsmount_lock)) {
 646                if (likely(!mnt->mnt_pinned)) {
 647                        spin_unlock(&vfsmount_lock);
 648                        __mntput(mnt);
 649                        return;
 650                }
 651                atomic_add(mnt->mnt_pinned + 1, &mnt->mnt_count);
 652                mnt->mnt_pinned = 0;
 653                spin_unlock(&vfsmount_lock);
 654                acct_auto_close_mnt(mnt);
 655                security_sb_umount_close(mnt);
 656                goto repeat;
 657        }
 658}
 659
 660EXPORT_SYMBOL(mntput_no_expire);
 661
 662void mnt_pin(struct vfsmount *mnt)
 663{
 664        spin_lock(&vfsmount_lock);
 665        mnt->mnt_pinned++;
 666        spin_unlock(&vfsmount_lock);
 667}
 668
 669EXPORT_SYMBOL(mnt_pin);
 670
 671void mnt_unpin(struct vfsmount *mnt)
 672{
 673        spin_lock(&vfsmount_lock);
 674        if (mnt->mnt_pinned) {
 675                atomic_inc(&mnt->mnt_count);
 676                mnt->mnt_pinned--;
 677        }
 678        spin_unlock(&vfsmount_lock);
 679}
 680
 681EXPORT_SYMBOL(mnt_unpin);
 682
 683static inline void mangle(struct seq_file *m, const char *s)
 684{
 685        seq_escape(m, s, " \t\n\\");
 686}
 687
 688/*
 689 * Simple .show_options callback for filesystems which don't want to
 690 * implement more complex mount option showing.
 691 *
 692 * See also save_mount_options().
 693 */
 694int generic_show_options(struct seq_file *m, struct vfsmount *mnt)
 695{
 696        const char *options = mnt->mnt_sb->s_options;
 697
 698        if (options != NULL && options[0]) {
 699                seq_putc(m, ',');
 700                mangle(m, options);
 701        }
 702
 703        return 0;
 704}
 705EXPORT_SYMBOL(generic_show_options);
 706
 707/*
 708 * If filesystem uses generic_show_options(), this function should be
 709 * called from the fill_super() callback.
 710 *
 711 * The .remount_fs callback usually needs to be handled in a special
 712 * way, to make sure, that previous options are not overwritten if the
 713 * remount fails.
 714 *
 715 * Also note, that if the filesystem's .remount_fs function doesn't
 716 * reset all options to their default value, but changes only newly
 717 * given options, then the displayed options will not reflect reality
 718 * any more.
 719 */
 720void save_mount_options(struct super_block *sb, char *options)
 721{
 722        kfree(sb->s_options);
 723        sb->s_options = kstrdup(options, GFP_KERNEL);
 724}
 725EXPORT_SYMBOL(save_mount_options);
 726
 727#ifdef CONFIG_PROC_FS
 728/* iterator */
 729static void *m_start(struct seq_file *m, loff_t *pos)
 730{
 731        struct proc_mounts *p = m->private;
 732
 733        down_read(&namespace_sem);
 734        return seq_list_start(&p->ns->list, *pos);
 735}
 736
 737static void *m_next(struct seq_file *m, void *v, loff_t *pos)
 738{
 739        struct proc_mounts *p = m->private;
 740
 741        return seq_list_next(v, &p->ns->list, pos);
 742}
 743
 744static void m_stop(struct seq_file *m, void *v)
 745{
 746        up_read(&namespace_sem);
 747}
 748
 749struct proc_fs_info {
 750        int flag;
 751        const char *str;
 752};
 753
 754static int show_sb_opts(struct seq_file *m, struct super_block *sb)
 755{
 756        static const struct proc_fs_info fs_info[] = {
 757                { MS_SYNCHRONOUS, ",sync" },
 758                { MS_DIRSYNC, ",dirsync" },
 759                { MS_MANDLOCK, ",mand" },
 760                { 0, NULL }
 761        };
 762        const struct proc_fs_info *fs_infop;
 763
 764        for (fs_infop = fs_info; fs_infop->flag; fs_infop++) {
 765                if (sb->s_flags & fs_infop->flag)
 766                        seq_puts(m, fs_infop->str);
 767        }
 768
 769        return security_sb_show_options(m, sb);
 770}
 771
 772static void show_mnt_opts(struct seq_file *m, struct vfsmount *mnt)
 773{
 774        static const struct proc_fs_info mnt_info[] = {
 775                { MNT_NOSUID, ",nosuid" },
 776                { MNT_NODEV, ",nodev" },
 777                { MNT_NOEXEC, ",noexec" },
 778                { MNT_NOATIME, ",noatime" },
 779                { MNT_NODIRATIME, ",nodiratime" },
 780                { MNT_RELATIME, ",relatime" },
 781                { 0, NULL }
 782        };
 783        const struct proc_fs_info *fs_infop;
 784
 785        for (fs_infop = mnt_info; fs_infop->flag; fs_infop++) {
 786                if (mnt->mnt_flags & fs_infop->flag)
 787                        seq_puts(m, fs_infop->str);
 788        }
 789}
 790
 791static void show_type(struct seq_file *m, struct super_block *sb)
 792{
 793        mangle(m, sb->s_type->name);
 794        if (sb->s_subtype && sb->s_subtype[0]) {
 795                seq_putc(m, '.');
 796                mangle(m, sb->s_subtype);
 797        }
 798}
 799
 800static int show_vfsmnt(struct seq_file *m, void *v)
 801{
 802        struct vfsmount *mnt = list_entry(v, struct vfsmount, mnt_list);
 803        int err = 0;
 804        struct path mnt_path = { .dentry = mnt->mnt_root, .mnt = mnt };
 805
 806        mangle(m, mnt->mnt_devname ? mnt->mnt_devname : "none");
 807        seq_putc(m, ' ');
 808        seq_path(m, &mnt_path, " \t\n\\");
 809        seq_putc(m, ' ');
 810        show_type(m, mnt->mnt_sb);
 811        seq_puts(m, __mnt_is_readonly(mnt) ? " ro" : " rw");
 812        err = show_sb_opts(m, mnt->mnt_sb);
 813        if (err)
 814                goto out;
 815        show_mnt_opts(m, mnt);
 816        if (mnt->mnt_sb->s_op->show_options)
 817                err = mnt->mnt_sb->s_op->show_options(m, mnt);
 818        seq_puts(m, " 0 0\n");
 819out:
 820        return err;
 821}
 822
 823const struct seq_operations mounts_op = {
 824        .start  = m_start,
 825        .next   = m_next,
 826        .stop   = m_stop,
 827        .show   = show_vfsmnt
 828};
 829
 830static int show_mountinfo(struct seq_file *m, void *v)
 831{
 832        struct proc_mounts *p = m->private;
 833        struct vfsmount *mnt = list_entry(v, struct vfsmount, mnt_list);
 834        struct super_block *sb = mnt->mnt_sb;
 835        struct path mnt_path = { .dentry = mnt->mnt_root, .mnt = mnt };
 836        struct path root = p->root;
 837        int err = 0;
 838
 839        seq_printf(m, "%i %i %u:%u ", mnt->mnt_id, mnt->mnt_parent->mnt_id,
 840                   MAJOR(sb->s_dev), MINOR(sb->s_dev));
 841        seq_dentry(m, mnt->mnt_root, " \t\n\\");
 842        seq_putc(m, ' ');
 843        seq_path_root(m, &mnt_path, &root, " \t\n\\");
 844        if (root.mnt != p->root.mnt || root.dentry != p->root.dentry) {
 845                /*
 846                 * Mountpoint is outside root, discard that one.  Ugly,
 847                 * but less so than trying to do that in iterator in a
 848                 * race-free way (due to renames).
 849                 */
 850                return SEQ_SKIP;
 851        }
 852        seq_puts(m, mnt->mnt_flags & MNT_READONLY ? " ro" : " rw");
 853        show_mnt_opts(m, mnt);
 854
 855        /* Tagged fields ("foo:X" or "bar") */
 856        if (IS_MNT_SHARED(mnt))
 857                seq_printf(m, " shared:%i", mnt->mnt_group_id);
 858        if (IS_MNT_SLAVE(mnt)) {
 859                int master = mnt->mnt_master->mnt_group_id;
 860                int dom = get_dominating_id(mnt, &p->root);
 861                seq_printf(m, " master:%i", master);
 862                if (dom && dom != master)
 863                        seq_printf(m, " propagate_from:%i", dom);
 864        }
 865        if (IS_MNT_UNBINDABLE(mnt))
 866                seq_puts(m, " unbindable");
 867
 868        /* Filesystem specific data */
 869        seq_puts(m, " - ");
 870        show_type(m, sb);
 871        seq_putc(m, ' ');
 872        mangle(m, mnt->mnt_devname ? mnt->mnt_devname : "none");
 873        seq_puts(m, sb->s_flags & MS_RDONLY ? " ro" : " rw");
 874        err = show_sb_opts(m, sb);
 875        if (err)
 876                goto out;
 877        if (sb->s_op->show_options)
 878                err = sb->s_op->show_options(m, mnt);
 879        seq_putc(m, '\n');
 880out:
 881        return err;
 882}
 883
 884const struct seq_operations mountinfo_op = {
 885        .start  = m_start,
 886        .next   = m_next,
 887        .stop   = m_stop,
 888        .show   = show_mountinfo,
 889};
 890
 891static int show_vfsstat(struct seq_file *m, void *v)
 892{
 893        struct vfsmount *mnt = list_entry(v, struct vfsmount, mnt_list);
 894        struct path mnt_path = { .dentry = mnt->mnt_root, .mnt = mnt };
 895        int err = 0;
 896
 897        /* device */
 898        if (mnt->mnt_devname) {
 899                seq_puts(m, "device ");
 900                mangle(m, mnt->mnt_devname);
 901        } else
 902                seq_puts(m, "no device");
 903
 904        /* mount point c#L898" id="L898" class="line" name905" id="L9t_groOss="l6sb" class="sref">mnt_sb 903ed onf="+code=seq_puts" class="sref">seq_puts6class="li name="L895"> 895  9ce.c#9805" id="L805" class="line" n#39; ');
 808        seq_path(m, &mnt_devna9e9: "none");
 807        se9_putc9mnt_path9/a>, 9span class="strclass="line" name="L903"tic  7
, &#nt point c#L898" id="L898" class="line" name905" id="L9t_groOss="l6sb" class="sref">mnt_sbm, &mnt->9 810        show_type(m, " ro"9/span911" id="L821" class="line" name=9ref="+cod9=mnt" class="sref">mnt->9 813    9   if (mnt);
 816        if (mnt->        if ( 814       9     91 href="+code=dentry" cstring">"none");
 807        se9opts(9a href="+code=m" class="9ref">91( 817                err = mnt->->s_op->show_op9op" class9"sref">s_op->s_subtyp9ions(9a href="+code=m" class="9ref">91t 9,91/a>, mnt);
 879        seq9819" id="9819" class="line" name="9819">9819out:
 820 9     9return err9/a>;
 829}
 822
 823constlasLamea href="+code=seq_operations" clas9 class="s9ef">seq_operations <9 href9"+code=mounts_op" class="sref">mounts_op = {
 824        .start  = 9a href="+code=m_start" class="sref">m_start,
 825        .next<9a>   9 m_next,
 826        .stop<9a>   9 m_stop,
 826        .(9ss="sref">show   = <9 href9"+code=show_vfsmnt" class="sref">s9ow_vfsmnt9/a>
 8289/a>};
m9/a>, vrclass="line" name="L903) {
v9/a>)
cons_tref=- checkf"+ca"> 903 829ode=m" class="sref">m 903vfsmountmnt<9a>-&g9; 903s has any {
 903s " id=arf {
 837  9     93 than trying to do that in i href="fs/namespace.c#L904" id="L9048w_vfsmnt9 = 0;
mntcons_trefan>);
 892{
seq_f9t_parent"9class="sref">mnt_parent<9a>-&g9;sb<9a>-&g9;mnt
ef="fs/namespace.c#L895" id="L895" 9de=mnt_ro9t" class="sref">mnt_root9/a>, 9span class="st" class="sref">mnt
ef="fs/namespace.c#L895" id="L895" 9d821"> 829 892{
root9/a>, 94/a>, roo9.94 /* moupin_/a>);
 808 s/namesp_/a>);
show_op9d="L845" 9lass="line" name="L845">9845 832        struclass="line" name="L893"class="sref">mm        str" na_uclass="line" name" na_ucl/namespace.c#L879" iget_dominating_id" cl="sref">s_op->
ef="f+32        stratomicss="s
 808 get_dominating_id" class="sref">get_domin"+coc892{
show_op9dass="lin9">                 * but9less 94de=show_options" class="sref">show_o/inimum_"sr>
ef="f+322tions" class="sref">show_op9dw_vfsmnt9  9     94/a>,  949, &#pin_un/a>);
 808 s/namesp_/a>);
show_op9"L850"> 890                ret9rn show_op9"e=mnt_ro9href="fs/namespace.c#L859" id=9L851" class="l"+code=mnt" class="actual_"sr>
ef="fss="ss="sref">show_o/inimum_"sr>
ef="eq_file" class="sref">seq_f9pan class9"string">" ro"9/span9 : (9a href="+code=m" class="9ref">9, mnt9/a>);
/* Tagged 9ields9(" IS_MN9_SHAR95class="string">" unbindabl9nt" class9"sref">mnt->show_oEXPORT_SYMBOL
cons_trefan>);
show_op9"w_vfsmnt9AVE" class="sref">IS_MNT9SLAVE95" id="L828" class="line" name="9ass="sref9>mnt_master->96a>, vrclass="line" name="L9 * may_u>cons=- checkf"+ca"> 903&qu9t; master:%i",961" id  * race-free way (due * @=sh:ce.c# of"> 903 {
dom9/a> !96 href  * race-free way (due * {
(9 propagate_from:%i&q9ot; 903);
 903s. If thf {
IS_MNT_UN9INDAB96                 903 903s " is will"="+codebusy {
m9  903s are busy" id="L848" class="line" name="L849");
 868        m, vrclass="line" name="L9 * a non-declass=ive "fs/co lookd cla="sily u>cons="+c"tic s
s" id="L848" class="line" name="L849_putc9mnt_devna9e9: mntconsan>);
 892{
seq_f9pan class9"string">" ro"9/span9 :         if ( =  875    9705" id="L805" class="line" n#pin_/a>);
 808 s/namesp_/a>);
show_op9"line" na9e="L876"> 876       9     9  goto doms_op->show_o="+ass="line" name="+" cl832namespace.c#L895" id="L895" 9ions(9a href="+code=m" class="9ref">9, );
 808 s/namesp_/a>);
show_op9putc(9a href="+code=m" class="9ref">9819show_op9pmp;98eturn  881 9     981" id="L821" class="line" name=9sref">err9/a>;
show_oEXPORT_SYMBOL
consan>);
show_op9pan class9}
s9q_operations sho=out" class="sr="l="se831{
start  = 9a href>        if (next<9a>   9  892{
show_op9pp" class9stop" class="sref">stop<9a>   9 show   = mnt_dev class="line" name="L893"> 893        structfiruct mnt = list_entry(hasshow_op9ountinfo<9a>,
"device &quoount"del_inif="+code=list_enount"del_inifc#L89ame="L808"> 808 d="L817" class="line" name="L817"> 817       hasshow_op9omp;};
mnt);
        if (m99class="line" name="L9ef="+cod1" id="L891" class="lit show_op9oref">err9/a>)
 892{
show_op9oan class9class="sref">vfsmount"device &quo#pin_/a>);
 808 s/namesp_/a>);
show_op9, ."device " path mnt_path = m
show_op9o+code=st9" name="L895"> 895  9     99("device &quo ass="line" name=s="sref">path mnt_path = >show_op9of="+code9 = 0;
"device &quo ef="+code=mnt_path" class="sref">mnt_path = m
path mnt_path = { .show_op9op" class9ss="line" name="L897"> 89799de=show_options" clasring">"device &quo ef="+code=mnt_path" class="sref">mnt_path = >show_op9olass="sr9="sref">mnt->"device &quo ass="line" name=s="sef">master = {
show_op10>((mnt->(<>10>(f="+code=mntlass="string">"device &quo#pin_un/a>);
 808 s/namesp_/a>);
show_op10>1a>};
"device &quodping">'\n'dpin/namespace.c#L879" if">dentry != show_op10>2href="+code=m" class="s10>hr>10>class="line" name="L9ef="+codaster = '\n'hrepin/namespace.c#L879" idass="line" name=s="s=cions" class="sref">show_op10>3a>)
4lass="sref">vfsmountla>10>ef="+code=mntlass="staster = '\n'hrepin/namespace.c#L879" idgt;show_op10>5"+code=mnt" class="sref10>"+>10> href="+code= 6 name="L895"> 895  10> n>10>" 7= 0;
" unbindabl10>8s="line" name="L897"> 810>s=>10>8ount">sho=out" class="sru>cons_trefan>);
 892{
mnt =ount"h="s
9"sref">mnt->"s>10>9href>        if (10 892{
mnt10show_op10<2" ro"10"st>10 832        struclass="line" name="L893"class="sref">mm        str" na_uclass="line" name" na_ucl/namespace.c#L879" iget_dominating_id" cl="sref">c#L879" idgt;mnt10<: mnt =ount"moveet_dominating_iount"movec#L89ame="L808"> 808 get_dominating_id" class="sref">get_domin"+cohasc#L879" ikill
 81310,  814       10e=">10, consan>);
cons/namespace.c#L879" ikill
s_op->10" unbindabl1018        structfor_eacht c#L879" ikill
list_entry(has10="+>10mnt_devount"del_inif="+code=list_enount"del_inifc#L89ame="L808"> 808 get_dominating_id" class="sref">get_domin"+coexpirfan>);
mnt_devount"del_inif="+code=list_enount"del_inifc#L89ame="L808"> 808 get_dominating_id" class="sref">get_domin"+cov, struct  820 10e" >108gt;get_domin"+coa>
ef">v, struct >108class="line" name="L901"> 901   get_dominating_id" class="sref">get_domin"+coa>
ef">832        strNULL
}
mnt =ount"del_inif="+code=list_enount"del_inifc#L89ame="L808"> 808 get_dominating_id" class="sref">get_domin"+cochil=mnt" class="sref">mchil=ef">v, struct seq_operations <10ef">108ef="+code=mntlass="stf="+code=sb" class=det_dominating_id" class="sref">get_domin"+co>        if (start108 href="+code=dentry" ring">"device &quodet_dominating_id" class="sref">get_domin"+co>master = {
, struct next<10nex>108("device &quodet_dominating_id" class="sref">get_domin"+com
get_domind_> 903edtry !=  903eds="se-cions" class="sref">show_op1027stop<10sto>108(show   = <10ss=>108de=show_options" class="sref">show_ochangetlassdf="+codiontry != c#L879" iMS_PRIVATEet_dominating_iMS_PRIVATEef">v, struct >108/a>, };
show_op1032)
sho=out" class="srshrink_sub31{
 892{
mnt =ount"h="s
{
m10/n class="string">"no devic10/4vfsmount10/4lassd="L890s="sref">mnt_group_id=u>consan>);
 892{
seq_puts(mnt<10e=m>10/5href>        if (10/()ace.c#L893" id="L893"d="L878" class="line" namespace.c#L817" id="L817" class="line" name="L817"> 817                , struct  837  10" n>10/67" id="L867" 3        sLIST_HEAD
cons_cons_, struct 10/" id="L828" class="line" name="104(mnt_parent<10cla>10cl7" id="L867" 3        s="+val
consan>);
cons/namespace.c#L879" idgt;c#L879" iref">seq_puts(, struct sb<10ode>10cmnt_root10t" >10cclass="line" name="L9="+code=out" class="sr="+val
, struct 10cn class="string">"no devic1044root10=ro>10c03" id="L903" class="line" name="L903ref="fs/namespace.c#L904" id="L9010c5roo10e=r>10c 903href="be expirfd rathfr thanref="fs/namespace.c#L904" id="L9010c610las>10c                 888g uncondis="sally. Un8"> 8 only happensd"=:ref="fs/namespace.c#L904" id="L9010c7                 * Moun10>  >10cs outside root, discard that        *  (1) thf mark=is als="sy set (thf mark=is clearfd by hrepin())ref="fs/namespace.c#L904" id="L9010c8                 * but10"> >10c than trying to do that in i        *  (2) thf usage c892< == 1 [" clas s/namesp] + 1 [sys=u>cons]ref="fs/namespace.c#L904" id="L9010c9  1010c       * race-free way (due         *href="fs/namespace.c#L904" id="L90105( 10ass>10asa href="+cod"="+code=sb" class=ref">seq_puts(mNT_EXPIREet_dominating_iMNT_EXPIRE" clpa>        if (mnt);
show_ocurt; 817   r>
 817   { .dentry = 10aclass="line" name="L9ef="code=sb" class=ref">seq_puts(mNT_DETACHet_dominating_iMNT_DETACHow_op  if (" ro"10"st>10a: m);
 808 d="L817" class="line" name="L817"> 817       c892{
2  if (/* Tagged 10ass>10a(&q="+code-ass="sref">m, struct IS_MN10ARE>10aclass="string">" unbindabl1058mnt->10ade=show_options" clas"+co!L891" class="lixchgf="+code=sb" clxchgc#L89ame="L808"> 808 d="L817" class="line" name="L817"> 817       expiry_markan>);
IS_MNT10AVE>10ade=mnt_devname" classring">&q="+code-ass="sref">m, struct show_op106210>class="line"  class="line" name="L903ref="fs/namespace.c#L904" id="L901063dom10de=>10> href  * race-free way (due         * If wf may hav=/co abort ace.c#L823/co get ou# of"" isref="fs/namespace.c#L904" id="L90106410>ef="+  * race-free way (due         * >cons, and thfy will"thfmselves hold resources wf mus3 {
56IS_MNT_UN10" c>10>                m10de=>10>s outside root, discard that        * might failspaccomplede onfthf firuc runfthrough as othfr tasksref="fs/namespace.c#L904" id="L901068);
9 868        10>       * race-free way (due         * abou#  clathf m y (d" id="L848" class="line" name="L84107(10rref="ions" class="sref">show_op107210r851" class="l"+code=mnt" class="ref">seq_puts(mNT_FORCEet_dominating_iMNT_FORCE" cla=m" c=m" class="sref">merr = mnt-&uamesp_beginref="+code=v" cu>cons_beginreclpa>        if (mnt_devna10" c>10r: mnt =oock_kernel
" ro"10"st>10ref="+code=mntlass="staster = err = mnt-&uamesp_beginref="+code=v" cu>cons_beginreclode=mnt" class="d="L878" class="line" n , struct 10r href="+code=dentry" cstring">"un/a>)_kernel
 87510r6a>,  876       10e=">10rclass="string">" unbindabl1078s_op->10r8lass="line"  class="line" name="L903ref="fs/namespace.c#L904" id="L901079 881 10e" >10a1" id  * race-free way (due         * co rootfs. GCcwould ev (dually take care of"" e old s/namesp" id="L848" class="line" name="L841083;
10aef="+  * race-free way (due         * /reb.c# - d="L890binary " id=would clos=/all descriptors and id="L848" class="line" name="L8410a5 10astart10a                next<10nex>10a goto mnt);
show_ocurt; 817   r>
 817   { .dentry = seq_puts(mNT_DETACHet_dominating_iMNT_DETACHow_op a>        if (stop<10sto>10ade=show_options" classclass="line" name="L903ref="fs/namespace.c#L904" id="L901089show   = >10a       * race-free way (due                 * Saecial case/ clae=m" cun8"> 888g,>10a>      * race-free way (due                 * wf jus3qtry/co reamesp i3q="adonly.ref="fs/namespace.c#L904" id="L901091};
 901   down_wrideet_dominating_idown_wridec#L89ame="L808"> 808 d="L878" class="line" n" class="sref">erru>consan>);
consc#L8ptions" class="sref">show_op10a3)
errref">seq_puts(ref">+code=m" class="sref">mS_RDONLef="+code=sb" cl>S_RDONLeow_op a>        if (vfsmount10aef="+code=mntlass="string">"device &quooock_kernel
10a href="+code=dentry" ring">"device &quo="+val
c#L879" iMS_RDONLef="+code=sb" cl>S_RDONLeow_o="sref">c#L879" iNULL
, struct  895  10" n>10a("device &quoun/a>)_kernel
 810ss=>10ade=show_options" class="sref">show_oup_wrideet_dominating_iup_wridec#L89ame="L808"> 808 d="L878" class="line" n" class="sref">erru>consan>);
consc#L8ptions" class="sref">show_op10a9mnt->, struct mnt->(<>110ma>, 1a>};
show_op11>2href="+code=m" class="s11>hr>11>class="line" 01"> 901   down_wrideet_dominating_idown_wridec#L89ame="L808"> 808 sref">sho_sedass="line" namesref">sho_sedc#L8ptions" class="sref">show_op11>3a>)
err);
 808 s/namesp_/a>);
show_op11>4lass="sref">vfsmountla>11>ef="+code=mntL808"> 808 ev (d;
, struct 11> href/a>, struct  895  11> n>110(seq_puts(mNT_DETACHet_dominating_iMNT_DETACHow_op /a>, struct = >110(c#L89ref">dentry =  808 u>cons_cons_, struct  811>s=>110t mnt->"s>110/a>, m, struct 111sa href="+cod"="+code=sb" class=ref">seq_puts(mNT_DETACHet_dominating_iMNT_DETACHow_o || !L891" class="lief="+code=amesp_busyet_dominating_idf="+code=amesp_busy/namespace.c#L879" idde=dom" class="sref">dom        if (mnt111gt; 808 d="L817" class="line" name="L817"> 817       v /a>, struct " ro"11"st>111class="line" name="L9ef="+codaster = cons_trefan>);
dom 808 u>cons_cons_, struct mnt11<: mnt =="+val
 813111ef="+code=mnt  814       11e=">11, err);
 808 s/namesp_/a>);
show_op11<6mnt =="+val
, struct s_op->111(domptions" class="sref">show_op11<8        sup_wrideet_dominating_iup_wridec#L89ame="L808"> 808 sref">sho_sedass="line" namesref">sho_sedc#L8ptions" class="sref">show_op11<911="+>111/a>, {
 808 u>cons_cons_, struct , struct  820 11e" >112eturn ;
}
seq_operations <11ef">112ef="+  * race-free way (due * Now uamesp c rahandle"> 903) devices" id="L848" class="line" name="L841125start112
sdwhichluse unstard b/a>) devices" id="L848" class="line" name="L841126next<11nex>112                stop<11sto>112s outside root, discard that* We now support a ref=  clatorcrd un8"> 8 like"" e othfr      big iroshow   = <11ss=>112 than trying to do that in i  unixes. Our API is iref=icalspacOSF/1/co a">shomak88g a mhrefof"AMD id="L848" class="line" name="L841129
>11/aquot/namespace.c#L904" id="L901131consan>);
);
c#L879" ilassass="line" namesrefc#L8, ins, code=sb" class=ref">seq_puts(, struct >11/class>        if (m113: , struct vfsmount113ef="+code=mnt=code=mnt" class="s="+val
, struct mnt<11e=m>113 href/a>, struct 11305" id="L805" class="line" n="+val
 808 gat, struct  837  11" n>113de=show_options" clasgoco ode=out" class=oing">'\n'ouL893"cions" class="sref">show_op1139mmnt_parent<11cla>114sa href="+cod"="+code=sb" class=gatdentryt dentryref="+code=mnt_path" class="sref">mnt_path = { ., struct sb<11ode>114gt;'\n'dpin_and_oin=err, struct mnt_root11t" >114851" class="l"+co!L891" class="licheck_uclass="line" namecheck_uclc#L89space.c#L879" idatdentryref="+code=mnt_path" clasv /a>, struct 114: '\n'dpin_and_oin=err, struct root11=ro>114/a>, roo11e=r>114m, errm11las>114(, struct '\n'dpin_and_oin=err, struct                  * but11"> >114t   11114/a>, consc#L89space.c#L879" idatdentryref="+code=mnt_path" clas="sref">c#L879" iref">seq_puts(, struct  11ass>11asa hrode=out" class=dpin_and_oing">'\n'dpin_and_oin=err:/a>, struct 115class="line" 01"> 901   dping">'\n'dpin/namespace.c#L879" igatdentryt " ro"11"st>115: err);
dentryref="+code=mnt_path" clasv, struct '\n'ouL893":/a>, struct >11a href="+code=="+code=out" class="sr="+val
, struct /* Tagged 11ass>115" IS_MN11ARE>11aclass="string">" unbindabl1158mnt->11ade=sh#ifdefot" class="sref"__ARCH_WANT_SYS_OLDUMOUNTan>);
" unbindabl1159IS_MNT11AVE>115" id="L828" class="line" name="116(mnt_master->mn>116>      * race-free way (due03ref="fs/namespace.c#L904" id="L901161dom11de=>1162" ids="sref">show_oSYSCALL_DEFINE1an>);
consan>);
);
c#L879" ilassass="line" namesrefc#L8 /a>, struct         if (116 href="+code=="+code=out" class="srsys=u>conset_dominating_isys=u>consc#L89space.c#L879" ilassass="line" namesrefc#L8, 0 , struct IS_MNT_UN11" c>116" m11de=>116class="string">" unbindabl1168);
" unbindabl1169 868        116" id="L828" class="line" name="117(mnt_group_>cons_is_saffan>);
 808 gat11rref=">        if (11r851" class="l"+code=mnt" class="cap="+cass="line" namecap="+cc#L89space.c#L879" iCAP_SYS_ADMINf="+code=sb" clCAP_SYS_ADMINclasv /a>, struct mnt_devna11" c>11r: " ro"11"st>11ref="+code=mnt="+code-ass="sref">m11r href#ifdefot" class="sref"notyelass="line" name"otyel id="L828" class="line" name="1176 875117(mnt =S_ISLNKan>);
get_domind get_domind_inomiref="+code=path"_inomis="sass="sref">get_domini_momiref="+code=pathi_momiclasv /a>, struct  876       11e=">117(ms_op->11r8lass="line" "="+code=sb" class=gatget_domind get_domind_inomiref="+code=path"_inomis="sass="sref">get_domini_momiref="+code=pathi_momiclase=m" class="sref">m);
 817   uis
               datget_domind get_domind_inomiref="+code=path"_inomis="sass="sref">get_domini_uis
&q="+code-ass="sref">m 881 11e" >118851" class="l"+code=mnt" class="inomi_permissiontry != get_domind get_domind_inomiref="+code=path"_inomis="s="sref">c#L879" iMAY_WRITEet_dominating_iMAY_WRITEclasv /a>, struct >118: m}
 11a" unbindabl1186start118" next<11nex>118class="string">" unbindabl1188stop<11sto>11ade=sh1" id="L891" class="li2"> 892{
);
 892{
mnt =t " unbindabl1189show   = >118de=mnt_devname" classring">&qt_devname" class"code=mnt" class="sref"seq_puts(,>11a>    >        if (>119gt; 892{
{
 808 ga href="+code=sp893","*L808"> 808 qa href="+code=sq893","*L808"> 808 ran>);
 808 >{
, struct >119n class="string">"no devic1194vfsmount11aef="+code=mnt"+co!ode=mnt" class="ref"seq_puts(mm, struct 11a href="+code=dentry" ="+code=out" class="srNULL
 895  11" n>11a(mespace.c#L895" id="L895" 1197{
c#L879" it ( 811ss=>1198lass="line" "="+!L891" class="liqa href="+code=sq893" /a>, struct mnt->((mnt->(<>120l7" id="L867" 3        sqa href="+code=sq893"ass="sref">get_domin"+com
 817       m
1a>};
show_op12>2href="+code=m" class="s12>hr>12>class="line" 01"> 901   ga href="+code=sp893"amespace.c#L817" id="L817" class="line" namamespace.c#L895" id="L895" 12>3a>)
err);
 808 d="L817" class="line" name="L817"> 817       31{
mchil=ef">va>        if (vfsmountla>12>ef="+code=mnt="line" "="+!L891" class="liis_subdiran>);
);
 817       m
c#L879" it 5"+code=mnt" class="sref12>"+>120 href="+code=dentry" ring">&qcontinueamespace.c#L895" id="L895" 12>6 name="L895"> 895  12> n>120(mespace.c#L895" id="L895" 12>7= 0;
);
mmc#L879" iran>);
        if ( 812>s=>120de=show_options" clas="line" "="+!ode=mnt" class="ref"seq_puts(mm9"sref">mnt->"s>120de=mnt_devname" classring">&qt_devnamass="sref">m);
121(f="+code=mntlass="string">&qring">&qcontinueamespace.c#L895" id="L895" 12<1mnt121gt;" ro"12"st>121class="line" name="L9ef="+codwhile"+code=sb" class=ga href="+code=sp893"a/a>               d{
get_domin"+co>mnt12<: &qt_devnamass="sref">mget_domin"+co> 813121ef="+code=mnt="line" ring">&qt_devnamass="sref">mget_domin"+co> 814       12e=">121 href="+code=dentry" ring">&q "device &quoga href="+code=sp893"amespace.c#L817" i>{
s_op->121("device &quogatdentryref="+code=mnt_path" class/namespace.c#L827qa href="+code=sq893", struct dentryt get_domin"+com
12="+>121de=mnt_devname" classring">&qamespace.c#L827qa href="+code=sq893"s/namespace.c#L827clone_uclass="line" nameclone_uclc#L89space.c#L879" iga href="+code=sp893","space.c#L817" idet_dominating_id" class="sref">get_domin"+co{ .(&q"="+!L891" class="liqa href="+code=sq893" /a>, struct  820 12e" >122gt;;
 = );
 808 s/namesp_/a>);
show_op1223}
&qss="sref">err 808 qa href="+code=sq893"ass="sref">get_domin"+co,"ame="L808"> 808 re>{
 817       vtions" class="sref">show_op1224seq_operations <12ef">122ef="+code=mntlass="string">"device &quoattachtuclass="line" nameattachtuclc#L89space.c#L879" iqa href="+code=sq893","ame="L808"> 808 gatstart122 href="+code=dentry" ring">"device &quoapin_un/a>);
 808 s/namesp_/a>);
show_op1226next<12nex>122(stop<12sto>122(show   = <12ss=>122de=show_optio="+code=out" class="sr=">{
show_op1229
, struct >123sa href="+cod"="+code=sb" class==">{
        if (cons_cons_, struct >123class="line" name="L901"> 901   apin_/a>);
 808 s/namesp_/a>);
show_op1233m123: mnt =u>cons_trefan>);
{
 808 u>cons_cons_, struct vfsmount123ef="+code=mntlass="stuot;device &quoapin_un/a>);
 808 s/namesp_/a>);
show_op1235mnt<12e=m>123 href="+code=dentry" cstring">"="l="se831{
 808 u>cons_cons_, struct 1236a>,  837  12" n>123de=sh mnt_parent<12cla>124e    d= id="L891" class="li2"> 892{
{
 892{
mnt =t sb<12ode>124ref=">        if (mnt_root12t" >124class="line" 2" class="line" name="2"> 892{
);
124: err 808 sref">sho_sedass="line" namesref">sho_sedc#L8ptions" class="sref">show_op1244root12=ro>124ef="+code=mntL808"> 808 trefan>);
show_op1245roo12e=r>124m, err 808 sref">sho_sedass="line" namesref">sho_sedc#L8ptions" class="sref">show_op124612las>124(                 * Moun12>  >124(                  * but12"> >124t   12124/a>, ">shoL893" id="L893"trop_collec ed 31{
 892{
, struct  12ass>125>    >        if (cons_cons_, struct 125class="line" 01"> 901   down_wrideet_dominating_idown_wridec#L89ame="L808"> 808 sref">sho_sedass="line" namesref">sho_sedc#L8ptions" class="sref">show_op1253" ro"12"st>125: err);
 808 s/namesp_/a>);
show_op1254 808 u>cons_trefan>);
dom 808 u>cons_cons_, struct >125m, err);
 808 s/namesp_/a>);
show_op1256/* Tagged 12ass>12505" id="L805" class="line" nup_wrideet_dominating_iup_wridec#L89ame="L808"> 808 sref">sho_sedass="line" namesref">sho_sedc#L8ptions" class="sref">show_op1257IS_MN12ARE>125(c#L89ame="L808"> 808 u>cons_cons_, struct mnt->125de=sh IS_MNT12AVE>125" id="L828" class="line" name="126(mnt_master->mn>126e    d="L890">shoL893" id="L893"cleanup_group_id>{
 892{
mnt =2"> 892{
        if ( 892{
, struct dom12de=>126n class="string">"no devic1264126ef="+code=mnt claode=mnt" class="ga href="+code=sp893"amespace.c#L817" id="L817" class="line" namaquot;device &quoga href="+code=sp893"a/a>               en=mnt" class="sreens         if (126 href="+code=dentry" "="+code=sb" class=ga href="+code=sp893"e="L817"> 817       group_idref="+code=v" classgroup_idhref==m" c=m" cl!17"> 817   IS_MNT_SHARED{
, struct IS_MNT_UN12" c>126("device &quoentry"l="se8group_idref="+code=v" classy"l="se8group_id/namespace.c#L879" iga href="+code=sp893"v, struct m12de=>126();
 868        126" id="L828" class="line" name="127(mnt_group_inv (d_group_id>{
 892{
12rref=">        if (127class="line" 2" class="line" name="2"> 892{
, struct mnt_devna12" c>127n class="string">"no devic1274" ro"12"st>127ef="+code=mnt claode=mnt" class="ga href="+code=sp893"amespace.c#L817" id="L817" class="line" namaquot;device &quoga href="+code=sp893"aquot;device &quoga href="+code=sp893"amespace.c#L817" irecurseet_dominating_irecurse         if (127 href="+code=dentry" "="+!L891" class="liea href="+code=sp893"e="L817"> 817       group_idref="+code=v" classgroup_idhref==m" c=m" cl!17"> 817   IS_MNT_SHARED{
        if ( 875127(&qs="sref">mnt_group_erran>);
, struct  876       12e=">127();
        if (s_op->127de=show_options" clas="line" ring">"device &quocleanup_group_id>{
, struct , struct &q  881 12e" >128851" class="l ;
"no devic1284}
 12astart128(mespace.c#L895" id="L895" 1287next<12nex>128s outside root, discard tha03ref="fs/namespace.c#L904" id="L901288stop<12sto>128 than trying to do that in i   @source_ucl :e8"> 8 tref/co be attachedref="fs/namespace.c#L904" id="L901289show   = >128       * race-free way (due *  @nd+code=roo: plid="" e 8"> 8 tref/@source_ucl is attachedref="fs/namespace.c#L904" id="L90129(,
>129a>, vrclass="line" name="L9 *+code============stor="" e " clas 8"> 8 and m
>129 href  * race-free way (due=3 id="L848" class="line" name="L841294vfsmount129ef="+  * race-free way (due *  NOTE: "n"" e t="+c below expliins"" e semaf=ics when a source amespacd="L848" class="line" name="L841295129 8 of"a giv ( type" id="L848" class="line" name="L841296 895  12" n>129                129s outside root, discard that* |=========BIND MOUNT OPERATIONt_devname" classssssssssssssssssssssssssssss| id="L848" class="line" name="L841298 812ss=>129 than trying to do that in i  |************************************************************************** id="L848" class="line" name="L841299mnt->mnt->(<>130>      * race-free way (due * | " stde=ro|=======+code=ro|========+code=ro|========+code=ro|========+cod| id="L848" class="line" name="L8413>1a>};
a>>130 href  * race-free way (due=3 |************************************************************************** id="L848" class="line" name="L8413>4lass="sref">vfsmountla>130ef="+  * race-free way (due * |==sh cld+c| sh cld+(++)=ro|=====sh cld+(+)o|=====sh cld(+++)|&qs=validcod| id="L848" class="line" name="L8413>5"+code=mnt" class="sref13>"+>130 895  13> n>130                = >130s outside root, discard that* *************************************************************************** id="L848" class="line" name="L8413>8s="line" name="L897"> 813>s=>130 than trying to do that in i  A bind operation clones"" e source 8"> 8 and m
mnt->"s>130       * race-free way (due * " stination 8"> 8" id="L848" class="line" name="L84131(131>      * race-free way (due * id="L848" class="line" name="L841311mnt131a>, vrclass="line" name="L9 *+(++)=r" e cloned m
 8s "n"" e propagationc#d="L848" class="line" name="L841312" ro"13"st>1311" id  * race-free way (due *+code==tref/of"" e " stination 8"> 8 and " e cloned m
mnt131 href  * race-free way (due=3 code==t e peer group/of"" e source 8"> 8" id="L848" class="line" name="L841314 813131ef="+  * race-free way (due * (+)o=r" e cloned m
 8 and is markedref="fs/namespace.c#L904" id="L9013<5 814       13e=">131 8" id="L848" class="line" name="L841317s_op->131s outside root, discard that* (+++)"" e 8"> 8 is propagated/co all"" e 8"> 8s "n"" e propagation trefc#d="L848" class="line" name="L841318 8 and " e cloned m
13="+>131       * race-free way (due *       of"" e ssre master as " id=of"" e source 8"> 8"=The cloned m
 820 13e" >132a>, vrclass="line" name="L9 *+(*)o=r" e cloned m
>1321" id  * race-free way (due *+code==source 8"> 8" id="L848" class="line" name="L841323}
seq_operations <13ef">132ef="+  * race-free way (due * --------------------------------------------------------------------------- id="L848" class="line" name="L841325start132next<13nex>132                stop<13sto>132s outside root, discard that* |=source-e="L8| sh cld+code=ro|=======privatero|=======slavee=ro|=unbind="+c | id="L848" class="line" name="L841328show   = <13ss=>132 than trying to do that in i  | " stde=ro|=======+code=ro|========+code=ro|========+code=ro|========+cod| id="L848" class="line" name="L841329
>133>      * race-free way (due * | ==v======|=======+code=ro|========+code=ro|========+code=ro|========+cod| id="L848" class="line" name="L841331>1331" id  * race-free way (due *+|==sh cld+c| sh cld+(+)o=ro|=====sh cld+(+)o|====sh cld(+++)o|==s=validcod| id="L848" class="line" name="L841333m133 href  * race-free way (due=3 |==+code=ro|========+code=r|========+code=ro|========+code=ro|========+cod| id="L848" class="line" name="L841334vfsmount133ef="+  * race-free way (due * |non-sh cld|=sh cld+(+*)=ro|======privateroo|====slavee(*)oro|=unbind="+c | id="L848" class="line" name="L841335mnt<13e=m>133133                 837  13" n>133 than trying to do that in i       all"" e 8"> 8s "n"" e propagation tref of"" e " stination 8"> 8" id="L848" class="line" name="L841339mnt_parent<13cla>134>      * race-free way (due * (+++)or" e m
sb<13ode>134a>, vrclass="line" name="L9 *+code=all"" e 8"> 8s belonging/co=t e " stination 8"> 8a hres propagation tref. id="L848" class="line" name="L841342mnt_root13t" >1341" id  * race-free way (due *+code=" e m
134 href  * race-free way (due=3 (*)=r" e m
root13=ro>134ef="+  * race-free way (due * id="L848" class="line" name="L841345roo13e=r>134 8 is a tref,"" e operations expliinld+above is id="L848" class="line" name="L84134613las>134                 8 in"" e tref. id="L848" class="line" name="L841347                 * Moun13>  >134s outside root, discard that* Mustdbe called/without apin/a>)s held, sind="" is function ce rsleep id="L848" class="line" name="L841348                 * but13"> >134 than trying to do that in i  in"allocations. id="L848" class="line" name="L841349  13134       * race-free way (due */ id="L848" class="line" name="L84135( 13ass>135e    d="L890s="sref">mnt_group_attachtrecursive_uclass="line" nameattachtrecursive_uclc#L892" class="line" name="2"> 892{
{
mnt =pat135class>        if (" ro"13"st>135: err, struct  892{
{
get_domind="L817" class="line" namamespace.c#L895" id="L895" 1355);
mnt =t get_domint /* Tagged 13ass>13505" id="L805"d= id="L891" class="li2"> 892{
,"*L808"> 808 ga href="+code=sp893"amespace.c#L895" id="L895" 1357IS_MN13ARE>135(mnt_group_erran>);
mnt->135t IS_MNT13AVE>135de=mnt_devnam"="+code=sb" class=IS_MNT_SHARED{
{
        if (mnt_group_erran>);
{
{
, struct );
, struct );
dom13de=>136: 136ef="+code=mntref">mnt_group_erran>);
{
{
{
 808 tref_, struct 136 href="+code="="+code=sb" class=erran>);
, struct IS_MNT_UN13" c>136({
m13de=>136(mespace.c#L895" id="L895" 1368);
{
        if ( 868        136de=mnt_devname" class claode=mnt" class="ga href="+code=sp893"amespace.c#L817" isource_ucl/a>{
{
, struct &qspace.c#L817" iset_ucl_sh cld/a>{
, struct 1371 137classmnt_devna13" c>137: err);
 808 s/namesp_/a>);
show_op1374" ro"13"st>137ef="+code=mnt"="+code=sb" class=gaclas_pat137 href="+code=dentry" space.c#L879" i" tachtuclass="line" name" tachtuclc#L89L893" id="L893"source_ucl/a>{
show_op1376 875137(mnt_group_attachtuclass="line" nameattachtuclc#L89space.c#L879" isource_ucl/a>{
, struct  876       13e=">137( 808 touchtucl_a href="+ref="+code=v" ctouchtucl_a href="+c#L89space.c#L879" icurt;get_dominnsproxhref="+code=pathnsproxh get_domind="_n>{
s_op->137de=show_optio} elsea>        if (get_domind="_set_u
{
{
);
{
 881 13e" >138class;
err);
,"space.c#L879" iga href="+code=sp893","ame="L808"> 808 tref_}
err 808 chil=mnt" class="srechil=ef">ass="sref">get_domind="_has 138 href="+code=dentry" space.c#L879" icommis_trefan>);
vamespace.c#L895" id="L895" 1386start1386a>, next<13nex>138();
 808 s/namesp_/a>);
show_op1388stop<13sto>138de=show_optio="+codenamespace.c#L895" id="L895" 1389show   = >138" id="L828" class="line" name="139(,
{
, struct >1391 {
, struct  901   cleanup_group_id>{
{
)
);
, struct vfsmount139ef="+code=mnt="+coderef">mnt_group_erran>);
139 895  13" n>139(mespace.c#L895" id="L895" 1397mnt_group_grafs_trefan>);
 892{
mnt =pat 813ss=>139 than>        if (mnt->mnt_group_erran>);
((mnt->(<>140sa href="+cod"="+code=sb" class= class="line" name="L893"ass="sref">get_domind="_sb href="+code=mnt_idsb893"ass="sref">get_domins_ref=>{
get_dominMS_NOUSER{
1a>};
get_dominEINVAL
2href="+code=m" class="s14>hr>140class3a>)
get_domint get_domint_inomiref="+code=path"_inomis="sass="sref">get_domini_momiref="+code=pathi_momi 4lass="sref">vfsmountla>140ef="+code=mntan clacode=sb" class=S_ISDIR{
get_domind="_roo= href="+code=mnt_idroo=s="sass="sref">get_domint_inomiref="+code=path"_inomis="sass="sref">get_domini_momiref="+code=pathi_momi , struct 140 href="+code=dentry" ="+code-sref">get_dominENOTDIR{
6 name="L895"> 895  14> n>140(mespace.c#L895" id="L895" 14>7= 0;
);
get_dominENOENT{
8s="line" name="L897"> 814>s=>1408/a>();
 808 gatget_domint get_domint_inomiref="+code=path"_inomis="sass="sref">get_domini_mutexref="+code=pathi_mutex" cl amespace.c#L895" id="L895" 14>9"sref">mnt->"s>140de=mnt_devnam"="+code=sb" class=IS_DEADDIR{
get_domint get_domint_inomiref="+code=path"_inomis="sv /a>, struct 141(f="+code=mntlass="stgoco ode=out" class=out_un/a>);
mnt141a>, vmespace.c#L895" id="L895" 1412" ro"14"st>141class="line" 01"> 901   erran>);
, struct mnt1413a href="+cod"="+code=sb" class=erran>);
, struct  813141ef="+code=mntan classgoco ode=out" class=out_un/a>);
 814       14e=">141);
get_dominENOENT{
s_op->1417e=mnt_devnam"="+code=sb" class=IS_ROOT{
get_domint  817   d_unhas{
get_domint  901   erran>);
14="+>141      de=out" class=out_un/a>);
, struct );
 808 gatget_domint get_domint_inomiref="+code=path"_inomis="sass="sref">get_domini_mutexref="+code=pathi_mutex" cl amespace.c#L895" id="L895" 1481 820 14e" >1421  817   erran>);
, struct >142class="line" name="L901"> 901   securitydsb_post_add 892{
, struct 1423a href="+cod="+coderef">mnt_group_erran>);
seq_operations <14ef">142ef="+ start142next<14nex>142                stop<14sto>142s outside root, discard that* recursively chang="" e type of"" e u
show   = <14ss=>142 than trying to do that in i / id="L848" class="line" name="L841429
mnt_group_do_chang=_typeref="+code=path"o_chang=_typec#L892" class="line" name="patmnt_group_ref=a href="+code=sref=893" /a>, struct >143>    >        if ( 892{
get_domind="L817" class="line" namamespace.c#L895" id="L895" 1432)
mnt_group_recurseet_dominating_irecurse get_dominMS_REC{
m1433lass="line" s="sref">mnt_group_typeref="+code=pathtypec#L8 mespace.c#L817" iref=a href="+code=sref=893"e=m" cl~sref">get_dominMS_REC{
vfsmount1434lass="line" s="sref">mnt_group_erran>);
mnt<14e=m>14314305" id="L805""="+!17"> 817   cap="+can>);
);
, struct get_dominEPERM{
 837  14" n>143t 143de=mnt_devnam"="+code=sb" class=gatget_domint get_domind="L817" class="line" namass="sref">get_domind="_roo= href="+code=mnt_idroo=s="s /a>, struct mnt_parent<14cla>144(f="+code=mntlass="st="+code-sref">get_dominEINVAL
sb<14ode>144a>, vmespace.c#L895" id="L895" 1442mnt_root14t" >144class="line" 01"> 901   down_writeref="+code=path"own_writec#L89ame="L808"> 808 5" id="L8_se ass="line" name5" id="L8_se  , struct 1443a href="+cod"="+code=sb" class=typeref="+code=pathtypec#L8 ma>               MS_SHARED{
        if (root14=ro>144ef="+code=mntan classss="sref">err);
{
roo14e=r>144 href="+code=dentry" "="+code=sb" class=erran>);
, struct 14las>144(&qgoco ode=out" class=out_un/a>);
                 * Moun14>  >144(                 * but14"> >144t   141449lass="line" 01"> 901   apin_/a>);
 808 s/namesp_/a>);
show_op145( 14ass>145(f="+code=mnt claode=mnt" class=" ass="line" name= , struct  817   chang=_t_idpropagationan>);
show_op1452 901   apin_un/a>);
 808 s/namesp_/a>);
show_op1453" ro"14"st>145n class="string">"no devic1454);
, struct >145m,  808 5" id="L8_se ass="line" name5" id="L8_se  , struct /* Tagged 14ass>14505" id="L805"="+coderef">mnt_group_erran>);
IS_MN14ARE>145( mnt->145t IS_MNT14AVE>145       * race-free way (due03ref="fs/namespace.c#L904" id="L90146(mnt_master->mn>146>      * race-free way (due * do loopback 8"> 8" id="L848" class="line" name="L841461mnt_group_do_loopbackref="+code=path"o_loopbackc#L892" class="line" name="patdom14de=>146: mnt_group_recurseet_dominating_irecurse , struct         if (146 href="+code=2" class="line" name="patIS_MNT_UN14" c>14605" id="L805"d= id="L891" class="li2"> 892{
m14de=>146(mnt_group_erran>);
);
);
);
, struct  868        146de=mnt_devname" class="+coderef">mnt_group_erran>);
 817   old_a hr;
147gt;get_dominEINVAL
147class="line" 01"> 901   erran>);
err 808 old_pat, struct mnt_devna14" c>1473a href="+cod"="+code=sb" class=erran>);
, struct " ro"14"st>147ef="+code=mntan class="+coderef">mnt_group_erran>);
147 87514705" id="L805" class="line" ndown_writeref="+code=path"own_writec#L89ame="L808"> 808 5" id="L8_se ass="line" name5" id="L8_se  , struct  876       14e=">147();
get_dominEINVAL
s_op->1478lass="line" "="+code=sb" class=IS_MNT_UNBINDABLE
, struct );
 817   check_d="L817" class="licheck_d="/namespace.c#L879" igatget_domind="L817" class="line" nam) ||l!17"> 817   check_d="L817" class="licheck_d="/namespace.c#L879" iold_pat, struct  881 14e" >148class="line" name="L9goco ode=out" class=outan>);
;
"no devic1484}
);
get_dominENOMEM{
 148 href="+code="="+code=sb" class=recurseet_dominating_irecurse , struct start148(mnt_group_ class="line" name="L893"amespace.c#L817" icopy_trefan>);
errnext<14nex>148(, struct stop<14sto>148de=show_options" clas01"> 901    class="line" name="L893"amespace.c#L817" iclone_d="L817" class="liclone_d="/namespace.c#L879" iold_paterrshow   = >148" id="L828" class="line" name="149(,
 817   d="L817" class="line" namv"L828" class="line" name="1491};
);
)
err);
);
errvfsmount149ef="+code=mnt"="+code=sb" class=erran>);
        if (149 href="+code=dentry" space.c#L879" iLIST_HEAD{
, struct  895  14" n>149(mnt_group_apin_/a>);
 808 s/namesp_/a>);
show_op1497 808 uamesp_trefan>);
 808 uamesp_/a href="+code=v" cuamesp_/a h , struct  814ss=>149de=show_options" clas01"> 901   apin_un/a>);
 808 s/namesp_/a>);
show_op1499mnt->get_dominrelease_u
{
 808 uamesp_/a href="+code=v" cuamesp_/a h , struct mnt->(<>150sa href="+cod 1a>};
2href="+code=m" class="s15>hr>150classode=out" class=outan>);
, struct a>>150: err 808 5" id="L8_se ass="line" name5" id="L8_se  , struct vfsmountla>150ef="+code=mntL893" id="L893"pat<_putan>);
 808 old_pat, struct 150 href="+code=="+coderef">mnt_group_erran>);
6 name="L895"> 895  15> n>150( 7= 0;
8s="line" name="L897"> 815>s=>1508/a>(d="L890s="sref">mnt_group_chang=_tmesp_ref=>{
 892{
mnt_group_ms_ref=>{
mnt->"s>150de=mn>        if (151(f="+code=mnts="sref">mnt_group_erroran>);
mnt1511f="+code=mnts="sref">mnt_group_readonly_reque href="+code=v" creadonly_reque h893"amenamespace.c#L895" id="L895" 1512" ro"15"st>151classmnt1513a href="+cod"="+code=sb" class=ms_ref=>{
get_dominMS_RDONLY{
 813151ef="+code=mntan classref">mnt_group_readonly_reque href="+code=v" creadonly_reque h893"ame1amespace.c#L895" id="L895" 1515 814       15e=">151 href="+code="="+code=sb" class=readonly_reque href="+code=v" creadonly_reque h893"ammespace.c#L817" i__t_idis_readonlyref="+code=v" c__t_idis_readonlyc#L89space.c#L817" id="L817" class="line" namv /a>, struct s_op->151(mespace.c#L895" id="L895" 1518, struct 15="+>151de=mnt_devname" classsref">get_dominerroran>);
, struct  820 15e" >152gt; 817   __t_idunmake_readonlyref="+code=v" c__t_idunmake_readonlyc#L89space.c#L817" id="L817" class="line" namvamespace.c#L895" id="L895" 1522;
mnt_group_erroran>);
}
seq_operations <15ef">152ef="+start152next<15nex>152                stop<15sto>152s outside root, discard that* If you've u
show   = <15ss=>152 than trying to do that in i  on it -stough luck" id="L848" class="line" name="L841529
>153e    d="L890s="sref">mnt_group_do_reamespref="+code=path"o_reamespacL892" class="line" name="patmnt_group_ref=>{
mnt_group_msp_ref=>{
, struct >153class>        if (m1533lass="line" s="sref">mnt_group_erran>);
vfsmount1534lass="line" 2" class="line" name="super_b/a>);
get_domind="L817" class="line" namass="sref">get_domind="_sb href="+code=mnt_idsb893"amespace.c#L895" id="L895" 1535mnt<15e=m>15315305" id="L805""="+!17"> 817   cap="+can>);
);
, struct get_dominEPERM{
 837  15" n>153t 153de=mnt_devnam"="+!17"> 817   check_d="L817" class="licheck_d="/namespace.c#L879" igatget_domind="L817" class="line" nam) /a>, struct mnt_parent<15cla>154(f="+code=mntlass="st="+code-sref">get_dominEINVAL
sb<15ode>154a>, vmespace.c#L895" id="L895" 1542mnt_root15t" >154class="line" "="+code=sb" class=gatget_domint get_domind="L817" class="line" namass="sref">get_domind="_roo= href="+code=mnt_idroo=s="s /a>, struct 154: get_dominEINVAL
root15=ro>154ef="+roo15e=r>154 href="+code=ref">mnt_group_down_writeref="+code=path"own_writec#L89ame="L808"> 808 sb href="+code=mnsb893"ass="sref">get_domins_u 892{
15las>15405" id="L805""="+ref">mnt_group_ref=>{
get_dominMS_BIND{
, struct                  * Moun15>  >154( 808 erran>);
{
get_domind="L817" class="line" nam,sss="sref">err{
                 * but15"> >1548lass="line" else/a>, struct   15154de=mnt_devname" classsref">get_dominerran>);
err{
, struct  15ass>155sa href="+cod"="+!17"> 817   erran>);
, struct  817   datget_domind="L817" class="line" namass="sref">get_domind="_ref=>{
c#L8, struct 155class="line" 01"> 901   up_writeref="+code=pathup_writec#L89ame="L808"> 808 sb href="+code=mnsb893"ass="sref">get_domins_u 892{
" ro"15"st>1553a href="+cod"="+!17"> 817   erran>);
        if (mnt_group_securitydsb_post_reamespref="+code=pathsecuritydsb_post_reamespc#L89               datget_domind="L817" class="line" nam,sss="sref">err{
);
/* Tagged 15ass>155(mnt_group_apin_/a>);
 808 s/namesp_/a>);
show_op1557IS_MN15ARE>155( 808 touchtucl_a href="+ref="+code=v" ctouchtucl_a href="+c#L89space.c#L879" idatget_domind="L817" class="line" namass="sref">get_domind="_n>{
mnt->155de=show_options" clas01"> 901   apin_un/a>);
 808 s/namesp_/a>);
show_op1559IS_MNT15AVE>155de=mnt_devnam mnt_master->mn>156sa href="+cod="+coderef">mnt_group_erran>);
156classdom15de=>156: mnt_group_inss="sr>);
mnt_group_tref_contains_unbind="+can>);
 892{
, struct         if (156 href="+code=2" class="line" name="2"> 892{
IS_MNT_UN15" c>15605" id="L805" claode=mnt" class="ga href="+code=sp893"amespace.c#L817" id="L817" class="line" namaquot;device &quoga href="+code=sp893"aquot;device &quoga href="+code=sp893"amespace.c#L817" inext_uclass="line" namenext_ucl/namespace.c#L879" iga href="+code=sp893","sref">get_domind="L817" class="line" nam)  >        if (m15de=>156(, struct >156de=show_options" clasef="+cod="+code1amespace.c#L895" id="L895" 1569 868        156de=mnt_devnam 157a>, v 157classmnt_devna15" c>157: mnt_group_do_mov=_tmesp href="+code=mn"o_mov=_tmespacL892" class="line" name="pat" ro"15"st>157ef="+>        if (157 href="+code=2" class="line" name="paterr 87515705" id="L805"d= id="L891" class="li2"> 892{
 876       15e=">157(mnt_group_erran>);
s_op->1578lass="line" "="+!17"> 817   cap="+can>);
);
, struct get_dominEPERM{
 817   old_a hr;
get_dominEINVAL
 881 15e" >158class="line" 01"> 901   erran>);
err 808 old_pat, se.c#L895" id="L895" 1583;
);
, struct 158ef="+code=mntan class="+coderef">mnt_group_erran>);
 158start15805" id="L805" class="line" ndown_writeref="+code=path"own_writec#L89ame="L808"> 808 5" id="L8_se ass="line" name5" id="L8_se  , struct next<15nex>158(get_domint stop<15sto>158de=show_options" class="sref">err 808 datget_domind="L817" class="line" nam,same="L808"> 808 gatget_domint show   = >158de=mnt_devname" class"/a>, struct ,>15905" id="L805" class="line" nerran>);
get_dominEINVAL
};
 817   check_d="L817" class="licheck_d="/namespace.c#L879" igatget_domind="L817" class="line" nam) ||l!17"> 817   check_d="L817" class="licheck_d="/namespace.c#L879" iold_pat, struct );
)
"no devic1594vfsmount159ef="+code=mnt class="line" nerran>);
get_dominENOENT{
159 href="+code=ref">mnt_group_mutex_/a>);
 808 gatget_domint get_domint_inomiref="+code=path"_inomis="sass="sref">get_domini_mutexref="+code=pathi_mutex" cl amespace.c#L895" id="L895" 1596 895  15" n>15905" id="L805""="+ref">mnt_group_IS_DEADDIR
get_domint get_domint_inomiref="+code=path"_inomis="sv /a>, struct 159();
 815ss=>159t mnt-> 817   IS_ROOT{
get_domint {
get_domint ((mnt->(<>160(f="+code=mntlass="stgoco ode=out" class=out1an>);
1a>};
2href="+code=m" class="s16>hr>160class="line" 01"> 901   erran>);
get_dominEINVAL
3a>)
get_domind="_roo= href="+code=mnt_idroo=s="s /a>, struct 4lass="sref">vfsmountla>160ef="+code=mntan classgoco ode=out" class=out1an>);
5"+code=mnt" class="sref16>"+>1606 name="L895"> 895  16> n>16005" id="L805""="+ref">mnt_group_old_patget_domind="_par (d href="+code=mnt_idpar (ds="s /a>, struct 7= 0;
);
8s="line" name="L897"> 816>s=>160t mnt->"s>160de=mnt_devnam"="+code=sb" class=S_ISDIR
get_domint get_domint_inomiref="+code=path"_inomis="sass="sref">get_domini_momiref="+code=pathi_momis="s) !=href="+code=err" class="sr161(161(f="+code=mntlass="code=sb" class=S_ISDIR
get_domint_inomiref="+code=path"_inomis="sass="sref">get_domini_momiref="+code=pathi_momis="s) /a>, struct mnt161gt;);
" ro"16"st>161class="line" 0 * race-free way (due03ref="fs/namespace.c#L904" id="L901613mnt1613a hr  * race-free way (due         * Don't mov= a u
 813161ef="+  * race-free way (due         */ id="L848" class="line" name="L841615 814       16e=">161 href="+code="="+code=sb" class=old_patget_domind="_par (d href="+code=mnt_idpar (ds="s ame="ame="/a>, struct  817   IS_MNT_SHARED{
get_domind="_par (d href="+code=mnt_idpar (ds="s  /a>, struct s_op->161();
16="+>161       * race-free way (due         * Don't mov= a u
 820 16e" >162a>, vrclass="line" name="L9         */ id="L848" class="line" name="L841622;
get_domind="L817" class="line" nam) ame="ame="/a>, struct 162: get_domintref_contains_unbind="+can>);
, struct seq_operations <16ef">162ef="+code=mntan classgoco ode=out" class=out1an>);
start162 href="+code=ref">mnt_group_erran>);
get_dominELOOP
next<16nex>16205" id="L805" claode=mnt" class="ga href="+code=sp893"amespace.c#L817" igatget_domind="L817" class="line" namaquot;device &quoga href="+code=sp893"ass="sref">get_domind="_par (d href="+code=mnt_idpar (ds="s /a>               da href="+code=sp893"aquot;device &quoga href="+code=sp893"amespace.c#L817" iga href="+code=sp893"ass="sref">get_domind="_par (d href="+code=mnt_idpar (ds="s /a>, struct stop<16sto>162(, struct show   = <16ss=>162de=show_options" clasef="+codgoco ode=out" class=out1an>);

>16305" id="L805" class="line" nerran>);
err 808 gar (d_pat);
, struct >163class="line" name="L9goco ode=out" class=out1an>);
m163n class="string">"no devic1634vfsmount1634lass="line" 0 * race-free way (due03s"="thc u
mnt<16e=m>16316305" id="L805" class="line" n/a h_del_ini"L817" class="li/a h_del_ini"c#L89ame="L808"> 808 old_patget_domind="_expire href="+code=mnt_idexpire i3" amespace.c#L895" id="L895" 1637);
, struct  837  16" n>16385" id="L805" class="line" nmutex_un/a>);
 808 gatget_domint get_domint_inomiref="+code=path"_inomis="sass="sref">get_domini_mutexref="+code=pathi_mutex" cl amespace.c#L895" id="L895" 1639);
, struct mnt_parent<16cla>16405" id="L805" class="line" nup_writeref="+code=pathup_writec#L89ame="L808"> 808 5" id="L8_se ass="line" name5" id="L8_se  , struct sb<16ode>1641  817   erran>);
, struct mnt_root16t" >164class="line" name="L9L808"> 808 gat<_putan>);
 808 gar (d_pat164: err);
 808 old_pat, struct root16=ro>1644lass="line" ="+coderef">mnt_group_erran>);
roo16e=r>164 href 16las>16405" i                 * Moun16>  >164s outside root, discard tha03ref="fs/namespace.c#L904" id="L901648                 * but16"> >164 than trying to do that in i  creat= a new u
  16164       * race-free way (due * L904" id='s trefc#f="fs/namespace.c#L904" id="L90165( 16ass>165>      * race-free way (due */ id="L848" class="line" name="L841651                ret160165gt;mnt_group_do_new_tmesp href="+code=mn"o_new_tmespc#L892" class="line" name="pat);
mnt_group_ref=>{
165class="line" name="L9an class"="sref">mnt_group_msp_ref=>{
, struct " ro"16"st>1653a hr>        if ( 892{
);
/* Tagged 16ass>16505" id="L805""="+!17"> 817   typcan>);
 817   memchran>);
);
errIS_MN16ARE>165(get_dominEINVAL
mnt->165t IS_MNT16AVE>165de=mnt_devnam0 * race-free way (due03swe need=cap="ilities... */ id="L848" class="line" name="L84166(mnt_master->mn>166sa href="+cod"="+!17"> 817   cap="+can>);
);
, struct get_dominEPERM{
166classdom16de=>166: err);
mnt_group_ref=>{
166ef="+code=mnt"="+code=sb" class=IS_ERR
, struct 166 href="+code=="line" ="+coderef">mnt_group_PTR_ERR
IS_MNT_UN16" c>16605" im16de=>166(mnt_group_"o_add_tmesp href="+code=mn"o_add_tmespacL89space.c#L879" id="L817" class="line" nam,sss="sref">errmnt_group_msp_ref=>{
mnt_group_NULL
);
 868        166" id="L828" class="line" name="167(167a>, vrclass="line" name="L9 * add a u
167classrclass="line" name="L9 * - provide"thc option of"adding thc new u
mnt_devna16" c>1673a hr  * race-free way (due */ id="L848" class="line" name="L841674" ro"16"st>167ef="+s="sref">mnt_group_do_add_tmesp href="+code=mn"o_add_tmespacL892" class="line" name="2"> 892{
167 href="+code=="line" s"="sref">mnt_group_msp_ref=>{
, struct  87516705" i>        if ( 876       16e=">167(mnt_group_erran>);
s_op->167t mnt_group_down_writeref="+code=path"own_writec#L89ame="L808"> 808 5" id="L8_se ass="line" name5" id="L8_se  , struct get_domint  881 16e" >168class="line" name="LL893" id="L893"follow_"own{
 808 datget_domind="L817" class="line" nam,same="L808"> 808 gatget_domint ;
, struct 168ef="+code=mntref">mnt_group_erran>);
get_dominEINVAL
 168 href="+code="="+!17"> 817   check_d="L817" class="licheck_d="/namespace.c#L879" igatget_domind="L817" class="line" nam) /a>, struct start168();
next<16nex>168(mespace.c#L895" id="L895" 1688stop<16sto>1688lass="line" 0 * race-free way (due03 Refuse"thc s>st"filesystem on thc s>st"u
show   = >168de=mnt_devnamref">mnt_group_erran>);
get_dominEBUSY{
,
get_domind="L817" class="line" namass="sref">get_domind="_sb href="+code=mnt_idsb893"ammespace.c#L817" inewuclass="line" namenewne" namass="sref">get_domind="_sb href="+code=mnt_idsb893"aame="ame="/a>, struct >169gt;get_domind="L817" class="line" namass="sref">get_domind="_roo= href="+code=mnt_idroo=s="sammespace.c#L817" igatget_domint );
)
"no devic1694vfsmount169ef="+code=mnt class="line" nerran>);
get_dominEINVAL
169 href="+code="="+sref">get_dominS_ISLNK
get_domind="_roo= href="+code=mnt_idroo=s="sass="sref">get_domint_inomiref="+code=path"_inomis="sass="sref">get_domini_momiref="+code=pathi_momis="s) /a>, struct  895  16" n>169();
 816ss=>16985" id="L805" class="line" nnewuclass="line" namenewne" namass="sref">get_domind="_ref=>{
c#L8, struct mnt->);
);
err((mnt->(<>170(f="+code=mntlass="stgoco ode=out" class=un/a>);
1a>};
2href="+code=m" class="s17>hr>170class="line" "="+code=sb" class=fs/a href="+code=v" cfs/a h893"  0 * race-free way (due03 add "o"thc specified expiration /a h */ id="L848" class="line" name="L8417>3a>)
 808 5ewuclass="line" namenewne" namass="sref">get_domind="_expire href="+code=mnt_idexpire i3","ref">mnt_group_rs/a href="+code=v" cfs/a h893" amespace.c#L895" id="L895" 17>4lass="sref">vfsmountla>170ef="+5"+code=mnt" class="sref17>"+>170 href="+code=ref">mnt_group_up_writeref="+code=pathup_writec#L89ame="L808"> 808 5" id="L8_se ass="line" name5" id="L8_se  , struct  895  17> n>17005" id="L805"="+codenamespace.c#L895" id="L895" 17>7= 0;
8s="line" name="L897"> 817>s=>170t );
9"sref">mnt->"s>170de=mnt_devnamref">mnt_group_up_writeref="+code=pathup_writec#L89ame="L808"> 808 5" id="L8_se ass="line" name5" id="L8_se  , struct 17105" id="L805" class="line" nt_iputan>);
, struct mnt171gt;mnt_group_erran>);
" ro"17"st>171class mnt171n class="string">"no devic1714 813171ef="+ ref">get_dominEXPORT_SYMBOL_GPL
, struct  814       17e=">171s_op->171s outside root, discard tha * process a /a h of expira"+c u
17="+>171       * race-free way (due *+herec#f="fs/namespace.c#L904" id="L90172( 820 17e" >172a>, vvoidr class="line" ntark_tmesps_fordexpirhref="+code=pathtark_tmesps_fordexpirhacL892" class="line" name="/a h_head/a>{
, struct >172class>        if (172:  892{
seq_operations <17ef">172ef="+code=mnt class="line" nLIST_HEAD{
);
start172 href="+code=ref">mnt_group_LIST_HEAD{
, struct next<17nex>17205" istop<17sto>172(, struct show   = <17ss=>172de=show_options" clas="+cod, struct >172" id="L828" class="line" name="173(};
 808 5" id="L8_se ass="line" name5" id="L8_se  , struct  808 apin_/a>);
 808 s/namesp_/a>);
show_op1732)
m173: vfsmount173ef="+  * race-free way (due         * rollowing criteria:ref="fs/namespace.c#L904" id="L901735mnt<17e=m>173173(  * race-free way (due         * - still tarked  claexpirh (tarked on thc  tot"9all+here; tarks ar acf="fs/namespace.c#L904" id="L901737 837  17" n>173 than trying to do that in i        */ id="L848" class="line" name="L841739mnt_group_/a h_fordeach_ clas_saferef="+code=path/a h_fordeach_ clas_safe/namespace.c#L879" it="L817" class="line" nam,sss="sref">errmnt_group_mmespsref="+code=pathtmespss="s,sref">mnt_group_msp_expire href="+code=mnt_idexpire i3"  >        if (mnt_parent<17cla>174(f="+code=mntlass="st"="+!17"> 817   xchg href="+code=mnxchgc#L89ame="L808"> 808 d="L817" class="line" namass="sref">get_domind="_expiry_tark href="+code=mnt_idexpiry_tarks="s,s1) ||        if (sb<17ode>174gt;mnt_group_propagat=_tmesp_bushref="+code=pathpropagat=_tmesp_bush/namespace.c#L879" it="L817" class="line" nam,s1))/a>, struct mnt_root17t" >174class="line" name="L999999999continuetions" class="sref">show_op1743174:  808 d="L817" class="line" namass="sref">get_domind="_expire href="+code=mnt_idexpire i3","ame="L808"> 808 graveyardan>);
root17=ro>1744lass="line"  roo17e=r>174 href="+code=while"+!17"> 817   /a h_empthref="+code=path/a h_empth/nameame="L808"> 808 graveyardan>);
17las>174( 808 d="L817" class="line" namamespace.c#L817" i/a h_fir h_e 808 graveyardan>);
 892{
mnt_group_msp_expire href="+code=mnt_idexpire i3" , struct mnt_group_touch_d="_a href="+ href="+code=mntouch_d="_a href="+/namespace.c#L879" it="L817" class="line" namass="sref">get_domind="_n>{
, struct                  * but17"> >174de=show_options" classpace.c#L879" iutmesp_trefan>);
 808 utmespsref="+code=pathutmespss="s), struct   17174de=mnt_devnam  17ass>17505" id="L805" class="line" napin_un/a>);
 808 s/namesp_/a>);
show_op1751                ret1701751  808 up_writeref="+code=pathup_writec#L89ame="L808"> 808 5" id="L8_se ass="line" name5" id="L8_se  , struct 175class" ro"17"st>175: err 808 utmespsref="+code=pathutmespss="s), struct );
/* Tagged 17ass>17505" i ref">get_dominEXPORT_SYMBOL_GPL
IS_MN17ARE>175(mespace.c#L895" id="L895" 1758mnt->175 than trying to do that in 03ref="fs/namespace.c#L904" id="L901759IS_MNT17AVE>175       * race-free way (due *+Ripoff of 'seoecidpar (d()'ref="fs/namespace.c#L904" id="L90176(mnt_master->mn>176>      * race-free way (due *ref="fs/namespace.c#L904" id="L901761dom17de=>1763a hr  * race-free way (due */ id="L848" class="line" name="L841764176ef="+d="L890s="sref">mnt_group_seoecidsubu
 892{
);
176 href>        if (IS_MNT_UN17" c>176( 892{
, struct m17de=>176();
mnt_group_rmesd/a>{
 868        176" id="L828" class="line" name="177(err, struct 1771  808 nexlass="line" namenext893"amespace.c#L817" ithis_par (d href="+code=mnthis_par (d namass="sref">get_domind="_mmespsref="+code=patht="_mmesps nam.space.c#L817" inexlass="line" namenext893"amespace.c#L895" id="L895" 1772177classrs="sref">err, struct mnt_devna17" c>177:  808 this_par (d href="+code=mnthis_par (d namass="sref">get_domind="_mmespsref="+code=patht="_mmesps nam  >        if (" ro"17"st>177ef="+code=mntan class2" class="line" name="/a h_head/a>{
177 href="+code=="line" 2" class="line" name="2"> 892{
 892{
mnt_group_msp_child/a>{
 87517705" i 876       17e=">177(mnt_group_nexlass="line" namenext893"amespace.c#L817" itmga href="+code=stmg893"ass="sref">get_dominnexlass="line" namenext893"amespace.c#L895" id="L895" 1778s_op->177de=show_options" clas"="+!espace.c#L879" it="L817" class="line" namass="sref">get_domind="_ref=>{
, struct show_op178( 881 17e" >178classrclass="line" name="L9                 */ id="L848" class="line" name="L841783;
 817   /a h_empthref="+code=path/a h_empth/nameame="L808"> 808 t="L817" class="line" namass="sref">get_domind="_mmespsref="+code=patht="_mmesps nam   >        if (178ef="+code=mntan class"+code=mref">mnt_group_this_par (d href="+code=mnthis_par (d namamespace.c#L817" i class="line" name="L893"amespace.c#L895" id="L895" 1785 178 href="+code=="line"         goco ode=out" class=repealass="line" namerepeal    amespace.c#L895" id="L895" 1786start178(next<17nex>178(mespace.c#L895" id="L895" 1788stop<17sto>178de=show_options" clas"="+!ref">mnt_group_propagat=_tmesp_bushref="+code=pathpropagat=_tmesp_bush/namespace.c#L879" it="L817" class="line" nam,s1)) >        if (show   = >178de=mnt_devnammmmmmmmmmmmmmmmms="line" name="/a h_mov=_tail/a>{
 808 d="L817" class="line" namass="sref">get_domind="_expire href="+code=mnt_idexpire i3","L808"> 808 graveyardan>);
,
, struct >179gt;)
vfsmount179ef="+  * race-free way (due         * All done ap this levels... ascend and resuc#"thc search id="L848" class="line" name="L841795179 895  17" n>17905" id="L805""="+ref">mnt_group_this_par (d href="+code=mnthis_par (d nama/a>               dar (d href="+code=mnpar (ds="s) >        if (179(mnt_group_nexlass="line" namenext893"amespace.c#L817" ithis_par (d href="+code=mnthis_par (d namass="sref">get_domind="_child/a>{
 817ss=>179de=show_options" classpace.c#L879" ithis_par (d href="+code=mnthis_par (d namamespace.c#L817" ithis_par (d href="+code=mnthis_par (d namass="sref">get_domind="_par (d href="+code=mnt_idpar (ds="samespace.c#L895" id="L895" 1799mnt->((mnt->(<>180(f="+code=mnt 1a>};
mnt_group_rmesd/a>{
2href="+code=m" class="s18>hr>180class 3a>)
"no devic18>4lass="sref">vfsmountla>180ef="+  * race-free way (due03 id="L848" class="line" name="L8418>5"+code=mnt" class="sref18>"+>180 895  18> n>180(  * race-free way (due * subu
= >180s outside root, discard tha */ id="L848" class="line" name="L8418>8s="line" name="L897"> 818>s=>180t  892{
mnt->"s>180de=mn>        if (18105" id="L805" class="line" nLIST_HEAD{
);
mnt181gt; 892{
" ro"18"st>181classmnt181:  813181ef="+code=mntwhile"+code=sb" class=seoecidsubu
 808 graveyardan>);
 814       18e=">181 href="+code=="line" while"+!17"> 817   /a h_empthref="+code=path/a h_empth/nameame="L808"> 808 graveyardan>);
 808 graveyardan>);
 892{
s_op->181(get_domind="_expire href="+code=mnt_idexpire i3"v, struct get_domintouch_d="_a href="+ href="+code=mntouch_d="_a href="+/namespace.c#L879" itL817" class="lin namass="sref">get_domind="_n>{
, struct 18="+>181de=mnt_devnammmmmmmmmmmmmmmmms="line" name="utmesp_trefan>);
, struct  820 18e" >182gt;;
}
"no devic1824seq_operations <18ef">182ef="+  * race-free way (due03 id="L848" class="line" name="L841825start182next<18nex>182(  * race-free way (due * bytes+="maining to copy on a fault.  But copy_tmesp_options() requires that" id="L848" class="line" name="L841827stop<18sto>182s outside root, discard tha * Note that this function differs from"copy_from_user() in that it will oops id="L848" class="line" name="L841828show   = <18ss=>182 than trying to do that in i  on bad valuessof"`to', rathersthan+="+coding a short copy" id="L848" class="line" name="L841829
>18305" id="L890long L893" id="L893"exala_copy_from_userref="+code=pathexala_copy_from_user/namevoidr#L893" id="L893"to href="+code=mnto nam,sconst0voidr class="line" n__userref="+code=path__user/nami  ref">mnt_group_rrom/a>{
>183class>        if (m183: vfsmount183ef="+code=mntconst0chara class="line" n__userref="+code=path__user/nami ref">mnt_group_r/a>{
{
mnt<18e=m>1835 {
18305" i 817   access_o);
 808 rrom/a>{
 837  18" n>183de=show_options" clas="+cod L893" id="L893"n{
, struct 183" id="L828" class="line" name="184(mnt_parent<18cla>184(f="+code=mntwhile"+code=sb" class=n{
        if (sb<18ode>184gt;mnt_group___get_userref="+code=path__get_user/namespace.c#L879" ic/a>{
 808 r/a>{
mnt_root18t" >184class="line" name="L999999999space.c#L879" itemse"L817" class="linemse"/namespace.c#L879" it href="+code=mnt nam,"0,sss="sref">err, struct 184: , struct root18=ro>1844lass="line"          roo18e=r>184 href="+code=="line" #L893" id="L893"t href="+code=mnt nam++amespace.c#L817" ic/a>{
18las>184( 808 r/a>{
                 * Moun18>  >184(mnt_group_n{
, struct                  * but18"> >184de=show_optio   18184de=mnt_devnam="+cod L893" id="L893"n{
, struct  18ass>18505" i                 ret180185a>, vmespace.c#L895" id="L895" 1852mnt_group_copy_tmesp_options/a>{
mnt_group_tataref="+code=path"ata893",munsigned0long #L893" id="L893"whereref="+code=pathwherec#"s)48" class="line" name="L841853" ro"18"st>185:         if (mnt_group_iref="+code=pathis="s, struct >185 href="+code=unsigned0long L893" id="L893"pageref="+code=pathpages="s, struct /* Tagged 18ass>1856href="+code=unsigned0long L893" id="L893"sizeref="+code=pathsizes="s, struct IS_MN18ARE>185(mespace.c#L895" id="L895" 1858mnt->185de=show_optio#L893" id="L893"whereref="+code=pathwherec#"samenamespace.c#L895" id="L895" 1859IS_MNT18AVE>185de=mnt_devnam"="+!17"> 817   tataref="+code=path"ata893")48" class="line" name="L84186(mnt_master->mn>186(f="+code=mntlass="st="+codenamespace.c#L895" id="L895" 1861186class="line" "="+!espace.c#L879" ipageref="+code=pathpages="samespace.c#L817" i__get_free_pageref="+code=path__get_free_page/namespace.c#L879" iGFP_KERNEL
dom18de=>186: get_dominENOMEM
, struct IS_MNT_UN18" c>186(  * race-free way (due         * gave us is valid.  Just inacase, w='ll zero/nd="L848" class="line" name="L841867m18de=>186s outside root, discard tha         * the ="maindersof the page" id="L848" class="line" name="L841868);
 868        1869href="+code=r * race-free way (due03 copy_from_useracannot+cross TASK_SIZE ! */ id="L848" class="line" name="L84187( 817   tataref="+code=path"ata893", struct 1871 mnt_group_aizeref="+code=pathsizes="sass="espace.c#L817" iPAGE_SIZEref="+code=pathPAGE_SIZE893")48" class="line" name="L841872187class="line" name="L9 class="line" naizeref="+code=pathsizes="samespace.c#L817" iPAGE_SIZEref="+code=pathPAGE_SIZE893", struct mnt_devna18" c>187n class="string">"no devic1874" ro"18"st>187ef="+code=mntref">mnt_group_iref="+code=pathis="samespace.c#L817" iaizeref="+code=pathsizes="sa- L893" id="L893"exala_copy_from_userref="+code=pathexala_copy_from_user/nameevoidr#)17"> 817   pageref="+code=pathpages="s,sss="sref">err, struct 187 href="+code="="+!17"> 817   iref="+code=pathis="s  >        if ( 875187( 808 rree_pageref="+code=pathfree_page/namespace.c#L879" ipageref="+code=pathpages="s), struct  876       18e=">187(get_dominEFAULT
, struct s_op->187de=show_optio mnt_group_iref="+code=pathis="sa/a>               PAGE_SIZEref="+code=pathPAGE_SIZE893")48" class="line" name="L84188( 817   pageref="+code=pathpages="s +tref">mnt_group_iref="+code=pathis="s,"0,sss="sref">err, struct , struct  881 18e" >188class="line" ="+codenamespace.c#L895" id="L895" 1883;
}
 188start188(  * race-free way (due * Fef=> is a 32-bit value that allows up to 31 non-fs depen" cl ref=> to/nd="L848" class="line" name="L841887next<18nex>188s outside root, discard tha * be given "o"thc tmesp()"9all+(ie: ="ad-only, no-dev, no-suidretc)" id="L848" class="line" name="L841888stop<18sto>188 than trying to do that in i  id="L848" class="line" name="L841889show   = >188       * race-free way (due *+"ata is a evoidr#) that can href= "o"any"2" claure up to id="L848" class="line" name="L84189(,
>189a>, vrclass="line" name="L9 * information (or be NULL)" id="L848" class="line" name="L841892>1893a hr  * race-free way (due * Pre-0.97 versions of tmesp()"did('t hav  a fef=> word" id="L848" class="line" name="L841894vfsmount189ef="+  * race-free way (due * Whedethc fef=> word wast"="roduced i ss"op half wastrequired id="L848" class="line" name="L841895189 895  18" n>189(  * race-free way (due * Therefore,s"="this tag890numbersis presef=, it carries no information id="L848" class="line" name="L841897 818ss=>189 than trying to do that in i / id="L848" class="line" name="L841899mnt->mnt->(<>190(f="+code=mntlass="ste=unsigned0long L893" id="L893"ref=>{
a>>190gt;        if (3a>)
mnt_group_="+valref="+code=path="+valc#"samenamespace.c#L895" id="L895" 19>4lass="sref">vfsmountla>190ef="+code=mnt"="sref">mnt_group_d="_ref=>{
5"+code=mnt" class="sref19>"+>1906 name="L895"> 895  19> n>19005" id="L805"r * race-free way (due03 Discard tag890 / id="L848" class="line" name="L8419>7= 0;
mnt_group_ref=>{
 819>s=>190de=show_options" classpace.c#L879" iref=>{
9"sref">mnt->"s>190" id="L828" class="line" name="191(19105" id="L805"  * race-free way (due03 Bas890sanity"checks0 / id="L848" class="line" name="L841911mnt191a>, vmespace.c#L895" id="L895" 1912" ro"19"st>191class="line" "="+!L893" id="L893"dir_a hr href="+code=mn"ir_a hrs="s || !#L893" id="L893"dir_a hr href="+code=mn"ir_a hrs="s || ! pace.c#L879" itemchrref="+code=pathtemchr/namespace.c#L879" idir_a hr href="+code=mn"ir_a hrs="s,"0,sss="sref">errmnt191: get_dominEINVAL
 813191ef="+code=mnt"="+ref">mnt_group_dev_a hr href="+code=mn"ev_a hrs="saame="ame=""! pace.c#L879" itemchrref="+code=pathtemchr/namespace.c#L879" idev_a hr href="+code=mn"ev_a hrs="s,"0,sss="sref">err 814       19e=">191 href="+code=="line" ="+code-sref">get_dominEINVAL
s_op->191( 817   "ata_pageref="+code=path"ata_page893")[ss="sref">err19="+>191" id="L828" class="line" name="192(  / id="L848" class="line" name="L841981 820 19e" >1921 mnt_group_ref=>{
>192class="line" name="L9 class="line" nd="_ref=>{
}
mnt_group_ref=>{
seq_operations <19ef">1924lass="line"          class="line" nd="_ref=>{
start192 href="+code="="+ref">mnt_group_ref=>{
next<19nex>192( 808 d="_ref=>{
stop<19sto>192({
show   = <19ss=>192de=show_options" classpace.c#L879" id="_ref=>{

mnt_group_ref=>{
>193(f="+code=mntlass="st pace.c#L879" it="_ref=>{
mnt_group_ref=>{
>193class="line" name="L9 class="line" nd="_ref=>{
m1933 mnt_group_ref=>{
vfsmount1934lass="line"          class="line" nd="_ref=>{
mnt<19e=m>19319305" id="L805"rpace.c#L879" iref=>{
mnt_group_MS_NOSUID{
, struct  837  19" n>193de=sh/a>, struct 1939href="+code=r * race-free way (due03 ... and get"thc tmesphref=  / id="L848" class="line" name="L84194(mnt_parent<19cla>19405" id="L805" class="line" n="+valref="+code=path="+valc#"same class="line" nkern_pathref="+code=pathkern_path/namespace.c#L879" idir_a hr href="+code=mn"ir_a hrs="s,"space.c#L879" iLOOKUP_FOLLOW href="+code=mnLOOKUP_FOLLOWs="s,"ame="L808"> 808 pathref="+code=pathpathlass , struct sb<19ode>1941 mnt_group_="+valref="+code=path="+valc#"s)48" class="line" name="L841942mnt_root19t" >194class="line" name="L9="+cod L893" id="L893"="+valref="+code=path="+valc#"s, struct 194n class="string">"no devic1944root19=ro>194ef="+code=mntref">mnt_group_="+valref="+code=path="+valc#"same class="line" nsecurity_sb_tmesp href="+code=mnsecurity_sb_tmesp/namespace.c#L879" idev_a hr href="+code=mn"ev_a hrs="s,"ame="L808"> 808 pathref="+code=pathpathlass,48" class="line" name="L841945roo19e=r>194 href="+code=="line" {
 817   "ata_pageref="+code=path"ata_page893"), struct 19las>19405" id="L805""="+ref">mnt_group_="+valref="+code=path="+valc#"s)48" class="line" name="L841947                 * Moun19>  >194(, struct                  * but19"> >194de=sh/a>, struct   19194de=mnt_devnam"="+ref">mnt_group_ref=>{
 19ass>195(f="+code=mntlass="st pace.c#L879" i="+valref="+code=path="+valc#"same class="line" ndo_retmesp href="+code=mn"o_retmesp/nameame="L808"> 808 pathref="+code=pathpathlass,"rpace.c#L879" iref=>{
mnt_group_msp_ref=>{
, struct 195class="line" elsem"="+ref">mnt_group_ref=>{
" ro"19"st>195:  808 pathref="+code=pathpathlass,"rpace.c#L879" idev_a hr href="+code=mn"ev_a hrs="s,"ref">mnt_group_ref=>{
, struct mnt_group_ref=>{
mnt_group_MS_SHARED{
>195 href="+code=="line"  pace.c#L879" i="+valref="+code=path="+valc#"same class="line" ndo_change_type;
 808 pathref="+code=pathpathlass,"rpace.c#L879" iref=>{
/* Tagged 19ass>1956href="+code=elsem"="+ref">mnt_group_ref=>{
IS_MN19ARE>195(mnt_group_="+valref="+code=path="+valc#"same class="line" ndo_mov=_tmesp href="+code=mn"o_amv=_tmesp/nameame="L808"> 808 pathref="+code=pathpathlass,"rpace.c#L879" idev_a hr href="+code=mn"ev_a hrs="s), struct mnt->195de=show_optioelse/a>, struct IS_MNT19AVE>195de=mnt_devnammmmmmmmmref">mnt_group_="+valref="+code=path="+valc#"same class="line" ndo_new_tmesp href="+code=mn"o_new_tmesp/nameame="L808"> 808 pathref="+code=pathpathlass,"rpace.c#L879" itype_pageref="+code=pathtype_pages="s, L893" id="L893"ref=>{
 817   msp_ref=>{
mnt_group_"ata_pageref="+code=path"ata_page893"), struct , struct  808 path_pup href="+code=mnpath_pup/nameame="L808"> 808 pathref="+code=pathpathlass), struct dom19de=>196: , struct IS_MNT_UN19" c>196(  * race-free way (due03 id="L848" class="line" name="L841967m19de=>196s outside root, discard tha * Allocat  a new ne" name="2" claure and populat  it with contespss=d="L848" class="line" name="L841968);
 868        196       * race-free way (due */ id="L848" class="line" name="L84197(197gt;{
197class>        if (mnt_devna19" c>197: {
, struct " ro"19"st>197ef="+code=mnt2" class="line" name="2"> 892{
, struct 197 href="+code=2" class="line" name="2"> 892{
, struct  87519705" i 876       19e=">197({
{
mnt_group_GFP_KERNEL
s_op->197de=show_optio"="+!L893" id="L893"new_n>{
get_dominENOMEM
, struct , struct get_dominatomic_se"L817" class="liatomic_se"/nameame="L808"> 808 new_n>{
get_dominc892{
 881 19e" >198class="line" L808"> 808 INIT_LIST_HEAD{
 808 new_n>{
get_domin/a h{
, struct >1983lass="line" L808"> 808 init_waitqueue_head/a>{
 808 new_n>{
get_dominpollref="+code=pathpolls="sv, struct 198ef="+code=mntref">mnt_group_new_n>{
get_dominev (d href="+code=mnev (dc#"samenamespace.c#L895" id="L895" 1985 198start19805" id="L805"rpace.c#L879" idown_write;
 808 n" id="L8_sem/a>{
, struct next<19nex>198(stop<19sto>1988f="+code=mntref">mnt_group_new_n>{
get_dominrootL817" class="lirootc#"same class="line" ncopy_trefan>);
get_dominrootL817" class="lirootc#"s, 17"> 817   msp_n>{
get_dominrootL817" class="lirootc#"sass="sref">get_domind="_rootL817" class="lid="_roots="s,48" class="line" name="L841989show   = >198de=mnt_devnammmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmsref">get_dominCL_COPY_ALLL817" class="liCL_COPY_ALL893" |" class="line" nCL_EXPIREref="+code=pathCL_EXPIREs="sv, struct ,>199(f="+code=mnt"="+!L893" id="L893"new_n>{
get_dominrootL817" class="lirootc#"s  >        if (>199gt;get_dominup_write;
 808 n" id="L8_sem/a>{
, struct );
{
, struct >199: get_dominENOMEM
, struct vfsmount199ef="+code=mnt 1995f="+code=mntref">mnt_group_spin_loc);
 808 s/namesp_loc);
, struct  895  19" n>19905" id="L805"rpace.c#L879" i/a h_add_tailref="+code=path/a h_add_tail/nameame="L808"> 808 new_n>{
get_domin/a h{
 808 new_n>{
get_dominrootL817" class="lirootc#"sass="sref">get_domind="_/a h{
, struct 199( 808 s/namesp_loc);
, struct  819ss=>199de=sh/a>, struct mnt->mnt->(<>20>(      * race-free way (due         3 Second pass: switch the tskass="fsass="* eley (ds and mark new s/namespss=d="L848/pre>-& hre12/6b/c6399<2cdea6cd5e529151b39608bc834527_3/20>(<>8" class="line" name="L8420>1a>};
a>>20>3a hr  * race-free way (due         3/ id="L848" class="line" name="L8420>4lass="sref">vfsmountla>20>ef="+code=mntref">mnt_group_pL817" class="lips="same class="line" nmsp_n>{
get_dominrootL817" class="lirootc#"s, struct 20>5f="+code=mntref">mnt_group_qL817" class="liqs="same class="line" nnew_n>{
get_dominrootL817" class="lirootc#"s, struct  895  20> n>20>05" id="L805"while"+code=sb" class=pL817" class="lips="s  >        if (= >20>(mnt_group_qL817" class="liqs="sass="sref">get_domind="_n>{
{
, struct  820>s=>20>de=show_options" clas"="+ref">mnt_group_r>{
        if (mnt->"s>20>de=mnt_devnammmmmmmmmmmmmmmmm"="+ref">mnt_group_pL817" class="lips="sammespace.c#L817" ir>{
get_dominrootL817" class="lirootc#"s.sref">get_domind="{
        if (20, struct mnt20{
get_dominrootL817" class="lirootc#"s.sref">get_domind="{
, struct " ro"20"st>20mnt20<: mnt_group_pL817" class="lips="sammespace.c#L817" ir>{
get_dominpwd/a>{
get_domind="{
        if ( 81320<4lass="line"         t_devnammmmmmmmmspace.c#L817" ipwdt="L817" class="lipwdt="c#"same class="line" npL817" class="lips="s, struct  814       20e=">20< href="+code=="line" {
get_dominpwd/a>{
get_domind="{
, struct s_op->20<({
get_dominrootL817" class="lirootc#"s), struct 20="+>20mnt_group_qL817" class="liqs="same class="line" nnext_d="{
err{
get_dominrootL817" class="lirootc#"s , struct  820 20e" >2081 get_dominup_write;
 808 n" id="L8_sem/a>{
, struct >2082e=sh/a>, struct 2083 mnt_group_roott="L817" class="liroott="c#"s)48" class="line" name="L842084seq_operations <20ef">2084lass="line"          class="line" nd="pup href="+code=mnd="pup/nameL893" id="L893"roott="L817" class="liroott="c#"s), struct start208 href="+code="="+ref">mnt_group_pwdt="L817" class="lipwdt="c#"s)48" class="line" name="L842086next<20nex>208( 808 d="pup href="+code=mnd="pup/nameL893" id="L893"pwdt="L817" class="lipwdt="c#"s), struct stop<20sto>208(mespace.c#L895" id="L895" 2088show   = <20ss=>208de=show_optio="+cod L893" id="L893"new_n>{
, struct >208de=mn };
{
{
{
>20/class="line" name="L92" class="line" name="fs_2" cla{
{
m20/3         if (vfsmount20/ef="+code=mnt2" class="line" name="d="_a href="+ href="+code=mnd="_a href="+/namr#L893" id="L893"new_n>{
, struct mnt<20e=m>20/20/05" id="L805"rpace.c#L879" iBUG_ON{
{
, struct {
{
, struct  837  20" n>20/de=sh/a>, struct 20/de=mnt_devnam"="+!espace.c#L879" iref=>{
mnt_parent<20cla>20cl {
, struct sb<20ode>20ca>, vmespace.c#L895" id="L895" 20c2mnt_root20t" >20cclass="line" L808"> 808 new_n>{
{
 808 new_r>{
, struct 20cn class="string">"no devic20c4root20=ro>20cef="+code=mntref">mnt_group_put_tsp_n>{
{
, struct roo20e=r>20c href="+code=="+cod L893" id="L893"new_n>{
, struct 20las>20c6e=mn                  * Moun20>  >20c(mespace.c#L895" id="L895" 2048                 * but20"> >20c than 893" id="L893"SYSCALL_DEFINE5{
{
  2020cde=mnt_devnammmmmmmmmcharaL893" id="L893"__userref="+code=path__user/nam *,"rpace.c#L879" itype;
{
 20ass>20as         if (mnt_group_="+valref="+code=path="+valc#"s, struct 20aclass="line" unsigned0long L893" id="L893""ata_pageref="+code=path"ata_page893", struct " ro"20"st>20a3lass="line" unsigned0long L893" id="L893"type_pageref="+code=pathtype_pages="s, struct );
/* Tagged 20ass>20a05" iIS_MN20ARE>20a({
 808 type_pageref="+code=pathtype_pages="s), struct mnt->20ade=show_optio"="+L893" id="L893"="+valref="+code=path="+valc#"sa< 0)48" class="line" name="L842059IS_MNT20AVE>20ade=mnt_devnammmmmmmmm="+cod L893" id="L893"="+valref="+code=path="+valc#"s, struct get_domindir_pageref="+code=path"ir_pages="same class="line" ngeta hr href="+code=mngeta hr/nameL893" id="L893"dir_a hr href="+code=mn"ir_a hrs="s), struct  808 ="+valref="+code=path="+valc#"same class="line" nPTR_ERR{
dom20de=>20>3 mnt_group_IS_ERR{
, struct 20>IS_MNT_UN20" c>20>05" id="L805"rpace.c#L879" i="+valref="+code=path="+valc#"same class="line" ncopy_tmesp_option>{
 808 "ev_pageref="+code=path"ev_pages="s), struct m20de=>20>(>20>de=show_options" clasgoco ode=out" class=out2ref="+code=pathout2c#"s, struct  868        20>" id="L828" class="line" name="207({
 808 "ata_pageref="+code=path"ata_page893"), struct 20r1 mnt_group_="+valref="+code=path="+valc#"sa< 0)48" class="line" name="L84207220rclass="line" name="L9goco ode=out" class=out3ref="+code=pathout3c#"s, struct mnt_devna20" c>20rn class="string">"no devic2074" ro"20"st>20ref="+code=mntref">mnt_group_loc)_kernelref="+code=path/oc)_kernel/name), struct 20r5f="+code=mntref">mnt_group_="+valref="+code=path="+valc#"same class="line" ndo_moesp href="+code=mn"o_amesp/name(chara#)17"> 817   "ev_pageref="+code=path"ev_pages="s,"rpace.c#L879" idir_pageref="+code=path"ir_pages="s, (chara#)17"> 817   type_pageref="+code=pathtype_pages="s,/a>, struct  87520r({
 817   "ata_pageref="+code=path"ata_page893"), struct  876       20e=">20r(s_op->20r8f="+code=mntref">mnt_group_fref_pageref="+code=pathfref_page/nameL893" id="L893"data_pageref="+code=path"ata_page893"), struct , struct get_dominfref_pageref="+code=pathfref_page/nameL893" id="L893"dev_pageref="+code=path"ev_pages="s), struct  881 20e" >20a2than 893" id="L893"out2ref="+code=pathout2c#"s:/a>, struct >20a3lass="line" L808"> 808 puta hr href="+code=mnputa hr/nameL893" id="L893"dir_pageref="+code=path"ir_pages="s), struct 20a4than 893" id="L893"out1ref="+code=pathout1c#"s:/a>, struct mnt_group_fref_pageref="+code=pathfref_page/nameL893" id="L893"type_pageref="+code=pathtype_pages="s), struct start20a(, struct next<20nex>20a7e=mn stop<20sto>20ade=sh/a>, struct show   = >20a       * race-free way (due03 id="L848" class="line" name="L84209(,
>20aa>, vrclass="line" name="L9 * It cassbloc). Requires"thc big loc)sheld" id="L848" class="line" name="L842092>20a3lassvoidrL893" id="L893"set_fs_rootL817" class="liset_fs_root/name2" class="line" name="fs_2" cla{
{
vfsmount20a4         if (20a href="+code=2" class="line" name="pathref="+code=pathpathlassc 893" id="L893"old_rootL817" class="liold_rootc#"s, struct  895  20" n>20a05" i 808 r>{
get_dominloc);
, struct  820ss=>20a8f="+code=mntref">mnt_group_old_rootL817" class="liold_rootc#"same class="line" nr>{
get_dominrootL817" class="lirootc#"s, struct mnt->mnt_group_f>{
get_dominrootL817" class="lirootc#"same#L893" id="L893"pathref="+code=pathpathlass, struct mnt->(<>210e5" id="L805"rpace.c#L879" ipath_ge"L817" class="lipath_ge"/nameL893" id="L893"pathref="+code=pathpathlass), struct a>>2101 get_dominwrite_unloc);
 808 r>{
get_dominloc);
, struct mnt_group_old_rootL817" class="liold_rootc#"s.sref">get_domind (dryref="+code=path"e(drylass)48" class="line" name="L8421>3a>)
 808 old_rootL817" class="liold_rootc#"s), struct vfsmountla>210ef="+ "+code=mnt" class="sref21>"+>2106 name="L895"> 895  21> n>210(  * race-free way (due03 id="L848" class="line" name="L842107= 0;
 821>s=>210 than trying to do that in i3 It cassbloc). Requires"thc big loc)sheld" id="L848" class="line" name="L8421>9"sref">mnt->"s>210       * race-free way (due */ id="L848" class="line" name="L84211(21{
{
mnt21        if (" ro"21"st>21{
mnt211n class="string">"no devic2114 813211ef="+code=mntref">mnt_group_write_loc);
 808 r>{
get_dominloc);
, struct  814       21e=">2115f="+code=mntref">mnt_group_old_pwd/a>{
{
get_dominpwd/a>{
, struct {
get_dominpwd/a>{
s_op->211(mnt_group_write_unloc);
 808 r>{
get_dominloc);
, struct 21="+>211" id="L828" class="line" name="212(mnt_group_old_pwd/a>{
get_domind (dryref="+code=path"e(drylass)48" class="line" name="L842181 820 21e" >212gt;get_dominpath_pup href="+code=mnpath_pup/nameame="L808"> 808 old_pwd/a>{
;
}
"no devic2184seq_operations <21ef">2184lassd="L890voidrL893" id="L893"chroot_fs_rer>{
start218 href>        if (next<21nex>218(stop<21sto>2127/a>({
, struct show   = <21ss=>212de=sh/a>, struct >2129f="+code=mntref">mnt_group_="ad_loc);
 808 task/a h_loc);
};
{
get_domintask_loc);
)
{
get_dominf>{
, struct m213: mnt_group_r>{
        if (vfsmount21/ef="+code=mnt="line" name="L9L893" id="L893"atomic_inc/a>{
 808 r>{
get_dominc892{
mnt<21e=m>213 href="+code=="line" get_domintask_unloc);
213(mnt_group_r>{
get_dominrootL817" class="lirootc#"s.sref">get_domind (dryref="+code=path"e(drylassammespace.c#L817" iold_rootL817" class="liold_rootc#"sass="sref">get_domind (dryref="+code=path"e(drylass/a>, struct {
get_dominrootL817" class="lirootc#"s.sref">get_domind="{
get_domind="{
, struct  837  21" n>213de=show_options" clas="line" get_dominset_fs_rootL817" class="liset_fs_root/nameL893" id="L893"f>{
mnt_group_r>{
get_dominpwd/a>{
get_domind (dryref="+code=path"e(drylassammespace.c#L817" iold_rootL817" class="liold_rootc#"sass="sref">get_domind (dryref="+code=path"e(drylass/a>, struct mnt_parent<21cla>21cl {
get_dominpwd/a>{
get_domind="{
get_domind="{
, struct sb<21ode>214gt;{
{
mnt_root21t" >214class="line" name="L999999999sref">get_dominput_fs_2" cla{
{
, struct 214: , struct root21=ro>214ef="+code=mnt="line" name="L9L893" id="L893"task_unloc);
roo21e=r>21c href="+code=}tref">mnt_group_while_each_thread/a>{
21las>21405" id="L805"rpace.c#L879" i="ad_unloc);
 808 task/a h_loc);
                 * Moun21>  >2147e=mn                  * but21"> >214de=sh/a>, struct   21214       * race-free way (due03 id="L848" class="line" name="L84215( 21ass>215>      * race-free way (due * pivo"_root Semantics: id="L848" class="line" name="L842151                ret210215a>, vrclass="line" name="L9 * Moves"thc root file"system of"thc curre=" process to thc directory put_old, id="L848" class="line" name="L842152" ro"21"st>2153a hr  * race-free way (due * root/cwd of"all processes"which had"thcm on"thc curre=" root to new_root" id="L848" class="line" name="L842154>21a hrefside root, discard tha * Re2" iction>: id="L848" class="line" name="L842156/* Tagged 21ass>215(  * race-free way (due * Thc new_root and put_old must bc directories, and  must not+bc on"thc id="L848" class="line" name="L842157IS_MN21ARE>215s outside root, discard tha * s>IS file""system as thc curre=" process root" Thc put_old  must +bc id="L848" class="line" name="L842158mnt->215 than trying to do that in i3 underneath new_root,mm".e. adding a non-zero number of"/.. to thc 2" ing id="L848" class="line" name="L842159IS_MNT21AVE>215       * race-free way (due * pointed to by put_old must yield thc 2>IS directory as"new_root. No othcr id="L848" class="line" name="L84216(mnt_master->mn>216>      * race-free way (due * file"system may+bc amesped on"put_old. After all, new_root is a amesppoint" id="L848" class="line" name="L842161dom21de=>2163a hr  * race-free way (due * See Docuy (dation/filesystems/ramfs-rootfs-initramfs.txt for alternatives id="L848" class="line" name="L8421642164lass  * race-free way (due * in"this situation" id="L848" class="line" name="L842165IS_MNT_UN21" c>216(  * race-free way (due * Note>: id="L848" class="line" name="L842167m21de=>216s outside root, discard tha *  - wS don't amve root/cwd if"thcy are not+at"thc root (="ason: if"something id="L848" class="line" name="L842168);
 868        216       * race-free way (due *  - it's okay+to pick a root that isn't thc root of"a file"system, e.g" id="L848" class="line" name="L84217(217a>, vrclass="line" name="L9 *    though, so you may+need+to say+amesp --bind /n"limy_root /n"limy_root id="L848" class="line" name="L8421r2217classrclass="line" name="L9 3    first" id="L848" class="line" name="L842173mnt_devna21" c>2173a hr  * race-free way (due */ id="L848" class="line" name="L842174" ro"21"st>2174than 893" id="L893"SYSCALL_DEFINE2ref="+code=pathSYSCALL_DEFINE2/nameL893" id="L893"pivo"_rootref="+code=pathpivo"_rootc#"s, con>tmcharaL893" id="L893"__userref="+code=path__user/nam *,"rpace.c#L879" inew_rootL817" class="linew_rootlass,/a>, struct 217 href="+code=="line" con>tmcharaL893" id="L893"__userref="+code=path__user/nam *,"rpace.c#L879" iput_old{
, struct  87521r(>        if ( 876       21e=">2177/a>(, struct s_op->21r8f="+code=mnt2" class="line" name="pathref="+code=pathpathlassc 893" id="L893"newL817" class="linewc#"s, L893" id="L893"old{
, struct mnt_group_errorref="+code=patherrorc#"s, struct , struct  881 21e" >218class="line" name="L9="+cod -L893" id="L893"EPERM{
, struct >218n class="string">"no devic2184}
mnt_group_errorref="+code=patherrorc#"same class="line" nuser_path_dirref="+code=pathuser_path_dir/nameL893" id="L893"new_rootL817" class="linew_rootlass,"ame="L808"> 808 newL817" class="linewc#"s), struct mnt_group_errorref="+code=patherrorc#"s)/a>, struct start218(, struct next<21nex>218(, struct stop<21sto>218de=show_optio"="+!L893" id="L893"check_d="{
get_domind="{
, struct show   = >218de=mnt_devnammmmmmmmmgoco ode=out" class=out1ref="+code=pathout1c#"s, struct ,>219m5" i};
get_dominerrorref="+code=patherrorc#"same class="line" nuser_path_dirref="+code=pathuser_path_dir/nameL893" id="L893"put_old{
 808 old{
, struct mnt_group_errorref="+code=patherrorc#"s)/a>, struct >219: , struct vfsmount21a4 , struct 2195f="+code=mntref">mnt_group_errorref="+code=patherrorc#"same class="line" nsecurity_sb_pivo"rootL817" class="lisecurity_sb_pivo"root/nameame="L808"> 808 old{
 808 newL817" class="linewc#"s), struct  895  21" n>2196lass="line" "="+ref">mnt_group_errorref="+code=patherrorc#"s) >        if (219( 808 old{
, struct  821ss=>219de=show_options" clasgoco ode=out" class=out1ref="+code=pathout1c#"s, struct mnt->((mnt->(<>220m5" ia>};
get_domin="ad_loc);
 808 curre="{
get_dominr>{
get_dominloc);
, struct  808 =ootL817" class="lirootc#"sameL808"> 808 curre="{
get_dominr>{
get_dominrootL817" class="lirootc#"s, struct a>>220:  808 curre="{
get_dominr>{
get_dominrootL817" class="lirootc#"s , struct vfsmountla>220ef="+code=mntref">mnt_group_="ad_unloc);
 808 curre="{
get_dominr>{
get_dominloc);
, struct 2205f="+code=mntref">mnt_group_down_write;
 808 a href="+_sem/a>{
, struct  895  22> n>22005" id="L805"rpace.c#L879" imutex_loc);
 808 old{
get_domind (dryref="+code=path"e(drylassass="sref">get_domind_inomiref="+code=path"_inomilassass="sref">get_domini_mutexref="+code=pathi_mutexs="sv, struct = >220(, struct  822>s=>220de=show_optio"="+L893" id="L893"IS_MNT_SHARED{
get_domind="{
, struct mnt->"s>220de=mnt_devnammmmmmmmmL893" id="L893"IS_MNT_SHARED{
get_domind="{
get_domind="_pare="L817" class="lid="_pare="s="s) ||/a>, struct 221l get_domind="{
get_domind="_pare="L817" class="lid="_pare="s="s))/a>, struct mnt221gt;, struct " ro"22"st>221class="line" "="+!L893" id="L893"check_d="{
get_domind="{
, struct mnt221: , struct  813221ef="+code=mntref">mnt_group_errorref="+code=patherrorc#"same-L893" id="L893"ENOENT{
, struct  814       22e=">2215f="+code=mnt"="+ref">mnt_group_IS_DEADDIR{
get_domind (dryref="+code=path"e(drylassass="sref">get_domind_inomiref="+code=path"_inomilass))/a>, struct , struct s_op->221({
get_domind (dryref="+code=path"e(drylass)mame="ame=""!L893" id="L893"IS_ROOT{
get_domind (dryref="+code=path"e(drylass))/a>, struct , struct 22="+>221de=mnt_devnam"="+code=sb" class=d_unhashed/a>{
get_domind (dryref="+code=path"e(drylass)mame="ame=""!L893" id="L893"IS_ROOT{
get_domind (dryref="+code=path"e(drylass))/a>, struct , struct  820 22e" >2221 get_dominerrorref="+code=patherrorc#"same-L893" id="L893"EBUSY{
, struct >222class="line" "="+ref">mnt_group_newL817" class="linewc#"s.sref">get_domind="{
get_domind="{
, struct 222: get_domind="{
get_domind="{
, struct seq_operations <22ef">2224lass="line"         goco ode=out" class=out2ref="+code=pathout2c#"s<   * race-free way (due03 loop, on"thc s>IS file"system  */ id="L848" class="line" name="L842285start2225f="+code=mntref">mnt_group_errorref="+code=patherrorc#"same-L893" id="L893"EINVAL{
, struct next<22nex>2226lass="line" "="+ref">mnt_group_rootL817" class="lirootc#"s.sref">get_domind="{
get_domind="_rootL817" class="lid="_rootlass=!mespace.c#L817" irootL817" class="lirootc#"s.sref">get_domind (dryref="+code=path"e(drylass)48" class="line" name="L842287stop<22sto>222(show   = <22ss=>222de=show_optio"="+L893" id="L893"=ootL817" class="lirootc#"s.sref">get_domind="{
get_domind="_pare="L817" class="lid="_pare="s="sammespace.c#L817" irootL817" class="lirootc#"s.sref">get_domind="{
, struct >222de=mnt_devnammmmmmmmmgoco ode=out" class=out2ref="+code=pathout2c#"s<   * race-free way (due03 not+attached */ id="L848" class="line" name="L84223(};
mnt_group_newL817" class="linewc#"s.sref">get_domind="{
get_domind="_rootL817" class="lid="_rootlass=!mespace.c#L817" inewL817" class="linewc#"s.sref">get_domind (dryref="+code=path"e(drylass)48" class="line" name="L842231>223class="line" "="+ref">mnt_group_newL817" class="linewc#"s.sref">get_domind="{
get_domind="_pare="L817" class="lid="_pare="s="sammespace.c#L817" inewL817" class="linewc#"s.sref">get_domind="{
m223: vfsmount22/ef="+code=mnt  * race-free way (due03 make sure wS cassreach put_old from new_root */ id="L848" class="line" name="L842235mnt<22e=m>2235f="+code=mntref">mnt_group_tmpref="+code=pathtmps="sameL808"> 808 old{
get_domind="{
, struct 22305" id="L805"rpace.c#L879" ispin_loc);
 808 s/namesp_loc);
, struct get_domind="{
        if ( 837  22" n>223de=show_options" clasfor (;;) >        if (223de=mnt_devnammmmmmmmmmmmmmmmm"="+ref">mnt_group_tmpref="+code=pathtmps="sass="sref">get_domind="_pare="L817" class="lid="_pare="s="sammespace.c#L817" itmpref="+code=pathtmps="s)48" class="line" name="L84224(mnt_parent<22cla>22cl sb<22ode>224gt;mnt_group_tmpref="+code=pathtmps="sass="sref">get_domind="_pare="L817" class="lid="_pare="s="sammespace.c#L817" inewL817" class="linewc#"s.sref">get_domind="{
mnt_root22t" >224class="line" name="L99999999999999999b="ak, struct 224: mnt_group_tmpref="+code=pathtmps="sameL808"> 808 tmpref="+code=pathtmps="sass="sref">get_domind="_pare="L817" class="lid="_pare="s="s, struct root22=ro>224ef="+code=mnt="line"  roo22e=r>22c href="+code=t_devnam"="+!L893" id="L893"is_subdirref="+code=pathis_subdir/nameL893" id="L893"tmpref="+code=pathtmps="sass="sref">get_domind="_amesppointL817" class="lid="_amesppoints="s,"rpace.c#L879" inewL817" class="linewc#"s.sref">get_domind (dryref="+code=path"e(drylass))/a>, struct 22las>224(, struct get_domind (dryref="+code=path"e(drylass,"rpace.c#L879" inewL817" class="linewc#"s.sref">get_domind (dryref="+code=path"e(drylass))/a>, struct                  * but22"> >224de=show_options" clasgoco ode=out" class=out3ref="+code=pathout3c#"s, struct   222249f="+code=mntref">mnt_group_detach_d="{
get_domind="{
 808 pare="_pathref="+code=pathpare="_paths="sv, struct  22ass>225e5" id="L805"rpace.c#L879" idetach_d="{
get_domind="{
 808 root_pare="L817" class="liroot_pare="s="sv, struct 225class="line" L808"> 808 attach_d="{
get_domind="{
 808 old{
, struct " ro"22"st>2253 mnt_group_attach_d="{
get_domind="{
 808 root_pare="L817" class="liroot_pare="s="sv, struct >2255f="+code=mntref">mnt_group_touch_d="_a href="+ref="+code=pathtouch_d="_a href="+/nameL893" id="L893"curre="{
get_dominnsproxyref="+code=pathnsproxys="sass="sref">get_domind="_n>{
s="sv, struct /* Tagged 22ass>22505" id="L805"rpace.c#L879" ispin_unloc);
 808 s/namesp_loc);
, struct IS_MN22ARE>225({
 808 rootL817" class="lirootc#"s,"ame="L808"> 808 newL817" class="linewc#"s), struct mnt->2258f="+code=mntref">mnt_group_security_sb_post_pivo"rootL817" class="lisecurity_sb_post_pivo"root/nameame="L808"> 808 rootL817" class="lirootc#"s,"ame="L808"> 808 newL817" class="linewc#"s), struct IS_MNT22AVE>2259f="+code=mntref">mnt_group_errorref="+code=patherrorc#"same0, struct  808 root_pare="L817" class="liroot_pare="s="sv, struct get_dominpath_pup href="+code=mnpath_pup/nameame="L808"> 808 pare="_pathref="+code=pathpare="_paths="sv, struct , struct dom22de=>226:  808 old{
get_domind (dryref="+code=path"e(drylassass="sref">get_domind_inomiref="+code=path"_inomilassass="sref">get_domini_mutexref="+code=pathi_mutexs="sv, struct mnt_group_up_write;
 808 a href="+_sem/a>{
, struct 2265f="+code=mntref">mnt_group_path_pup href="+code=mnpath_pup/nameame="L808"> 808 rootL817" class="lirootc#"sv, struct IS_MNT_UN22" c>22605" id="L805"rpace.c#L879" ipath_pup href="+code=mnpath_pup/nameame="L808"> 808 old{
, struct m22de=>226s outsde=out" class=out1ref="+code=pathout1c#"s:/a>, struct >2268f="+code=mntref">mnt_group_path_pup href="+code=mnpath_pup/nameame="L808"> 808 newL817" class="linewc#"s), struct  868        226      de=out" class=out0{
, struct mnt_group_errorref="+code=patherrorc#"s, struct 227a>, vrde=out" class=out3ref="+code=pathout3c#"s:/a>, struct 227class="line" L808"> 808 spin_unloc);
 808 s/namesp_loc);
, struct mnt_devna22" c>227: , struct " ro"22"st>2274than 227 href 87522r(d="L890voidrL893" id="L893"__initref="+code=path__init get_domininit_amesp_tree;
 876       22e=">2277/a>(>        if (s_op->22r8f="+code=mnt2" class="line" name="s/namesp{
{
, struct , struct  881 22e" >228class="line" L808"> 808 d="{
"rootfs" id="L8, 0, L * race-free2" ing">"rootfs" id="L8, rpace.c#L879" iNULL{
, struct >228: mnt_group_IS_ERR{
}
mnt_group_panic/a>{
"Can't creatc rootfs" id="L8v, struct mnt_group_n>{
{
, struct start2286lass="line" "="+!L893" id="L893"n>{
, struct next<22nex>228("Can't allocatc initial a href="+" id="L8v, struct stop<22sto>2288f="+code=mntref">mnt_group_atomic_se"L817" class="liatomic_se"/nameame="L808"> 808 n>{
get_dominc892{
show   = >2289f="+code=mntref">mnt_group_INIT_LIST_HEAD{
 808 n>{
get_domin/a h{
, struct ,>229e5" id="L805"rpace.c#L879" iinit_waitqueue_head/a>{
 808 n>{
get_dominpoll/a>{
, struct >2291 get_dominn>{
get_domineve="L817" class="lieve="c#"same0, struct  808 /a h_add/a>{
 808 d="{
get_domind="_/a h{
 808 n>{
get_domin/a h{
, struct >229: get_domin=ootL817" class="lirootc#"sameL808"> 808 d="{
, struct vfsmount229ef="+code=mntref">mnt_group_d="{
get_domind="_n>{
s="sameL808"> 808 n>{
, struct 229 href 895  22" n>22905" id="L805"rpace.c#L879" iinit_task/a>{
get_dominnsproxyref="+code=pathnsproxys="sass="sref">get_domind="_n>{
s="sameL808"> 808 n>{
, struct 229({
, struct  822ss=>229de=sh/a>, struct mnt->mnt_group_rootL817" class="lirootc#"s.sref">get_domind="{
get_domin=ootL817" class="lirootc#"s, struct mnt->(<>230e5" id="L805"rpace.c#L879" irootL817" class="lirootc#"s.sref">get_domind (dryref="+code=path"e(drylassamss="line" name="n>{
get_domin=ootL817" class="lirootc#"sass="sref">get_domind="_rootL817" class="lid="_rootlass, struct a>>2301 , struct  808 set_fs_pwd/a>{
get_dominr>{
 808 rootL817" class="lirootc#"sv, struct a>>230: get_dominr>{
 808 rootL817" class="lirootc#"sv, struct vfsmountla>2304than 5"+code=mnt" class="sref23>"+>230 href6 name="L895"> 895  23> n>23005" ivoidrL893" id="L893"__initref="+code=path__init get_domind="_initref="+code=pathd="_init/namevoid)/a>, struct = >2307/a>(>        if ( 823>s=>230de=show_optiounsignedrL893" id="L893"u;
9"sref">mnt->"s>230de=mnt_devnam"="sref">mnt_group_errref="+code=patherrlass, struct 231m5" imnt2311 get_domininit_rwsem/a>{
 808 n href="+_sem/a>{
, struct " ro"23"st>231class/a>, struct mnt231: "d="_cache" id="L8, sizeof(2" class="line" name="s/namesp{
 813231ef="+code=mntcode=mnttttttttt0, rpace.c#L879" iSLAB_HWCACHE_ALIGN{
, struct  814       23e=">231 href, struct s_op->231(/a>, struct , struct 23="+>231de=mnt_devnammmmmmmmmL893" id="L893"panic/a>{
"Failed+to allocatc mmesp hash table\n" id="L8v, struct  820 23e" >2321 get_dominp intk/a>{
"Mmesp-cache hash table e(dries: %lu\n" id="L8,"rpace.c#L879" iHASH_SIZE/a>{
, struct >232class/a>, struct 232: {
seq_operations <23ef">2324lass="line"         ref">mnt_group_INIT_LIST_HEAD{
 808 mmesp_hashtableref="+code=pathmmesp_hashtables="s[L893" id="L893"u;
start232 hrefnext<23nex>23205" id="L805"rpace.c#L879" ierrref="+code=patherrlassame class="line" nsysfs_initref="+code=pathsysfs_init/namev, struct stop<23sto>232(, struct show   = <23ss=>232de=show_options" classref">get_dominp intk/a>{
get_dominKERN_WARNING/a>{
"%s: sysfs_init error: %d\n" id="L8,/a>, struct >232de=mnt_devnammmmmmmmmns" classref">get_domin__func__ref="+code=path__func__s="s,"rpace.c#L879" ierrref="+code=patherrlass), struct >233e5" id="L805"rpace.c#L879" ifs_kobj{
{
"fs" id="L8, rpace.c#L879" iNULL{
, struct , struct >233class="line" name="L9sref">get_dominp intk/a>{
get_dominKERN_WARNING/a>{
"%s: kobj creatc error\n" id="L8,"rpace.c#L879" i__func__ref="+code=path__func__s="sv, struct m233: , struct vfsmount233ef="+code=mntref">mnt_group_init_amesp_tree;
mnt<23e=m>2335f="+ 23305" i{
, struct  837  23" n>233de=sh>        if (233de=mnt_devnam2" class="line" name="s/namesp{
 808 n>{
get_domin=ootL817" class="lirootc#"s, struct mnt_parent<23cla>234e5" id="L805"rpace.c#L879" iLIST_HEAD{
, struct sb<23ode>2341 get_dominn>{
get_domin=ootL817" class="lirootc#"sameL808"> 808 NULL{
, struct mnt_root23t" >234class="line" L808"> 808 spin_unloc);
 808 s/namesp_loc);
, struct 234:  808 a href="+_sem/a>{
, struct root23=ro>234ef="+code=mntref">mnt_group_spin_loc);
 808 s/namesp_loc);
, struct roo23e=r>2345f="+code=mntref">mnt_group_uamesp_tree;
get_domin=ootL817" class="lirootc#"s, 0, ame="L808"> 808 uamesp_la h{
, struct 23las>23405" id="L805"rpace.c#L879" ispin_unloc);
 808 s/namesp_loc);
, struct  808 a href="+_sem/a>{
, struct                  * but23"> >2348f="+code=mntref">mnt_group_release_amesp>{
 808 uamesp_la h{
, struct   232349f="+code=mntref">mnt_group_kfree;
get_dominn>{
, struct  23ass>235e5" i                 ret2302351 


footer"> The original LXR software by"thc a href="+http://sourceforge.net/projects/lxr">LXR wayunitylass,"this experiy (dal version by"a href="+mailto:lxr@ ux.no">lxr@ ux.nolass.
subfooter"> lxr. ux.no kindly hosped by"a href="+http://www.redpill- pro.no">Redpill L pro ASlass,"provider of L ux wnsulting and operations services since 1995.