lkml.org 
[lkml]   [2012]   [Apr]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[ 36/42] nfsd: fix compose_entry_fh() failure exits
    3.0-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Al Viro <viro@zeniv.linux.org.uk>

    commit efe39651f08813180f37dc508d950fc7d92b29a8 upstream.

    Restore the original logics ("fail on mountpoints, negatives and in
    case of fh_compose() failures"). Since commit 8177e (nfsd: clean up
    readdirplus encoding) that got broken -
    rv = fh_compose(fhp, exp, dchild, &cd->fh);
    if (rv)
    goto out;
    if (!dchild->d_inode)
    goto out;
    rv = 0;
    out:
    is equivalent to
    rv = fh_compose(fhp, exp, dchild, &cd->fh);
    out:
    and the second check has no effect whatsoever...

    Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
    Cc: "J. Bruce Fields" <bfields@fieldses.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    fs/nfsd/nfs3xdr.c | 22 ++++++++--------------
    1 file changed, 8 insertions(+), 14 deletions(-)

    --- a/fs/nfsd/nfs3xdr.c
    +++ b/fs/nfsd/nfs3xdr.c
    @@ -803,13 +803,13 @@ encode_entry_baggage(struct nfsd3_readdi
    return p;
    }

    -static int
    +static __be32
    compose_entry_fh(struct nfsd3_readdirres *cd, struct svc_fh *fhp,
    const char *name, int namlen)
    {
    struct svc_export *exp;
    struct dentry *dparent, *dchild;
    - int rv = 0;
    + __be32 rv = nfserr_noent;

    dparent = cd->fh.fh_dentry;
    exp = cd->fh.fh_export;
    @@ -817,26 +817,20 @@ compose_entry_fh(struct nfsd3_readdirres
    if (isdotent(name, namlen)) {
    if (namlen == 2) {
    dchild = dget_parent(dparent);
    - if (dchild == dparent) {
    - /* filesystem root - cannot return filehandle for ".." */
    - dput(dchild);
    - return -ENOENT;
    - }
    + /* filesystem root - cannot return filehandle for ".." */
    + if (dchild == dparent)
    + goto out;
    } else
    dchild = dget(dparent);
    } else
    dchild = lookup_one_len(name, dparent, namlen);
    if (IS_ERR(dchild))
    - return -ENOENT;
    - rv = -ENOENT;
    + return rv;
    if (d_mountpoint(dchild))
    goto out;
    - rv = fh_compose(fhp, exp, dchild, &cd->fh);
    - if (rv)
    - goto out;
    if (!dchild->d_inode)
    goto out;
    - rv = 0;
    + rv = fh_compose(fhp, exp, dchild, &cd->fh);
    out:
    dput(dchild);
    return rv;
    @@ -845,7 +839,7 @@ out:
    static __be32 *encode_entryplus_baggage(struct nfsd3_readdirres *cd, __be32 *p, const char *name, int namlen)
    {
    struct svc_fh fh;
    - int err;
    + __be32 err;

    fh_init(&fh, NFS3_FHSIZE);
    err = compose_entry_fh(cd, &fh, name, namlen);



    \
     
     \ /
      Last update: 2012-04-25 00:45    [W:5.506 / U:0.120 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site