lkml.org 
[lkml]   [2009]   [Oct]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 22/41] union-mount: Some checks during namespace changes
    Date
    From: Jan Blunck <jblunck@suse.de>

    Add some additional checks when mounting something into an union.

    Signed-off-by: Jan Blunck <jblunck@suse.de>
    Signed-off-by: Miklos Szeredi <mszeredi@suse.cz>
    Signed-off-by: Valerie Aurora <vaurora@redhat.com>
    ---
    fs/namespace.c | 34 ++++++++++++++++++++++++++++++++++
    1 files changed, 34 insertions(+), 0 deletions(-)

    diff --git a/fs/namespace.c b/fs/namespace.c
    index 81b3188..dc01385 100644
    --- a/fs/namespace.c
    +++ b/fs/namespace.c
    @@ -29,6 +29,7 @@
    #include <linux/log2.h>
    #include <linux/idr.h>
    #include <linux/fs_struct.h>
    +#include <linux/union.h>
    #include <asm/uaccess.h>
    #include <asm/unistd.h>
    #include "pnode.h"
    @@ -1427,6 +1428,10 @@ static int do_change_type(struct path *path, int flag)
    if (path->dentry != path->mnt->mnt_root)
    return -EINVAL;

    + /* Don't change the type of union mounts */
    + if (IS_MNT_UNION(path->mnt))
    + return -EINVAL;
    +
    down_write(&namespace_sem);
    if (type == MS_SHARED) {
    err = invent_group_ids(mnt, recurse);
    @@ -1478,6 +1483,18 @@ static int do_loopback(struct path *path, char *old_name, int recurse,
    if (!mnt)
    goto out;

    + /*
    + * Unions couldn't be writable if the filesystem doesn't know about
    + * whiteouts
    + */
    + err = -ENOTSUPP;
    + if ((mnt_flags & MNT_UNION) &&
    + !(mnt->mnt_sb->s_flags & (MS_WHITEOUT|MS_RDONLY)))
    + goto out;
    +
    + if (mnt_flags & MNT_UNION)
    + mnt->mnt_flags |= MNT_UNION;
    +
    err = graft_tree(mnt, path);
    if (err) {
    LIST_HEAD(umount_list);
    @@ -1571,6 +1588,13 @@ static int do_move_mount(struct path *path, char *old_name)
    if (err)
    return err;

    + /* moving to or from a union mount is not supported */
    + err = -EINVAL;
    + if (IS_MNT_UNION(path->mnt))
    + goto exit;
    + if (IS_MNT_UNION(old_path.mnt))
    + goto exit;
    +
    down_write(&namespace_sem);
    while (d_mountpoint(path->dentry) &&
    follow_down(path))
    @@ -1628,6 +1652,7 @@ out:
    up_write(&namespace_sem);
    if (!err)
    path_put(&parent_path);
    +exit:
    path_put(&old_path);
    return err;
    }
    @@ -1685,6 +1710,15 @@ int do_add_mount(struct vfsmount *newmnt, struct path *path,
    if (S_ISLNK(newmnt->mnt_root->d_inode->i_mode))
    goto unlock;

    + /*
    + * Unions couldn't be writable if the filesystem doesn't know about
    + * whiteouts
    + */
    + err = -ENOTSUPP;
    + if ((mnt_flags & MNT_UNION) &&
    + !(newmnt->mnt_sb->s_flags & (MS_WHITEOUT|MS_RDONLY)))
    + goto unlock;
    +
    newmnt->mnt_flags = mnt_flags;
    if ((err = graft_tree(newmnt, path)))
    goto unlock;
    --
    1.6.3.3


    \
     
     \ /
      Last update: 2009-10-21 21:45    [W:0.027 / U:31.692 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site