bcachefs: Fix __bch2_buffered_write() returning -ENOMEM
authorKent Overstreet <kent.overstreet@gmail.com>
Tue, 1 Oct 2019 22:51:10 +0000 (18:51 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:08:28 +0000 (17:08 -0400)
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@linux.dev>
fs/bcachefs/fs-io.c

index 13e7b78423678f8fb6296cd4052f2c2fec57c154..be121b755fc7345cfaf9888a50a4f2fb17db34ec 100644 (file)
@@ -1606,8 +1606,13 @@ static int __bch2_buffered_write(struct bch_inode_info *inode,
                pages[i] = grab_cache_page_write_begin(mapping, index + i);
                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;
                }
        }