Skip to content

Commit

Permalink
fs/9p: fix uninitialized values during inode evict
Browse files Browse the repository at this point in the history
If an iget fails due to not being able to retrieve information
from the server then the inode structure is only partially
initialized.  When the inode gets evicted, references to
uninitialized structures (like fscache cookies) were being
made.

This patch checks for a bad_inode before doing anything other
than clearing the inode from the cache.  Since the inode is
bad, it shouldn't have any state associated with it that needs
to be written back (and there really isn't a way to complete
those anyways).

Reported-by: [email protected]
Signed-off-by: Eric Van Hensbergen <[email protected]>
  • Loading branch information
ericvh committed Mar 25, 2024
1 parent 10211b4 commit 6630036
Showing 1 changed file with 10 additions and 6 deletions.
16 changes: 10 additions & 6 deletions fs/9p/vfs_inode.c
Original file line number Diff line number Diff line change
Expand Up @@ -344,17 +344,21 @@ void v9fs_evict_inode(struct inode *inode)
struct v9fs_inode __maybe_unused *v9inode = V9FS_I(inode);
__le32 __maybe_unused version;

truncate_inode_pages_final(&inode->i_data);
if (!is_bad_inode(inode)) {
truncate_inode_pages_final(&inode->i_data);

version = cpu_to_le32(v9inode->qid.version);
netfs_clear_inode_writeback(inode, &version);
version = cpu_to_le32(v9inode->qid.version);
netfs_clear_inode_writeback(inode, &version);

clear_inode(inode);
filemap_fdatawrite(&inode->i_data);
clear_inode(inode);
filemap_fdatawrite(&inode->i_data);

#ifdef CONFIG_9P_FSCACHE
fscache_relinquish_cookie(v9fs_inode_cookie(v9inode), false);
if (v9fs_inode_cookie(v9inode))
fscache_relinquish_cookie(v9fs_inode_cookie(v9inode), false);
#endif
} else
clear_inode(inode);
}

struct inode *v9fs_fid_iget(struct super_block *sb, struct p9_fid *fid)
Expand Down

0 comments on commit 6630036

Please sign in to comment.