lkml.org 
[lkml]   [2019]   [May]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Subject[PATCH 01/15] afs: Fix key leak in afs_release() and afs_evict_inode()
    From
    Date
    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>
    ---

    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 e8d6619890a9..eee2b5663b92 100644
    --- a/fs/afs/file.c
    +++ b/fs/afs/file.c
    @@ -170,11 +170,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;

    _enter("{%llx:%llu},", 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)
    @@ -182,8 +183,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 c4652b42d545..f30aa5eacd39 100644
    --- a/fs/afs/inode.c
    +++ b/fs/afs/inode.c
    @@ -573,6 +573,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->silly_key);
    vnode->silly_key = NULL;
    \
     
     \ /
      Last update: 2019-05-15 18:26    [W:2.303 / U:0.232 seconds]
    ©2003-2018 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site