Index: linux-2.6.18-128.1.6/fs/ext4/inode.c =================================================================== --- linux-2.6.18-128.1.6.orig/fs/ext4/inode.c +++ linux-2.6.18-128.1.6/fs/ext4/inode.c @@ -2850,11 +2850,11 @@ struct inode *ext4_iget(struct super_blo EXT4_INODE_GET_XTIME(i_atime, inode, raw_inode); EXT4_EINODE_GET_XTIME(i_crtime, ei, raw_inode); - inode->i_version = le32_to_cpu(raw_inode->i_disk_version); + ei->i_fs_version = le32_to_cpu(raw_inode->i_disk_version); if (EXT4_INODE_SIZE(inode->i_sb) > EXT4_GOOD_OLD_INODE_SIZE) { if (EXT4_FITS_IN_INODE(raw_inode, ei, i_version_hi)) - inode->i_version |= - (__u64)(le32_to_cpu(raw_inode->i_version_hi)) << 32; + ei->i_fs_version |= (__u64)(le32_to_cpu(raw_inode->i_version_hi)) + << 32; } if (S_ISREG(inode->i_mode)) { @@ -3043,16 +3043,11 @@ static int ext4_do_update_inode(handle_t } else for (block = 0; block < EXT4_N_BLOCKS; block++) raw_inode->i_block[block] = ei->i_data[block]; - raw_inode->i_disk_version = cpu_to_le32(inode->i_version); + raw_inode->i_disk_version = cpu_to_le32(ei->i_fs_version); if (ei->i_extra_isize) { if (EXT4_FITS_IN_INODE(raw_inode, ei, i_version_hi)) - /* in RHEL5 i_version is an unsigned long */ -#if BITS_PER_LONG == 64 - raw_inode->i_version_hi = - cpu_to_le32(inode->i_version >> 32); -#else - raw_inode->i_version_hi = 0; -#endif + raw_inode->i_version_hi = cpu_to_le32(ei->i_fs_version + >> 32); raw_inode->i_extra_isize = cpu_to_le16(ei->i_extra_isize); } Index: linux-2.6.18-128.1.6/fs/ext4/ext4_i.h =================================================================== --- linux-2.6.18-128.1.6.orig/fs/ext4/ext4_i.h +++ linux-2.6.18-128.1.6/fs/ext4/ext4_i.h @@ -21,6 +21,8 @@ #include #include +#define HAVE_DISK_INODE_VERSION + /* data type for block offset of block group */ typedef int ext4_grpblk_t; @@ -164,6 +166,8 @@ struct ext4_inode_info { spinlock_t i_prealloc_lock; void *i_filterdata; + + __u64 i_fs_version; }; #endif /* _EXT4_I */ Index: linux-2.6.18-128.1.6/fs/ext4/xattr.c =================================================================== --- linux-2.6.18-128.1.6.orig/fs/ext4/xattr.c +++ linux-2.6.18-128.1.6/fs/ext4/xattr.c @@ -959,13 +959,18 @@ ext4_xattr_set_handle(handle_t *handle, struct ext4_xattr_block_find bs = { .s = { .not_found = -ENODATA, }, }; + unsigned long no_expand; int error; if (!name) return -EINVAL; if (strlen(name) > 255) return -ERANGE; + down_write(&EXT4_I(inode)->xattr_sem); + no_expand = EXT4_I(inode)->i_state & EXT4_STATE_NO_EXPAND; + EXT4_I(inode)->i_state |= EXT4_STATE_NO_EXPAND; + error = ext4_get_inode_loc(inode, &is.iloc); if (error) goto cleanup; @@ -1042,6 +1047,8 @@ ext4_xattr_set_handle(handle_t *handle, cleanup: brelse(is.iloc.bh); brelse(bs.bh); + if (no_expand == 0) + EXT4_I(inode)->i_state &= ~EXT4_STATE_NO_EXPAND; up_write(&EXT4_I(inode)->xattr_sem); return error; } Index: linux-2.6.18-128.1.6/fs/ext4/ialloc.c =================================================================== --- linux-2.6.18-128.1.6.orig/fs/ext4/ialloc.c +++ linux-2.6.18-128.1.6/fs/ext4/ialloc.c @@ -878,6 +878,7 @@ got: ei->i_dtime = 0; ei->i_block_alloc_info = NULL; ei->i_block_group = group; + ei->i_fs_version = 0; ext4_set_inode_flags(inode); if (IS_DIRSYNC(inode))