lkml.org 
[lkml]   [2015]   [Sep]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.1 054/159] nfsd: Fix an FS_LAYOUT_TYPES/LAYOUT_TYPES encode bug
    Date
    4.1-stable review patch.  If anyone has any objections, please let me know.

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

    From: Kinglong Mee <kinglongmee@gmail.com>

    commit 6896f15aabde505b35888039af93d1d182a0108a upstream.

    Currently we'll respond correctly to a request for either
    FS_LAYOUT_TYPES or LAYOUT_TYPES, but not to a request for both
    attributes simultaneously.

    Signed-off-by: Kinglong Mee <kinglongmee@gmail.com>
    Reviewed-by: Christoph Hellwig <hch@lst.de>
    Signed-off-by: J. Bruce Fields <bfields@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    fs/nfsd/nfs4xdr.c | 45 +++++++++++++++++++++++++++++++--------------
    1 file changed, 31 insertions(+), 14 deletions(-)

    --- a/fs/nfsd/nfs4xdr.c
    +++ b/fs/nfsd/nfs4xdr.c
    @@ -2139,6 +2139,27 @@ nfsd4_encode_aclname(struct xdr_stream *
    return nfsd4_encode_user(xdr, rqstp, ace->who_uid);
    }

    +static inline __be32
    +nfsd4_encode_layout_type(struct xdr_stream *xdr, enum pnfs_layouttype layout_type)
    +{
    + __be32 *p;
    +
    + if (layout_type) {
    + p = xdr_reserve_space(xdr, 8);
    + if (!p)
    + return nfserr_resource;
    + *p++ = cpu_to_be32(1);
    + *p++ = cpu_to_be32(layout_type);
    + } else {
    + p = xdr_reserve_space(xdr, 4);
    + if (!p)
    + return nfserr_resource;
    + *p++ = cpu_to_be32(0);
    + }
    +
    + return 0;
    +}
    +
    #define WORD0_ABSENT_FS_ATTRS (FATTR4_WORD0_FS_LOCATIONS | FATTR4_WORD0_FSID | \
    FATTR4_WORD0_RDATTR_ERROR)
    #define WORD1_ABSENT_FS_ATTRS FATTR4_WORD1_MOUNTED_ON_FILEID
    @@ -2692,20 +2713,16 @@ out_acl:
    p = xdr_encode_hyper(p, stat.ino);
    }
    #ifdef CONFIG_NFSD_PNFS
    - if ((bmval1 & FATTR4_WORD1_FS_LAYOUT_TYPES) ||
    - (bmval2 & FATTR4_WORD2_LAYOUT_TYPES)) {
    - if (exp->ex_layout_type) {
    - p = xdr_reserve_space(xdr, 8);
    - if (!p)
    - goto out_resource;
    - *p++ = cpu_to_be32(1);
    - *p++ = cpu_to_be32(exp->ex_layout_type);
    - } else {
    - p = xdr_reserve_space(xdr, 4);
    - if (!p)
    - goto out_resource;
    - *p++ = cpu_to_be32(0);
    - }
    + if (bmval1 & FATTR4_WORD1_FS_LAYOUT_TYPES) {
    + status = nfsd4_encode_layout_type(xdr, exp->ex_layout_type);
    + if (status)
    + goto out;
    + }
    +
    + if (bmval2 & FATTR4_WORD2_LAYOUT_TYPES) {
    + status = nfsd4_encode_layout_type(xdr, exp->ex_layout_type);
    + if (status)
    + goto out;
    }

    if (bmval2 & FATTR4_WORD2_LAYOUT_BLKSIZE) {



    \
     
     \ /
      Last update: 2015-09-26 23:41    [W:4.042 / U:0.000 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site