lkml.org 
[lkml]   [2012]   [Feb]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
From
Subject[PATCH 33/73] unionmount: Mark lower layers in union [ver #2]
Date
Mark lower layers in union to make it easier to tell when they're being
accessed - just in case a file gets mounted over a unioned lower file.

Signed-off-by: David Howells <dhowells@redhat.com>
---
fs/namespace.c | 5 ++++-
fs/pnode.h | 1 +
fs/union.h | 5 +++++
include/linux/mount.h | 1 +
4 files changed, 11 insertions(+), 1 deletions(-)
diff --git a/fs/namespace.c b/fs/namespace.c
index 5fbe3b0..1f24a6b 100644
--- a/fs/namespace.c
+++ b/fs/namespace.c
@@ -787,6 +787,9 @@ static struct mount *clone_mnt(struct mount *old, struct dentry *root,
list_add_tail(&mnt->mnt_instance, &sb->s_mounts);
br_write_unlock(vfsmount_lock);

+ if ((flag & CL_MAKE_UNION))
+ mnt->mnt.mnt_flags |= MNT_UNION_LOWER;
+
if (flag & CL_SLAVE) {
list_add(&mnt->mnt_slave, &old->mnt_slave_list);
mnt->mnt_master = old;
@@ -1509,7 +1512,7 @@ static int clone_union_tree(struct mount *topmost, struct path *mntpnt)
cloned_tree = copy_tree(mnt, mnt->mnt.mnt_root,
CL_COPY_ALL | CL_PRIVATE |
CL_NO_SHARED | CL_NO_SLAVE |
- CL_MAKE_HARD_READONLY);
+ CL_MAKE_HARD_READONLY | CL_MAKE_UNION);
if (IS_ERR(cloned_tree))
return PTR_ERR(cloned_tree);

diff --git a/fs/pnode.h b/fs/pnode.h
index 321d7ab..3fd2afe 100644
--- a/fs/pnode.h
+++ b/fs/pnode.h
@@ -25,6 +25,7 @@
#define CL_NO_SHARED 0x20
#define CL_NO_SLAVE 0x40
#define CL_MAKE_HARD_READONLY 0x80
+#define CL_MAKE_UNION 0x100

static inline void set_mnt_shared(struct mount *mnt)
{
diff --git a/fs/union.h b/fs/union.h
index 757f28c..48a9277 100644
--- a/fs/union.h
+++ b/fs/union.h
@@ -56,6 +56,11 @@ static inline bool IS_MNT_UNION(struct vfsmount *mnt)
return mnt->mnt_flags & MNT_UNION;
}

+static inline bool IS_MNT_LOWER(struct vfsmount *mnt)
+{
+ return mnt->mnt_flags & MNT_UNION_LOWER;
+}
+
static inline bool IS_DIR_UNIONED(struct dentry *dentry)
{
return !!dentry->d_union_stack;
diff --git a/include/linux/mount.h b/include/linux/mount.h
index 67f46fa..bd21196 100644
--- a/include/linux/mount.h
+++ b/include/linux/mount.h
@@ -48,6 +48,7 @@ struct mnt_namespace;
#define MNT_INTERNAL 0x4000
#define MNT_HARD_READONLY 0x8000 /* has a hard read-only ref on the sb */
#define MNT_UNION 0x10000 /* top layer of a union mount */
+#define MNT_UNION_LOWER 0x20000 /* lower layer of a union mount */

struct vfsmount {
struct dentry *mnt_root; /* root of the mounted tree */


\
 
 \ /
  Last update: 2012-02-21 20:59    [from the cache]
©2003-2011 Jasper Spaans