Whamcloud - gitweb
Branch b1_8
[fs/lustre-release.git] / ldiskfs / kernel_patches / patches / ext4-inode-version-rhel5.patch
1 Index: linux-2.6.18-128.1.6/fs/ext4/inode.c
2 ===================================================================
3 --- linux-2.6.18-128.1.6.orig/fs/ext4/inode.c
4 +++ linux-2.6.18-128.1.6/fs/ext4/inode.c
5 @@ -2850,11 +2850,11 @@ struct inode *ext4_iget(struct super_blo
6         EXT4_INODE_GET_XTIME(i_atime, inode, raw_inode);
7         EXT4_EINODE_GET_XTIME(i_crtime, ei, raw_inode);
8  
9 -       inode->i_version = le32_to_cpu(raw_inode->i_disk_version);
10 +       ei->i_fs_version = le32_to_cpu(raw_inode->i_disk_version);
11         if (EXT4_INODE_SIZE(inode->i_sb) > EXT4_GOOD_OLD_INODE_SIZE) {
12                 if (EXT4_FITS_IN_INODE(raw_inode, ei, i_version_hi))
13 -                       inode->i_version |=
14 -                       (__u64)(le32_to_cpu(raw_inode->i_version_hi)) << 32;
15 +                       ei->i_fs_version |= (__u64)(le32_to_cpu(raw_inode->i_version_hi))
16 +                                                                        << 32;
17         }
18  
19         if (S_ISREG(inode->i_mode)) {
20 @@ -3043,16 +3043,11 @@ static int ext4_do_update_inode(handle_t
21         } else for (block = 0; block < EXT4_N_BLOCKS; block++)
22                 raw_inode->i_block[block] = ei->i_data[block];
23  
24 -       raw_inode->i_disk_version = cpu_to_le32(inode->i_version);
25 +       raw_inode->i_disk_version = cpu_to_le32(ei->i_fs_version);
26         if (ei->i_extra_isize) {
27                 if (EXT4_FITS_IN_INODE(raw_inode, ei, i_version_hi))
28 -                       /* in RHEL5 i_version is an unsigned long */
29 -#if BITS_PER_LONG == 64
30 -                       raw_inode->i_version_hi =
31 -                       cpu_to_le32(inode->i_version >> 32);
32 -#else
33 -                       raw_inode->i_version_hi = 0;
34 -#endif
35 +                       raw_inode->i_version_hi = cpu_to_le32(ei->i_fs_version
36 +                                                             >> 32);
37                 raw_inode->i_extra_isize = cpu_to_le16(ei->i_extra_isize);
38         }
39  
40 Index: linux-2.6.18-128.1.6/fs/ext4/ext4_i.h
41 ===================================================================
42 --- linux-2.6.18-128.1.6.orig/fs/ext4/ext4_i.h
43 +++ linux-2.6.18-128.1.6/fs/ext4/ext4_i.h
44 @@ -21,6 +21,8 @@
45  #include <linux/seqlock.h>
46  #include <linux/mutex.h>
47  
48 +#define HAVE_DISK_INODE_VERSION
49 +
50  /* data type for block offset of block group */
51  typedef int ext4_grpblk_t;
52  
53 @@ -164,6 +166,8 @@ struct ext4_inode_info {
54         spinlock_t i_prealloc_lock;
55  
56         void *i_filterdata;
57 +
58 +       __u64 i_fs_version;
59  };
60  
61  #endif /* _EXT4_I */
62 Index: linux-2.6.18-128.1.6/fs/ext4/xattr.c
63 ===================================================================
64 --- linux-2.6.18-128.1.6.orig/fs/ext4/xattr.c
65 +++ linux-2.6.18-128.1.6/fs/ext4/xattr.c
66 @@ -959,13 +959,18 @@ ext4_xattr_set_handle(handle_t *handle, 
67         struct ext4_xattr_block_find bs = {
68                 .s = { .not_found = -ENODATA, },
69         };
70 +       unsigned long no_expand;
71         int error;
72  
73         if (!name)
74                 return -EINVAL;
75         if (strlen(name) > 255)
76                 return -ERANGE;
77 +
78         down_write(&EXT4_I(inode)->xattr_sem);
79 +       no_expand = EXT4_I(inode)->i_state & EXT4_STATE_NO_EXPAND;
80 +       EXT4_I(inode)->i_state |= EXT4_STATE_NO_EXPAND;
81 +
82         error = ext4_get_inode_loc(inode, &is.iloc);
83         if (error)
84                 goto cleanup;
85 @@ -1042,6 +1047,8 @@ ext4_xattr_set_handle(handle_t *handle, 
86  cleanup:
87         brelse(is.iloc.bh);
88         brelse(bs.bh);
89 +       if (no_expand == 0)
90 +               EXT4_I(inode)->i_state &= ~EXT4_STATE_NO_EXPAND;
91         up_write(&EXT4_I(inode)->xattr_sem);
92         return error;
93  }
94 Index: linux-2.6.18-128.1.6/fs/ext4/ialloc.c
95 ===================================================================
96 --- linux-2.6.18-128.1.6.orig/fs/ext4/ialloc.c
97 +++ linux-2.6.18-128.1.6/fs/ext4/ialloc.c
98 @@ -878,6 +878,7 @@ got:
99         ei->i_dtime = 0;
100         ei->i_block_alloc_info = NULL;
101         ei->i_block_group = group;
102 +       ei->i_fs_version = 0;
103  
104         ext4_set_inode_flags(inode);
105         if (IS_DIRSYNC(inode))