Whamcloud - gitweb
Branch b1_8
[fs/lustre-release.git] / ldiskfs / kernel_patches / patches / ext4-extents-mount-option-rhel5.patch
1 diff -up linux-2.6.18-164/fs/ext4/ext4.h linux-2.6.18-164/fs/ext4/ext4.h
2 --- linux-2.6.18-164/fs/ext4/ext4.h     2009-10-16 23:26:25.000000000 +0800
3 +++ linux-2.6.18-164/fs/ext4/ext4.h     2009-10-16 23:31:41.000000000 +0800
4 @@ -539,6 +539,7 @@ do {                                                                               \
5  #define EXT4_MOUNT_QUOTA               0x80000 /* Some quota option set */
6  #define EXT4_MOUNT_USRQUOTA            0x100000 /* "old" user quota */
7  #define EXT4_MOUNT_GRPQUOTA            0x200000 /* "old" group quota */
8 +#define EXT4_MOUNT_EXTENTS             0x400000 /* Extents support */
9  #define EXT4_MOUNT_JOURNAL_CHECKSUM    0x800000 /* Journal checksums */
10  #define EXT4_MOUNT_JOURNAL_ASYNC_COMMIT        0x1000000 /* Journal Async Commit */
11  #define EXT4_MOUNT_I_VERSION            0x2000000 /* i_version support */
12 diff -up linux-2.6.18-164/fs/ext4/ext4_jbd2.h linux-2.6.18-164/fs/ext4/ext4_jbd2.h
13 --- linux-2.6.18-164/fs/ext4/ext4_jbd2.h        2009-10-16 23:26:25.000000000 +0800
14 +++ linux-2.6.18-164/fs/ext4/ext4_jbd2.h        2009-10-16 23:32:02.000000000 +0800
15 @@ -33,7 +33,7 @@
16  
17  #define EXT4_SINGLEDATA_TRANS_BLOCKS(sb)                               \
18         (EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_EXTENTS)   \
19 -        ? 27U : 8U)
20 +               || test_opt(sb, EXTENTS) ? 27U : 8U)
21  
22  /* Indicate that EXT4_SINGLEDATA_TRANS_BLOCKS takes the sb as argument */
23  #define EXT4_SINGLEDATA_TRANS_BLOCKS_HAS_SB
24 diff -up linux-2.6.18-164/fs/ext4/extents.c linux-2.6.18-164/fs/ext4/extents.c
25 --- linux-2.6.18-164/fs/ext4/extents.c  2009-10-16 23:26:25.000000000 +0800
26 +++ linux-2.6.18-164/fs/ext4/extents.c  2009-10-16 23:33:36.000000000 +0800
27 @@ -2313,7 +2313,7 @@ void ext4_ext_init(struct super_block *s
28          * possible initialization would be here
29          */
30  
31 -       if (EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_EXTENTS)) {
32 +       if (test_opt(sb, EXTENTS)) {
33                 printk(KERN_INFO "EXT4-fs: file extents enabled");
34  #ifdef AGGRESSIVE_TEST
35                 printk(", aggressive tests");
36 @@ -2338,7 +2338,7 @@ void ext4_ext_init(struct super_block *s
37   */
38  void ext4_ext_release(struct super_block *sb)
39  {
40 -       if (!EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_EXTENTS))
41 +       if (!test_opt(sb, EXTENTS))
42                 return;
43  
44  #ifdef EXTENTS_STATS
45 diff -up linux-2.6.18-164/fs/ext4/ialloc.c linux-2.6.18-164/fs/ext4/ialloc.c
46 --- linux-2.6.18-164/fs/ext4/ialloc.c   2009-10-16 23:26:25.000000000 +0800
47 +++ linux-2.6.18-164/fs/ext4/ialloc.c   2009-10-16 23:34:38.000000000 +0800
48 @@ -938,7 +938,7 @@ got:
49         if (err)
50                 goto fail_free_drop;
51  
52 -       if (EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_EXTENTS)) {
53 +       if (test_opt(sb, EXTENTS)) {
54                 /* set extent flag only for directory, file and normal symlink*/
55                 if (S_ISDIR(mode) || S_ISREG(mode) || S_ISLNK(mode)) {
56                         EXT4_I(inode)->i_flags |= EXT4_EXTENTS_FL;
57 diff -up linux-2.6.18-164/fs/ext4/migrate.c linux-2.6.18-164/fs/ext4/migrate.c
58 --- linux-2.6.18-164/fs/ext4/migrate.c  2009-09-28 16:11:26.000000000 +0800
59 +++ linux-2.6.18-164/fs/ext4/migrate.c  2009-10-16 23:36:49.000000000 +0800
60 @@ -459,13 +459,13 @@ int ext4_ext_migrate(struct inode *inode
61         struct list_blocks_struct lb;
62         unsigned long max_entries;
63  
64 -       /*
65 -        * If the filesystem does not support extents, or the inode
66 -        * already is extent-based, error out.
67 -        */
68 -       if (!EXT4_HAS_INCOMPAT_FEATURE(inode->i_sb,
69 -                                      EXT4_FEATURE_INCOMPAT_EXTENTS) ||
70 -           (EXT4_I(inode)->i_flags & EXT4_EXTENTS_FL))
71 +       if (!test_opt(inode->i_sb, EXTENTS))
72 +               /*
73 +                * if mounted with noextents we don't allow the migrate
74 +                */
75 +               return -EINVAL;
76 +
77 +       if ((EXT4_I(inode)->i_flags & EXT4_EXTENTS_FL))
78                 return -EINVAL;
79  
80         if (S_ISLNK(inode->i_mode) && inode->i_blocks == 0)
81 diff -up linux-2.6.18-164/fs/ext4/super.c linux-2.6.18-164/fs/ext4/super.c
82 --- linux-2.6.18-164/fs/ext4/super.c    2009-10-16 23:26:25.000000000 +0800
83 +++ linux-2.6.18-164/fs/ext4/super.c    2009-10-16 23:48:19.000000000 +0800
84 @@ -849,6 +849,8 @@ static int ext4_show_options(struct seq_
85                 seq_puts(seq, ",journal_async_commit");
86         if (test_opt(sb, NOBH))
87                 seq_puts(seq, ",nobh");
88 +       if (!test_opt(sb, EXTENTS))
89 +               seq_puts(seq, ",noextents");
90         if (test_opt(sb, I_VERSION))
91                 seq_puts(seq, ",i_version");
92         if (!test_opt(sb, DELALLOC))
93 @@ -1334,6 +1336,7 @@ enum {
94         Opt_inode_readahead_blks, Opt_journal_ioprio,
95         Opt_iopen, Opt_noiopen, Opt_iopen_nopriv, Opt_bigendian_extents,
96         Opt_force_over_8tb,
97 +       Opt_extents, Opt_noextents,
98  };
99  
100  static match_table_t tokens = {
101 @@ -1401,6 +1404,8 @@ static match_table_t tokens = {
102         {Opt_noauto_da_alloc, "noauto_da_alloc"},
103         {Opt_bigendian_extents, "bigendian_extents"},
104         {Opt_force_over_8tb, "force_over_8tb"},
105 +       {Opt_extents, "extents"},
106 +       {Opt_noextents, "noextents"},
107         {Opt_err, NULL},
108  };
109  
110 @@ -1441,6 +1446,7 @@ static int parse_options(char *options, 
111         int qtype, qfmt;
112         char *qname;
113  #endif
114 +       ext4_fsblk_t last_block;
115  
116         if (!options)
117                 return 1;
118 @@ -1829,6 +1835,33 @@ set_qf_format:
119                 case Opt_force_over_8tb:
120                         force_over_8tb = 1;
121                         break;
122 +               case Opt_extents:
123 +                       if (!EXT4_HAS_INCOMPAT_FEATURE(sb,
124 +                                       EXT4_FEATURE_INCOMPAT_EXTENTS)) {
125 +                               ext4_warning(sb, __func__,
126 +                                       "extents feature not enabled "
127 +                                       "on this filesystem, use tune2fs");
128 +                               return 0;
129 +                       }
130 +                       set_opt(sbi->s_mount_opt, EXTENTS);
131 +                       break;
132 +               case Opt_noextents:
133 +                       /*
134 +                        * When e2fsprogs support resizing an already existing
135 +                        * ext3 file system to greater than 2**32 we need to
136 +                        * add support to block allocator to handle growing
137 +                        * already existing block  mapped inode so that blocks
138 +                        * allocated for them fall within 2**32
139 +                       */
140 +                       last_block = ext4_blocks_count(sbi->s_es) - 1;
141 +                       if (last_block  > 0xffffffffULL) {
142 +                               printk(KERN_ERR "EXT4-fs: Filesystem too "
143 +                                       "large to mount with "
144 +                                       "-o noextents options\n");
145 +                               return 0;
146 +                       }
147 +                       clear_opt(sbi->s_mount_opt, EXTENTS);
148 +                       break;
149                 default:
150                         printk(KERN_ERR
151                                "EXT4-fs: Unrecognized mount option \"%s\" "
152 @@ -2501,6 +2534,18 @@ static int ext4_fill_super(struct super_
153         set_opt(sbi->s_mount_opt, BARRIER);
154  
155         /*
156 +        * turn on extents feature by default in ext4 filesystem
157 +        * only if feature flag already set by mkfs or tune2fs.
158 +        * Use -o noextents to turn it off
159 +       */
160 +       if (EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_EXTENTS))
161 +               set_opt(sbi->s_mount_opt, EXTENTS);
162 +       else
163 +               ext4_warning(sb, __func__,
164 +                       "extents feature not enabled on this filesystem, "
165 +                       "use tune2fs.");
166 +
167 +       /*
168          * enable delayed allocation by default
169          * Use -o nodelalloc to turn it off
170          */