Ryusuke Konishi 6576dd6695 nilfs2: fix state management in error path of log writing function
After commit a694291a6211 ("nilfs2: separate wait function from
nilfs_segctor_write") was applied, the log writing function
nilfs_segctor_do_construct() was able to issue I/O requests continuously
even if user data blocks were split into multiple logs across segments,
but two potential flaws were introduced in its error handling.

First, if nilfs_segctor_begin_construction() fails while creating the
second or subsequent logs, the log writing function returns without
calling nilfs_segctor_abort_construction(), so the writeback flag set on
pages/folios will remain uncleared.  This causes page cache operations to
hang waiting for the writeback flag.  For example,
truncate_inode_pages_final(), which is called via nilfs_evict_inode() when
an inode is evicted from memory, will hang.

Second, the NILFS_I_COLLECTED flag set on normal inodes remain uncleared. 
As a result, if the next log write involves checkpoint creation, that's
fine, but if a partial log write is performed that does not, inodes with
NILFS_I_COLLECTED set are erroneously removed from the "sc_dirty_files"
list, and their data and b-tree blocks may not be written to the device,
corrupting the block mapping.

Fix these issues by uniformly calling nilfs_segctor_abort_construction()
on failure of each step in the loop in nilfs_segctor_do_construct(),
having it clean up logs and segment usages according to progress, and
correcting the conditions for calling nilfs_redirty_inodes() to ensure
that the NILFS_I_COLLECTED flag is cleared.

Link: https://lkml.kernel.org/r/20240814101119.4070-1-konishi.ryusuke@gmail.com
Fixes: a694291a6211 ("nilfs2: separate wait function from nilfs_segctor_write")
Signed-off-by: Ryusuke Konishi <konishi.ryusuke@gmail.com>
Tested-by: Ryusuke Konishi <konishi.ryusuke@gmail.com>
Cc: <stable@vger.kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
2024-09-01 17:59:00 -07:00
..
2024-08-13 13:53:09 +02:00
2024-07-18 09:50:08 +02:00
2024-07-15 11:31:32 -07:00
2024-07-15 11:14:59 -07:00
2024-07-15 11:31:32 -07:00
2024-05-13 14:14:05 -07:00
2024-07-15 11:14:59 -07:00
2024-07-17 12:53:47 -07:00
2024-07-23 15:21:19 -07:00
2024-07-15 11:31:32 -07:00
2024-07-09 10:40:03 +02:00
2024-07-15 11:14:59 -07:00
2024-07-15 10:52:51 -07:00
2024-07-27 15:11:59 -07:00
2024-07-15 11:14:59 -07:00
2024-07-15 13:28:14 -07:00
\n
2024-07-17 13:11:42 -07:00
2024-07-23 14:32:21 -07:00
2024-07-15 11:14:59 -07:00
2024-09-01 06:55:47 +12:00
2024-07-22 10:50:18 -07:00
2024-07-18 14:48:11 -07:00
2024-05-28 11:52:53 +02:00
2024-05-28 11:52:49 +02:00
2024-08-21 22:32:58 +02:00
2024-04-23 13:27:43 +02:00
2024-05-28 11:52:45 +02:00
2024-07-15 11:31:32 -07:00
2024-08-29 06:20:44 +12:00
2024-07-23 17:30:42 -07:00
2024-07-15 11:14:59 -07:00
2024-04-25 20:56:20 -07:00
2024-05-10 08:26:31 +02:00
2024-07-15 12:34:01 -07:00
2024-03-11 10:21:06 -07:00
2024-07-15 11:54:04 -07:00
2024-07-24 10:53:13 +02:00
2024-07-18 09:50:08 +02:00
2024-07-15 10:52:51 -07:00
2024-03-12 20:03:34 -07:00
2024-06-20 15:19:17 -06:00
2024-05-02 16:28:20 +02:00
2024-05-24 13:34:07 +02:00
2024-07-15 14:20:22 -07:00
2024-04-10 16:23:02 -06:00