lkml.org 
[lkml]   [2019]   [Mar]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.0 091/238] Btrfs: setup a nofs context for memory allocation at btrfs_create_tree()
    Date
    5.0-stable review patch.  If anyone has any objections, please let me know.

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

    From: Filipe Manana <fdmanana@suse.com>

    commit b89f6d1fcb30a8cbdc18ce00c7d93792076af453 upstream.

    We are holding a transaction handle when creating a tree, therefore we can
    not allocate the root using GFP_KERNEL, as we could deadlock if reclaim is
    triggered by the allocation, therefore setup a nofs context.

    Fixes: 74e4d82757f74 ("btrfs: let callers of btrfs_alloc_root pass gfp flags")
    CC: stable@vger.kernel.org # 4.9+
    Reviewed-by: Nikolay Borisov <nborisov@suse.com>
    Signed-off-by: Filipe Manana <fdmanana@suse.com>
    Reviewed-by: David Sterba <dsterba@suse.com>
    Signed-off-by: David Sterba <dsterba@suse.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    fs/btrfs/disk-io.c | 8 ++++++++
    1 file changed, 8 insertions(+)

    --- a/fs/btrfs/disk-io.c
    +++ b/fs/btrfs/disk-io.c
    @@ -17,6 +17,7 @@
    #include <linux/semaphore.h>
    #include <linux/error-injection.h>
    #include <linux/crc32c.h>
    +#include <linux/sched/mm.h>
    #include <asm/unaligned.h>
    #include "ctree.h"
    #include "disk-io.h"
    @@ -1258,10 +1259,17 @@ struct btrfs_root *btrfs_create_tree(str
    struct btrfs_root *tree_root = fs_info->tree_root;
    struct btrfs_root *root;
    struct btrfs_key key;
    + unsigned int nofs_flag;
    int ret = 0;
    uuid_le uuid = NULL_UUID_LE;

    + /*
    + * We're holding a transaction handle, so use a NOFS memory allocation
    + * context to avoid deadlock if reclaim happens.
    + */
    + nofs_flag = memalloc_nofs_save();
    root = btrfs_alloc_root(fs_info, GFP_KERNEL);
    + memalloc_nofs_restore(nofs_flag);
    if (!root)
    return ERR_PTR(-ENOMEM);


    \
     
     \ /
      Last update: 2019-03-22 13:32    [W:5.347 / U:0.044 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site