lkml.org 
[lkml]   [2007]   [Nov]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Subject[PATCH 18/27] r-o-bind-mounts-elevate-write-count-over-calls-to-vfs_rename
    From
    Date


    This also uses the little helper in the NFS code to make an if() a little bit
    less ugly. We introduced the helper at the beginning of the series.

    Signed-off-by: Dave Hansen <haveblue@us.ibm.com>
    Acked-by: Christoph Hellwig <hch@infradead.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    ---

    linux-2.6.git-dave/fs/namei.c | 4 ++++
    linux-2.6.git-dave/fs/nfsd/vfs.c | 15 +++++++++++----
    2 files changed, 15 insertions(+), 4 deletions(-)

    diff -puN fs/namei.c~r-o-bind-mounts-elevate-write-count-over-calls-to-vfs_rename fs/namei.c
    --- linux-2.6.git/fs/namei.c~r-o-bind-mounts-elevate-write-count-over-calls-to-vfs_rename 2007-11-01 14:46:16.000000000 -0700
    +++ linux-2.6.git-dave/fs/namei.c 2007-11-01 14:46:16.000000000 -0700
    @@ -2734,8 +2734,12 @@ static int do_rename(int olddfd, const c
    if (new_dentry == trap)
    goto exit5;

    + error = mnt_want_write(oldnd.mnt);
    + if (error)
    + goto exit5;
    error = vfs_rename(old_dir->d_inode, old_dentry,
    new_dir->d_inode, new_dentry);
    + mnt_drop_write(oldnd.mnt);
    exit5:
    dput(new_dentry);
    exit4:
    diff -puN fs/nfsd/vfs.c~r-o-bind-mounts-elevate-write-count-over-calls-to-vfs_rename fs/nfsd/vfs.c
    --- linux-2.6.git/fs/nfsd/vfs.c~r-o-bind-mounts-elevate-write-count-over-calls-to-vfs_rename 2007-11-01 14:46:16.000000000 -0700
    +++ linux-2.6.git-dave/fs/nfsd/vfs.c 2007-11-01 14:46:16.000000000 -0700
    @@ -1668,13 +1668,20 @@ nfsd_rename(struct svc_rqst *rqstp, stru
    if (ndentry == trap)
    goto out_dput_new;

    -#ifdef MSNFS
    - if ((ffhp->fh_export->ex_flags & NFSEXP_MSNFS) &&
    + if (svc_msnfs(ffhp) &&
    ((atomic_read(&odentry->d_count) > 1)
    || (atomic_read(&ndentry->d_count) > 1))) {
    host_err = -EPERM;
    - } else
    -#endif
    + goto out_dput_new;
    + }
    +
    + host_err = -EXDEV;
    + if (ffhp->fh_export->ex_mnt != tfhp->fh_export->ex_mnt)
    + goto out_dput_new;
    + host_err = mnt_want_write(ffhp->fh_export->ex_mnt);
    + if (host_err)
    + goto out_dput_new;
    +
    host_err = vfs_rename(fdir, odentry, tdir, ndentry);
    if (!host_err && EX_ISSYNC(tfhp->fh_export)) {
    host_err = nfsd_sync_dir(tdentry);
    _
    -
    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: 2007-11-02 00:19    [W:0.021 / U:3.968 seconds]
    ©2003-2017 Jasper Spaans. hosted at Digital OceanAdvertise on this site