lkml.org 
[lkml]   [2016]   [Jan]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.2.y-ckt 188/268] make sure that freeing shmem fast symlinks is RCU-delayed
    Date
    4.2.8-ckt3 -stable review patch.  If anyone has any objections, please let me know.

    ---8<------------------------------------------------------------

    From: Al Viro <viro@zeniv.linux.org.uk>

    commit 3ed47db34f480df7caf44436e3e63e555351ae9a upstream.

    Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
    Signed-off-by: Kamal Mostafa <kamal@canonical.com>
    ---
    include/linux/shmem_fs.h | 5 +----
    mm/shmem.c | 9 ++++-----
    2 files changed, 5 insertions(+), 9 deletions(-)

    diff --git a/include/linux/shmem_fs.h b/include/linux/shmem_fs.h
    index 50777b5..92d112a 100644
    --- a/include/linux/shmem_fs.h
    +++ b/include/linux/shmem_fs.h
    @@ -15,10 +15,7 @@ struct shmem_inode_info {
    unsigned int seals; /* shmem seals */
    unsigned long flags;
    unsigned long alloced; /* data pages alloced to file */
    - union {
    - unsigned long swapped; /* subtotal assigned to swap */
    - char *symlink; /* unswappable short symlink */
    - };
    + unsigned long swapped; /* subtotal assigned to swap */
    struct shared_policy policy; /* NUMA memory alloc policy */
    struct list_head swaplist; /* chain of maybes on swap */
    struct simple_xattrs xattrs; /* list of xattrs */
    diff --git a/mm/shmem.c b/mm/shmem.c
    index dbe0c1e..b2890af 100644
    --- a/mm/shmem.c
    +++ b/mm/shmem.c
    @@ -597,8 +597,7 @@ static void shmem_evict_inode(struct inode *inode)
    list_del_init(&info->swaplist);
    mutex_unlock(&shmem_swaplist_mutex);
    }
    - } else
    - kfree(info->symlink);
    + }

    simple_xattrs_free(&info->xattrs);
    WARN_ON(inode->i_blocks);
    @@ -2445,13 +2444,12 @@ static int shmem_symlink(struct inode *dir, struct dentry *dentry, const char *s
    info = SHMEM_I(inode);
    inode->i_size = len-1;
    if (len <= SHORT_SYMLINK_LEN) {
    - info->symlink = kmemdup(symname, len, GFP_KERNEL);
    - if (!info->symlink) {
    + inode->i_link = kmemdup(symname, len, GFP_KERNEL);
    + if (!inode->i_link) {
    iput(inode);
    return -ENOMEM;
    }
    inode->i_op = &shmem_short_symlink_operations;
    - inode->i_link = info->symlink;
    } else {
    error = shmem_getpage(inode, 0, &page, SGP_WRITE, NULL);
    if (error) {
    @@ -3066,6 +3064,7 @@ static struct inode *shmem_alloc_inode(struct super_block *sb)
    static void shmem_destroy_callback(struct rcu_head *head)
    {
    struct inode *inode = container_of(head, struct inode, i_rcu);
    + kfree(inode->i_link);
    kmem_cache_free(shmem_inode_cachep, SHMEM_I(inode));
    }

    --
    1.9.1
    \
     
     \ /
      Last update: 2016-01-27 22:41    [W:4.055 / U:0.264 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site