btrfs: avoid blocking when allocating context for nowait dio read/write
When doing a NOWAIT direct IO read/write, we allocate a context object (struct btrfs_dio_data) with GFP_NOFS, which can result in blocking waiting for memory allocation (GFP_NOFS is __GFP_RECLAIM | __GFP_IO). This is undesirable for the NOWAIT semantics, so do the allocation with GFP_NOWAIT if we are serving a NOWAIT request and if the allocation fails return -EAGAIN, so that the caller can fallback to a blocking context and retry with a non-blocking write. Signed-off-by: Filipe Manana <fdmanana@suse.com> Reviewed-by: David Sterba <dsterba@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
59d35c5171
commit
4f208dcc6b
|
@ -7588,9 +7588,15 @@ static int btrfs_dio_iomap_begin(struct inode *inode, loff_t start,
|
|||
}
|
||||
}
|
||||
|
||||
dio_data = kzalloc(sizeof(*dio_data), GFP_NOFS);
|
||||
if (!dio_data)
|
||||
return -ENOMEM;
|
||||
if (flags & IOMAP_NOWAIT) {
|
||||
dio_data = kzalloc(sizeof(*dio_data), GFP_NOWAIT);
|
||||
if (!dio_data)
|
||||
return -EAGAIN;
|
||||
} else {
|
||||
dio_data = kzalloc(sizeof(*dio_data), GFP_NOFS);
|
||||
if (!dio_data)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
iomap->private = dio_data;
|
||||
|
||||
|
|
Loading…
Reference in New Issue