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    [W:0.048 / U:0.492 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site