diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2019-10-01 18:51:10 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2019-10-02 11:08:24 -0400 |
commit | 2d84b5c5c97e23e809b4663bb58a0d82bf2bc482 (patch) | |
tree | 640fb9ad01cbfc7e7f9aa72f5f559ada91706d53 | |
parent | 645a91c3c1dad23f21abc0fcf71248aa6dc8f004 (diff) |
bcachefs: Fix __bch2_buffered_write() returning -ENOMEM
When grab_cache_page_write_begin() fails but we did pin some pages, we
shouldn't return -ENOMEM, we should do a partial write.
Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
-rw-r--r-- | fs/bcachefs/fs-io.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/fs/bcachefs/fs-io.c b/fs/bcachefs/fs-io.c index de7c43c38591..4017c7ee134b 100644 --- a/fs/bcachefs/fs-io.c +++ b/fs/bcachefs/fs-io.c @@ -1663,8 +1663,13 @@ static int __bch2_buffered_write(struct bch_inode_info *inode, pages[i] = grab_cache_page_write_begin(mapping, index + i, 0); if (!pages[i]) { nr_pages = i; - ret = -ENOMEM; - goto out; + if (!i) { + ret = -ENOMEM; + goto out; + } + len = min_t(unsigned, len, + nr_pages * PAGE_SIZE - offset); + break; } } |