Message ID | 20181213211656.14765-1-fdmanana@kernel.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Btrfs: setup a nofs context for memory allocation at __btrfs_set_acl | expand |
On 13.12.18 г. 23:16 ч., fdmanana@kernel.org wrote: > From: Filipe Manana <fdmanana@suse.com> > > We are holding a transaction handle when setting an acl, therefore we can > not allocate the xattr value buffer using GFP_KERNEL, as we could deadlock > if reclaim is triggered by the allocation, therefore setup a nofs context. > > Fixes: 39a27ec1004e8 ("btrfs: use GFP_KERNEL for xattr and acl allocations") > Signed-off-by: Filipe Manana <fdmanana@suse.com> Reviewed-by: Nikolay Borisov <nborisov@suse.com> > --- > fs/btrfs/acl.c | 9 +++++++++ > 1 file changed, 9 insertions(+) > > diff --git a/fs/btrfs/acl.c b/fs/btrfs/acl.c > index 3b66c957ea6f..5810463dc6d2 100644 > --- a/fs/btrfs/acl.c > +++ b/fs/btrfs/acl.c > @@ -9,6 +9,7 @@ > #include <linux/posix_acl_xattr.h> > #include <linux/posix_acl.h> > #include <linux/sched.h> > +#include <linux/sched/mm.h> > #include <linux/slab.h> > > #include "ctree.h" > @@ -72,8 +73,16 @@ static int __btrfs_set_acl(struct btrfs_trans_handle *trans, > } > > if (acl) { > + unsigned int nofs_flag; > + > size = posix_acl_xattr_size(acl->a_count); > + /* > + * We're holding a transaction handle, so use a NOFS memory > + * allocation context to avoid deadlock if reclaim happens. > + */ > + nofs_flag = memalloc_nofs_save(); > value = kmalloc(size, GFP_KERNEL); > + memalloc_nofs_restore(nofs_flag); > if (!value) { > ret = -ENOMEM; > goto out; >
On Thu, Dec 13, 2018 at 09:16:56PM +0000, fdmanana@kernel.org wrote: > From: Filipe Manana <fdmanana@suse.com> > > We are holding a transaction handle when setting an acl, therefore we can > not allocate the xattr value buffer using GFP_KERNEL, as we could deadlock > if reclaim is triggered by the allocation, therefore setup a nofs context. > > Fixes: 39a27ec1004e8 ("btrfs: use GFP_KERNEL for xattr and acl allocations") > Signed-off-by: Filipe Manana <fdmanana@suse.com> Added to misc-next, thanks.
diff --git a/fs/btrfs/acl.c b/fs/btrfs/acl.c index 3b66c957ea6f..5810463dc6d2 100644 --- a/fs/btrfs/acl.c +++ b/fs/btrfs/acl.c @@ -9,6 +9,7 @@ #include <linux/posix_acl_xattr.h> #include <linux/posix_acl.h> #include <linux/sched.h> +#include <linux/sched/mm.h> #include <linux/slab.h> #include "ctree.h" @@ -72,8 +73,16 @@ static int __btrfs_set_acl(struct btrfs_trans_handle *trans, } if (acl) { + unsigned int nofs_flag; + size = posix_acl_xattr_size(acl->a_count); + /* + * We're holding a transaction handle, so use a NOFS memory + * allocation context to avoid deadlock if reclaim happens. + */ + nofs_flag = memalloc_nofs_save(); value = kmalloc(size, GFP_KERNEL); + memalloc_nofs_restore(nofs_flag); if (!value) { ret = -ENOMEM; goto out;