aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorNamjae Jeon <linkinjeon@kernel.org>2026-09-07 13:38:17 +0900
committerNamjae Jeon <linkinjeon@kernel.org>2026-09-13 11:41:54 +0900
commit0c32a42fd96a0e7c06c8a648a6dd8f1ec0bf643b (patch)
tree623772b03b5b289d6124d056c4ebaad31d9f86a2
parentntfs: discard inodes that fail initialization (diff)
ntfs: unhash failed inode reads
Remove a newly allocated inode from the inode hash before discarding it. NTFS may set i_nlink before a later initialization step fails, in which case iput alone can retain the incomplete inode in the cache. Fixes: bf6be898fbc5 ("ntfs: discard inodes that fail initialization") Reviewed-by: Hyunchul Lee <hyc.lee@gmail.com> Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
-rw-r--r--fs/ntfs/inode.c15
1 files changed, 9 insertions, 6 deletions
diff --git a/fs/ntfs/inode.c b/fs/ntfs/inode.c
index b1f9a72ea963..a777de8a80c7 100644
--- a/fs/ntfs/inode.c
+++ b/fs/ntfs/inode.c
@@ -170,9 +170,10 @@ struct inode *ntfs_iget(struct super_block *sb, u64 mft_no)
/* If this is a freshly allocated inode, need to read it now. */
if (inode_state_read_once(vi) & I_NEW) {
err = ntfs_read_locked_inode(vi);
- if (err)
+ if (err) {
+ remove_inode_hash(vi);
discard_new_inode(vi);
- else
+ } else
unlock_new_inode(vi);
}
/*
@@ -232,9 +233,10 @@ struct inode *ntfs_attr_iget(struct inode *base_vi, __le32 type,
/* If this is a freshly allocated inode, need to read it now. */
if (inode_state_read_once(vi) & I_NEW) {
err = ntfs_read_locked_attr_inode(base_vi, vi);
- if (err)
+ if (err) {
+ remove_inode_hash(vi);
discard_new_inode(vi);
- else
+ } else
unlock_new_inode(vi);
}
/*
@@ -288,9 +290,10 @@ struct inode *ntfs_index_iget(struct inode *base_vi, __le16 *name,
/* If this is a freshly allocated inode, need to read it now. */
if (inode_state_read_once(vi) & I_NEW) {
err = ntfs_read_locked_index_inode(base_vi, vi);
- if (err)
+ if (err) {
+ remove_inode_hash(vi);
discard_new_inode(vi);
- else
+ } else
unlock_new_inode(vi);
}
/*