lkml.org 
[lkml]   [2018]   [Sep]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.14 25/89] fs/9p/xattr.c: catch the error of p9_client_clunk when setting xattr failed
    Date
    4.14-stable review patch.  If anyone has any objections, please let me know.

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

    From: piaojun <piaojun@huawei.com>

    commit 3111784bee81591ea2815011688d28b65df03627 upstream.

    In my testing, v9fs_fid_xattr_set will return successfully even if the
    backend ext4 filesystem has no space to store xattr key-value. That will
    cause inconsistent behavior between front end and back end. The reason is
    that lsetxattr will be triggered by p9_client_clunk, and unfortunately we
    did not catch the error. This patch will catch the error to notify upper
    caller.

    p9_client_clunk (in 9p)
    p9_client_rpc(clnt, P9_TCLUNK, "d", fid->fid);
    v9fs_clunk (in qemu)
    put_fid
    free_fid
    v9fs_xattr_fid_clunk
    v9fs_co_lsetxattr
    s->ops->lsetxattr
    ext4_xattr_user_set (in host ext4 filesystem)

    Link: http://lkml.kernel.org/r/5B57EACC.2060900@huawei.com
    Signed-off-by: Jun Piao <piaojun@huawei.com>
    Cc: Eric Van Hensbergen <ericvh@gmail.com>
    Cc: Ron Minnich <rminnich@sandia.gov>
    Cc: Latchesar Ionkov <lucho@ionkov.net>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Cc: stable@vger.kernel.org
    Signed-off-by: Dominique Martinet <dominique.martinet@cea.fr>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    fs/9p/xattr.c | 6 ++++--
    1 file changed, 4 insertions(+), 2 deletions(-)

    --- a/fs/9p/xattr.c
    +++ b/fs/9p/xattr.c
    @@ -105,7 +105,7 @@ int v9fs_fid_xattr_set(struct p9_fid *fi
    {
    struct kvec kvec = {.iov_base = (void *)value, .iov_len = value_len};
    struct iov_iter from;
    - int retval;
    + int retval, err;

    iov_iter_kvec(&from, WRITE | ITER_KVEC, &kvec, 1, value_len);

    @@ -126,7 +126,9 @@ int v9fs_fid_xattr_set(struct p9_fid *fi
    retval);
    else
    p9_client_write(fid, 0, &from, &retval);
    - p9_client_clunk(fid);
    + err = p9_client_clunk(fid);
    + if (!retval && err)
    + retval = err;
    return retval;
    }


    \
     
     \ /
      Last update: 2018-09-07 23:30    [W:4.097 / U:0.284 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site