On Sun, Jan 16, 2011 at 10:15:31PM +0100, Joachim Eastwood wrote: > Hi, > > On 1/16/11, Al Viro <viro@xxxxxxxxxxxxxxxxxx> wrote: > > Al Viro (3): > > sanitize vfsmount refcounting changes > > f03c65993b98eeb909a4012ce7833c5857d74755 - sanitize vfsmount refcounting changes > > Breaks my ARM !CONFIG_SMP compile > > CC fs/namespace.o > fs/namespace.c: In function 'commit_tree': > fs/namespace.c:629: error: 'struct vfsmount' has no member named 'mnt_longterm' > fs/namespace.c: In function 'umount_tree': > fs/namespace.c:1192: error: 'struct vfsmount' has no member named 'mnt_longterm' > fs/namespace.c: In function 'mnt_make_longterm': > fs/namespace.c:2246: error: 'struct vfsmount' has no member named 'mnt_longterm' > fs/namespace.c: In function 'mnt_make_shortterm': > fs/namespace.c:2251: error: 'struct vfsmount' has no member named 'mnt_longterm' > fs/namespace.c:2254: error: 'struct vfsmount' has no member named 'mnt_longterm' > fs/namespace.c: In function 'dup_mnt_ns': > fs/namespace.c:2295: error: 'struct vfsmount' has no member named 'mnt_longterm' > fs/namespace.c:2299: error: 'struct vfsmount' has no member named 'mnt_longterm' > fs/namespace.c:2305: error: 'struct vfsmount' has no member named 'mnt_longterm' > fs/namespace.c: In function 'create_mnt_ns': > fs/namespace.c:2351: error: 'struct vfsmount' has no member named 'mnt_longterm' Aaaaargh... Brown paperbag time - all testing was on SMP boxen ;-/ The fix follows. Linus, I've dropped that into for-linus in usual place (git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6.git/), so if you prefer to pull it, it's there. commit 91ed228ab50daa7aca54faa8bf5208b97e3448b8 Author: Al Viro <viro@xxxxxxxxxxxxxxxxxx> Date: Sun Jan 16 16:32:11 2011 -0500 mnt_longterm is there only on SMP Signed-off-by: Al Viro <viro@xxxxxxxxxxxxxxxxxx> diff --git a/fs/namespace.c b/fs/namespace.c index 48809e2..9f544f3 100644 --- a/fs/namespace.c +++ b/fs/namespace.c @@ -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); } -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html