From mboxrd@z Thu Jan 1 00:00:00 1970 From: Valerie Aurora Subject: [PATCH] VFS: Clean up shared mount flag propagation Date: Tue, 26 Jan 2010 14:20:47 -0500 Message-ID: <20100126192047.GB32353@shell> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Cc: linux-fsdevel@vger.kernel.org, Christoph Hellwig , Erez Zadok , Ram Pai To: Alexander Viro Return-path: Received: from mx1.redhat.com ([209.132.183.28]:5130 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754717Ab0AZTVS (ORCPT ); Tue, 26 Jan 2010 14:21:18 -0500 Content-Disposition: inline Sender: linux-fsdevel-owner@vger.kernel.org List-ID: Al, you might have already fixed this as part of your mount flag rewrite, but here's a patch to clean up some problems with shared mount flag propagation that I ran into while working on union mounts. Against 2.6.32. -VAL commit 3f436c4466f278900d451494b317f6bb80b4c24b Author: Valerie Aurora Date: Tue Jan 26 11:09:00 2010 -0800 VFS: Clean up shared mount flag propagation The handling of mount flags in set_mnt_shared() got a little tangled up during previous cleanups, with the following problems: * MNT_PNODE_MASK is defined as a literal constant when it should be a bitwise xor of other MNT_* flags * set_mnt_shared() clears and then sets MNT_SHARED (part of MNT_PNODE_MASK) * MNT_PNODE_MASK could use a comment in mount.h * MNT_PNODE_MASK is a terrible name, change to MNT_SHARED_MASK This patch fixes these problems. diff --git a/fs/pnode.h b/fs/pnode.h index 958665d..adc52ca 100644 --- a/fs/pnode.h +++ b/fs/pnode.h @@ -26,7 +26,7 @@ static inline void set_mnt_shared(struct vfsmount *mnt) { - mnt->mnt_flags &= ~MNT_PNODE_MASK; + mnt->mnt_flags &= ~MNT_SHARED_MASK; mnt->mnt_flags |= MNT_SHARED; } diff --git a/include/linux/mount.h b/include/linux/mount.h index 5d52753..257985f 100644 --- a/include/linux/mount.h +++ b/include/linux/mount.h @@ -34,7 +34,15 @@ struct mnt_namespace; #define MNT_SHARED 0x1000 /* if the vfsmount is a shared mount */ #define MNT_UNBINDABLE 0x2000 /* if the vfsmount is a unbindable mount */ -#define MNT_PNODE_MASK 0x3000 /* propagation flag mask */ +/* + * MNT_SHARED_MASK is the set of flags that should be cleared when a + * mount becomes shared. Currently, this is only the flag that says a + * mount cannot be bind mounted, since this is how we create a mount + * that shares events with another mount. If you add a new MNT_* + * flag, consider how it interacts with shared mounts. + */ +#define MNT_SHARED_MASK (MNT_UNBINDABLE) + struct vfsmount { struct list_head mnt_hash;