lkml.org 
[lkml]   [2010]   [Aug]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 29/38] union-mount: Implement union-aware link()
    Date

    Signed-off-by: Valerie Aurora <vaurora@redhat.com>
    ---
    fs/namei.c | 24 ++++++++++++++++++++----
    1 files changed, 20 insertions(+), 4 deletions(-)

    diff --git a/fs/namei.c b/fs/namei.c
    index e7b02fa..5b22cc5 100644
    --- a/fs/namei.c
    +++ b/fs/namei.c
    @@ -2942,16 +2942,18 @@ SYSCALL_DEFINE5(linkat, int, olddfd, const char __user *, oldname,
    {
    struct dentry *new_dentry;
    struct nameidata nd;
    + struct nameidata old_nd;
    struct path old_path;
    int error;
    char *to;
    + char *from;

    if ((flags & ~AT_SYMLINK_FOLLOW) != 0)
    return -EINVAL;

    - error = user_path_at(olddfd, oldname,
    + error = user_path_nd(olddfd, oldname,
    flags & AT_SYMLINK_FOLLOW ? LOOKUP_FOLLOW : 0,
    - &old_path);
    + &old_nd, &old_path, &from);
    if (error)
    return error;

    @@ -2959,8 +2961,20 @@ SYSCALL_DEFINE5(linkat, int, olddfd, const char __user *, oldname,
    if (error)
    goto out;
    error = -EXDEV;
    - if (old_path.mnt != nd.path.mnt)
    - goto out_release;
    + if (old_path.mnt != nd.path.mnt) {
    + if (IS_DIR_UNIONED(old_nd.path.dentry) &&
    + (old_nd.path.mnt == nd.path.mnt)) {
    + error = mnt_want_write(old_nd.path.mnt);
    + if (error)
    + goto out_release;
    + error = union_copyup(&old_nd, &old_path);
    + mnt_drop_write(old_nd.path.mnt);
    + if (error)
    + goto out_release;
    + } else {
    + goto out_release;
    + }
    + }
    new_dentry = lookup_create(&nd, 0);
    error = PTR_ERR(new_dentry);
    if (IS_ERR(new_dentry))
    @@ -2983,6 +2997,8 @@ out_release:
    putname(to);
    out:
    path_put(&old_path);
    + path_put(&old_nd.path);
    + putname(from);

    return error;
    }
    --
    1.6.3.3


    \
     
     \ /
      Last update: 2010-08-07 00:39    [W:2.790 / U:0.016 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site