diff --git a/kmod/src/inode.c b/kmod/src/inode.c index 0149602a..414be4a5 100644 --- a/kmod/src/inode.c +++ b/kmod/src/inode.c @@ -247,7 +247,7 @@ static void load_inode(struct inode *inode, struct scoutfs_inode *cinode) struct scoutfs_inode_info *si = SCOUTFS_I(inode); i_size_write(inode, le64_to_cpu(cinode->size)); - inode->i_version = le64_to_cpu(cinode->version); + inode_set_iversion_queried(inode, le64_to_cpu(cinode->version)); set_nlink(inode, le32_to_cpu(cinode->nlink)); i_uid_write(inode, le32_to_cpu(cinode->uid)); i_gid_write(inode, le32_to_cpu(cinode->gid)); @@ -750,7 +750,7 @@ struct inode *scoutfs_iget(struct super_block *sb, u64 ino, int lkf, int igf) /* XXX ensure refresh, instead clear in drop_inode? */ si = SCOUTFS_I(inode); atomic64_set(&si->last_refreshed, 0); - inode->i_version = 0; + inode_set_iversion_queried(inode, 0); } ret = scoutfs_inode_refresh(inode, lock); @@ -798,7 +798,7 @@ static void store_inode(struct scoutfs_inode *cinode, struct inode *inode) scoutfs_inode_get_onoff(inode, &online_blocks, &offline_blocks); cinode->size = cpu_to_le64(i_size_read(inode)); - cinode->version = cpu_to_le64(inode->i_version); + cinode->version = cpu_to_le64(inode_peek_iversion(inode)); cinode->nlink = cpu_to_le32(inode->i_nlink); cinode->uid = cpu_to_le32(i_uid_read(inode)); cinode->gid = cpu_to_le32(i_gid_read(inode)); diff --git a/kmod/src/kernelcompat.h b/kmod/src/kernelcompat.h index 0a1b8d56..8b9a1c3b 100644 --- a/kmod/src/kernelcompat.h +++ b/kmod/src/kernelcompat.h @@ -13,6 +13,20 @@ */ #ifdef KC_NEED_LINUX_IVERSION_H #include +#else +/* + * Kernels before above version will need to fall back to + * manipulating inode->i_version as previous with degraded + * methods. + */ +#define inode_set_iversion_queried(inode, val) \ +do { \ + (inode)->i_version = val; \ +} while (0) +#define inode_peek_iversion(inode) \ +({ \ + (inode)->i_version; \ +}) #endif #ifndef KC_ITERATE_DIR_CONTEXT