lkml.org 
[lkml]   [2020]   [Jan]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.19 375/639] afs: Fix key leak in afs_release() and afs_evict_inode()
    Date
    From: David Howells <dhowells@redhat.com>

    [ Upstream commit a1b879eefc2b34cd3f17187ef6fc1cf3960e9518 ]

    Fix afs_release() to go through the cleanup part of the function if
    FMODE_WRITE is set rather than exiting through vfs_fsync() (which skips the
    cleanup). The cleanup involves discarding the refs on the key used for
    file ops and the writeback key record.

    Also fix afs_evict_inode() to clean up any left over wb keys attached to
    the inode/vnode when it is removed.

    Fixes: 5a8132761609 ("afs: Do better accretion of small writes on newly created content")
    Signed-off-by: David Howells <dhowells@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    fs/afs/file.c | 7 ++++---
    fs/afs/inode.c | 1 +
    2 files changed, 5 insertions(+), 3 deletions(-)

    diff --git a/fs/afs/file.c b/fs/afs/file.c
    index 843d3b970b845..0bd78df6a64e6 100644
    --- a/fs/afs/file.c
    +++ b/fs/afs/file.c
    @@ -169,11 +169,12 @@ int afs_release(struct inode *inode, struct file *file)
    {
    struct afs_vnode *vnode = AFS_FS_I(inode);
    struct afs_file *af = file->private_data;
    + int ret = 0;

    _enter("{%x:%u},", vnode->fid.vid, vnode->fid.vnode);

    if ((file->f_mode & FMODE_WRITE))
    - return vfs_fsync(file, 0);
    + ret = vfs_fsync(file, 0);

    file->private_data = NULL;
    if (af->wb)
    @@ -181,8 +182,8 @@ int afs_release(struct inode *inode, struct file *file)
    key_put(af->key);
    kfree(af);
    afs_prune_wb_keys(vnode);
    - _leave(" = 0");
    - return 0;
    + _leave(" = %d", ret);
    + return ret;
    }

    /*
    diff --git a/fs/afs/inode.c b/fs/afs/inode.c
    index 0726e40db0f8b..718fab2f151a1 100644
    --- a/fs/afs/inode.c
    +++ b/fs/afs/inode.c
    @@ -541,6 +541,7 @@ void afs_evict_inode(struct inode *inode)
    }
    #endif

    + afs_prune_wb_keys(vnode);
    afs_put_permits(rcu_access_pointer(vnode->permit_cache));
    key_put(vnode->lock_key);
    vnode->lock_key = NULL;
    --
    2.20.1


    \
     
     \ /
      Last update: 2020-01-24 12:22    [W:2.056 / U:0.288 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site