@@ -187,8 +187,23 @@ 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 (new) {
+ v9fs_stat2inode_dotl(st, inode,
+ (v9ses->cache & CACHE_LOOSE) ? V9FS_STAT2INODE_KEEP_ISIZE : 0);
+ }
return inode;
+ }
/*
* initialize the inode with the stat info
* FIXME!! we may need support for stale inodes
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. Note that v9fs_test(_new)?_inode_dotl already makes sure we don't reuse inodes of the wrong type or different qid. Signed-off-by: Tingmao Wang <m@maowtm.org> --- fs/9p/vfs_inode_dotl.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-)