This uses the stat struct we already got as part of lookup process to refresh the inode "for free". Only for uncached mode for now. We will need to revisit this for cached mode once we sort out reusing an old inode with changed qid.version. (Currently this is not done in this series, which would be fine unless server side change happens, which is not supposed to happen in cached mode anyway) Note that v9fs_test_inode_dotl already makes sure we don't reuse inodes of the wrong type or different qid. Signed-off-by: Tingmao Wang <m@xxxxxxxxxx> --- Changes since v1: - Check cache bits instead of using `new` - uncached mode now also have new=0. fs/9p/vfs_inode_dotl.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/fs/9p/vfs_inode_dotl.c b/fs/9p/vfs_inode_dotl.c index 86adaf5bcc0e..d008e82256ac 100644 --- a/fs/9p/vfs_inode_dotl.c +++ b/fs/9p/vfs_inode_dotl.c @@ -164,6 +164,7 @@ static struct inode *v9fs_qid_iget_dotl(struct super_block *sb, .dentry = dentry, .need_double_check = false, }; + bool cached = v9ses->cache & (CACHE_META | CACHE_LOOSE); if (new) test = v9fs_test_new_inode_dotl; @@ -203,8 +204,21 @@ static struct inode *v9fs_qid_iget_dotl(struct super_block *sb, if (!inode) return ERR_PTR(-ENOMEM); - if (!(inode->i_state & I_NEW)) + if (!(inode->i_state & I_NEW)) { + /* + * If we're returning an existing inode, we might as well refresh + * it with the metadata we just got. Refreshing the i_size also + * prevents read errors. + * + * We only do this for uncached mode, since in cached move, any + * change on the inode will bump qid.version, which will result in + * us getting a new inode in the first place. If we got an old + * inode, let's not touch it for now. + */ + if (!cached) + v9fs_stat2inode_dotl(st, inode, 0); return inode; + } /* * initialize the inode with the stat info * FIXME!! we may need support for stale inodes -- 2.51.0