lkml.org 
[lkml]   [2005]   [Jul]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    , miklos@szeredi.hu, Janak Desai <janak@us.ibm.com>, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org
    Subject: [PATCH 2/7] shared subtree
    Content-Type: text/x-patch; name=unclone.patch
    Content-Disposition: inline; filename=unclone.patch

    Adds the ability to unclone a vfs tree. A uncloned vfs tree will not be
    clonnable, and hence cannot be bind/rbind to any other mountpoint.

    RP

    Signed by Ram Pai (linuxram@us.ibm.com)

    fs/namespace.c | 15 ++++++++++++++-
    include/linux/fs.h | 1 +
    include/linux/mount.h | 15 +++++++++++++++
    3 files changed, 30 insertions(+), 1 deletion(-)

    Index: 2.6.12.work2/fs/namespace.c
    ===================================================================
    --- 2.6.12.work2.orig/fs/namespace.c
    +++ 2.6.12.work2/fs/namespace.c
    @@ -673,6 +673,14 @@ static int do_make_private(struct vfsmou
    return 0;
    }

    +static int do_make_unclone(struct vfsmount *mnt)
    +{
    + if(mnt->mnt_pnode)
    + pnode_disassociate_mnt(mnt);
    + set_mnt_unclone(mnt);
    + return 0;
    +}
    +
    /*
    * recursively change the type of the mountpoint.
    */
    @@ -682,6 +690,7 @@ static int do_change_type(struct nameida
    int err=0;

    if (!(flag & MS_SHARED) && !(flag & MS_PRIVATE)
    + && !(flag & MS_UNCLONE)
    && !(flag & MS_SLAVE))
    return -EINVAL;

    @@ -700,6 +709,9 @@ static int do_change_type(struct nameida
    case MS_PRIVATE:
    err = do_make_private(m);
    break;
    + case MS_UNCLONE:
    + err = do_make_unclone(m);
    + break;
    }
    }
    spin_unlock(&vfsmount_lock);
    @@ -1140,7 +1152,8 @@ long do_mount(char * dev_name, char * di
    data_page);
    else if (flags & MS_BIND)
    retval = do_loopback(&nd, dev_name, flags & MS_REC);
    - else if (flags & MS_SHARED || flags & MS_PRIVATE || flags & MS_SLAVE)
    + else if (flags & MS_SHARED || flags & MS_UNCLONE ||
    + flags & MS_PRIVATE || flags & MS_SLAVE)
    retval = do_change_type(&nd, flags);
    else if (flags & MS_MOVE)
    retval = do_move_mount(&nd, dev_name);
    Index: 2.6.12.work2/include/linux/fs.h
    ===================================================================
    --- 2.6.12.work2.orig/include/linux/fs.h
    +++ 2.6.12.work2/include/linux/fs.h
    @@ -102,6 +102,7 @@ extern int dir_notify_enable;
    #define MS_MOVE 8192
    #define MS_REC 16384
    #define MS_VERBOSE 32768
    +#define MS_UNCLONE (1<<17) /* recursively change to unclonnable */
    #define MS_PRIVATE (1<<18) /* recursively change to private */
    #define MS_SLAVE (1<<19) /* recursively change to slave */
    #define MS_SHARED (1<<20) /* recursively change to shared */
    Index: 2.6.12.work2/include/linux/mount.h
    ===================================================================
    --- 2.6.12.work2.orig/include/linux/mount.h
    +++ 2.6.12.work2/include/linux/mount.h
    @@ -22,15 +22,18 @@
    #define MNT_PRIVATE 0x10 /* if the vfsmount is private, by default it is private*/
    #define MNT_SLAVE 0x20 /* if the vfsmount is a slave mount of its pnode */
    #define MNT_SHARED 0x40 /* if the vfsmount is a slave mount of its pnode */
    +#define MNT_UNCLONE 0x80 /* if the vfsmount is unclonable */
    #define MNT_PNODE_MASK 0xf0 /* propogation flag mask */

    #define IS_MNT_SHARED(mnt) (mnt->mnt_flags & MNT_SHARED)
    #define IS_MNT_SLAVE(mnt) (mnt->mnt_flags & MNT_SLAVE)
    #define IS_MNT_PRIVATE(mnt) (mnt->mnt_flags & MNT_PRIVATE)
    +#define IS_MNT_UNCLONE(mnt) (mnt->mnt_flags & MNT_UNCLONE)

    #define CLEAR_MNT_SHARED(mnt) (mnt->mnt_flags &= ~(MNT_PNODE_MASK & MNT_SHARED))
    #define CLEAR_MNT_PRIVATE(mnt) (mnt->mnt_flags &= ~(MNT_PNODE_MASK & MNT_PRIVATE))
    #define CLEAR_MNT_SLAVE(mnt) (mnt->mnt_flags &= ~(MNT_PNODE_MASK & MNT_SLAVE))
    +#define CLEAR_MNT_UNCLONE(mnt) (mnt->mnt_flags &= ~(MNT_PNODE_MASK & MNT_UNCLONE))

    struct vfsmount
    {
    @@ -59,6 +62,7 @@ static inline void set_mnt_shared(struct
    mnt->mnt_flags |= MNT_PNODE_MASK & MNT_SHARED;
    CLEAR_MNT_PRIVATE(mnt);
    CLEAR_MNT_SLAVE(mnt);
    + CLEAR_MNT_UNCLONE(mnt);
    }

    static inline void set_mnt_private(struct vfsmount *mnt)
    @@ -66,6 +70,16 @@ static inline void set_mnt_private(struc
    mnt->mnt_flags |= MNT_PNODE_MASK & MNT_PRIVATE;
    CLEAR_MNT_SLAVE(mnt);
    CLEAR_MNT_SHARED(mnt);
    + CLEAR_MNT_UNCLONE(mnt);
    + mnt->mnt_pnode = NULL;
    +}
    +
    +static inline void set_mnt_unclone(struct vfsmount *mnt)
    +{
    + mnt->mnt_flags |= MNT_PNODE_MASK & MNT_UNCLONE;
    + CLEAR_MNT_SLAVE(mnt);
    + CLEAR_MNT_SHARED(mnt);
    + CLEAR_MNT_PRIVATE(mnt);
    mnt->mnt_pnode = NULL;
    }

    @@ -74,6 +88,7 @@ static inline void set_mnt_slave(struct
    mnt->mnt_flags |= MNT_PNODE_MASK & MNT_SLAVE;
    CLEAR_MNT_PRIVATE(mnt);
    CLEAR_MNT_SHARED(mnt);
    + CLEAR_MNT_UNCLONE(mnt);
    }

    static inline struct vfsmount *mntget(struct vfsmount *mnt)
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/
    \
     
     \ /
      Last update: 2005-07-26 01:25    [W:0.026 / U:1.608 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site