lkml.org 
[lkml]   [2018]   [Oct]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Subject[PATCH 16/24] afs: Fix FS.FetchStatus delivery from updating wrong vnode
    From
    Date
    The FS.FetchStatus reply delivery function was updating inode of the
    directory in which a lookup had been done with the status of the looked up
    file. This corrupts some of the directory state.

    Fixes: 5cf9dd55a0ec ("afs: Prospectively look up extra files when doing a single lookup")
    Signed-off-by: David Howells <dhowells@redhat.com>
    ---

    fs/afs/fsclient.c | 16 +++++-----------
    1 file changed, 5 insertions(+), 11 deletions(-)

    diff --git a/fs/afs/fsclient.c b/fs/afs/fsclient.c
    index 5e3027f21390..f758750e81d8 100644
    --- a/fs/afs/fsclient.c
    +++ b/fs/afs/fsclient.c
    @@ -2026,7 +2026,7 @@ static int afs_deliver_fs_fetch_status(struct afs_call *call)
    struct afs_file_status *status = call->reply[1];
    struct afs_callback *callback = call->reply[2];
    struct afs_volsync *volsync = call->reply[3];
    - struct afs_vnode *vnode = call->reply[0];
    + struct afs_fid *fid = call->reply[0];
    const __be32 *bp;
    int ret;

    @@ -2034,21 +2034,15 @@ static int afs_deliver_fs_fetch_status(struct afs_call *call)
    if (ret < 0)
    return ret;

    - _enter("{%llx:%llu}", vnode->fid.vid, vnode->fid.vnode);
    + _enter("{%llx:%llu}", fid->vid, fid->vnode);

    /* unmarshall the reply once we've received all of it */
    bp = call->buffer;
    - ret = afs_decode_status(call, &bp, status, vnode,
    + ret = afs_decode_status(call, &bp, status, NULL,
    &call->expected_version, NULL);
    if (ret < 0)
    return ret;
    - callback[call->count].version = ntohl(bp[0]);
    - callback[call->count].expiry = ntohl(bp[1]);
    - callback[call->count].type = ntohl(bp[2]);
    - if (vnode)
    - xdr_decode_AFSCallBack(call, vnode, &bp);
    - else
    - bp += 3;
    + xdr_decode_AFSCallBack_raw(&bp, callback);
    if (volsync)
    xdr_decode_AFSVolSync(&bp, volsync);

    @@ -2089,7 +2083,7 @@ int afs_fs_fetch_status(struct afs_fs_cursor *fc,
    }

    call->key = fc->key;
    - call->reply[0] = NULL; /* vnode for fid[0] */
    + call->reply[0] = fid;
    call->reply[1] = status;
    call->reply[2] = callback;
    call->reply[3] = volsync;
    \
     
     \ /
      Last update: 2018-10-20 03:12    [W:4.225 / U:0.024 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site