VFS: Fix UP compile error in fs/namespace.c
Al Viro [Sun, 16 Jan 2011 21:32:11 +0000 (16:32 -0500)]
mnt_longterm is there only on SMP

Reported-and-tested-by: Joachim Eastwood <manabian@gmail.com>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

fs/namespace.c

index 48809e2..9f544f3 100644 (file)
@@ -611,6 +611,21 @@ static void attach_mnt(struct vfsmount *mnt, struct path *path)
        list_add_tail(&mnt->mnt_child, &path->mnt->mnt_mounts);
 }
 
+static inline void __mnt_make_longterm(struct vfsmount *mnt)
+{
+#ifdef CONFIG_SMP
+       atomic_inc(&mnt->mnt_longterm);
+#endif
+}
+
+/* needs vfsmount lock for write */
+static inline void __mnt_make_shortterm(struct vfsmount *mnt)
+{
+#ifdef CONFIG_SMP
+       atomic_dec(&mnt->mnt_longterm);
+#endif
+}
+
 /*
  * vfsmount lock must be held for write
  */
@@ -626,7 +641,7 @@ static void commit_tree(struct vfsmount *mnt)
        list_add_tail(&head, &mnt->mnt_list);
        list_for_each_entry(m, &head, mnt_list) {
                m->mnt_ns = n;
-               atomic_inc(&m->mnt_longterm);
+               __mnt_make_longterm(m);
        }
 
        list_splice(&head, n->list.prev);
@@ -1189,7 +1204,7 @@ void umount_tree(struct vfsmount *mnt, int propagate, struct list_head *kill)
                list_del_init(&p->mnt_list);
                __touch_mnt_namespace(p->mnt_ns);
                p->mnt_ns = NULL;
-               atomic_dec(&p->mnt_longterm);
+               __mnt_make_shortterm(p);
                list_del_init(&p->mnt_child);
                if (p->mnt_parent != p) {
                        p->mnt_parent->mnt_ghosts++;
@@ -2243,16 +2258,18 @@ static struct mnt_namespace *alloc_mnt_ns(void)
 
 void mnt_make_longterm(struct vfsmount *mnt)
 {
-       atomic_inc(&mnt->mnt_longterm);
+       __mnt_make_longterm(mnt);
 }
 
 void mnt_make_shortterm(struct vfsmount *mnt)
 {
+#ifdef CONFIG_SMP
        if (atomic_add_unless(&mnt->mnt_longterm, -1, 1))
                return;
        br_write_lock(vfsmount_lock);
        atomic_dec(&mnt->mnt_longterm);
        br_write_unlock(vfsmount_lock);
+#endif
 }
 
 /*
@@ -2292,17 +2309,17 @@ static struct mnt_namespace *dup_mnt_ns(struct mnt_namespace *mnt_ns,
        q = new_ns->root;
        while (p) {
                q->mnt_ns = new_ns;
-               atomic_inc(&q->mnt_longterm);
+               __mnt_make_longterm(q);
                if (fs) {
                        if (p == fs->root.mnt) {
                                fs->root.mnt = mntget(q);
-                               atomic_inc(&q->mnt_longterm);
+                               __mnt_make_longterm(q);
                                mnt_make_shortterm(p);
                                rootmnt = p;
                        }
                        if (p == fs->pwd.mnt) {
                                fs->pwd.mnt = mntget(q);
-                               atomic_inc(&q->mnt_longterm);
+                               __mnt_make_longterm(q);
                                mnt_make_shortterm(p);
                                pwdmnt = p;
                        }
@@ -2348,7 +2365,7 @@ struct mnt_namespace *create_mnt_ns(struct vfsmount *mnt)
        new_ns = alloc_mnt_ns();
        if (!IS_ERR(new_ns)) {
                mnt->mnt_ns = new_ns;
-               atomic_inc(&mnt->mnt_longterm);
+               __mnt_make_longterm(mnt);
                new_ns->root = mnt;
                list_add(&new_ns->list, &new_ns->root->mnt_list);
        }