summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaeMyung Kang <charsyam@gmail.com>2026-05-01 02:20:54 +0900
committerNamjae Jeon <linkinjeon@kernel.org>2026-05-08 23:50:47 +0900
commit49c12bee2bb2604e82a997521175b85ca5421685 (patch)
tree9d9eedde0f652671564ec3dd2663d5ae517ec015
parent47773fa85e470e9896a22a99ccd5b5930d469680 (diff)
ntfs: redirty folio when ntfs_write_mft_block() runs out of memory
ntfs_write_mft_block() is called by writeback_iter() with the folio locked. When the per-call allocations for @locked_nis or @ref_inos fail, the function returns -ENOMEM directly without unlocking the folio. Any later task that needs the folio's lock then stalls, and the folio's dirty state is silently lost from the writeback iterator's point of view. Use folio_redirty_for_writepage() so the folio remains dirty for a subsequent writeback pass, unlock it, and only then return -ENOMEM so the caller can propagate the error to fsync()/sync_filesystem(). Fixes: f462fdf3d6a4 ("ntfs: reduce stack usage in ntfs_write_mft_block()") Signed-off-by: DaeMyung Kang <charsyam@gmail.com> Reviewed-by: Hyunchul Lee <hyc.lee@gmail.com> Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
-rw-r--r--fs/ntfs/mft.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/fs/ntfs/mft.c b/fs/ntfs/mft.c
index ef423303565d..f5017f337068 100644
--- a/fs/ntfs/mft.c
+++ b/fs/ntfs/mft.c
@@ -2721,8 +2721,11 @@ static int ntfs_write_mft_block(struct folio *folio, struct writeback_control *w
ntfs_debug("Entering for inode 0x%llx, attribute type 0x%x, folio index 0x%lx.",
ni->mft_no, ni->type, folio->index);
- if (!locked_nis || !ref_inos)
+ if (!locked_nis || !ref_inos) {
+ folio_redirty_for_writepage(wbc, folio);
+ folio_unlock(folio);
return -ENOMEM;
+ }
/* We have to zero every time due to mmap-at-end-of-file. */
if (folio->index >= (i_size >> folio_shift(folio)))