]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
ntfs: redirty folio when ntfs_write_mft_block() runs out of memory
authorDaeMyung Kang <charsyam@gmail.com>
Thu, 30 Apr 2026 17:20:54 +0000 (02:20 +0900)
committerNamjae Jeon <linkinjeon@kernel.org>
Fri, 8 May 2026 14:50:47 +0000 (23:50 +0900)
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>
fs/ntfs/mft.c

index ef423303565d356974ea894b355ed751a48a5195..f5017f337068a0011d52ca62ecb46793ec75f764 100644 (file)
@@ -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)))