aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLukas Czerner <lczerner@redhat.com>2011-10-08 14:34:47 -0400
committerTheodore Ts'o <tytso@mit.edu>2011-10-08 14:34:47 -0400
commit4113c4caa4f355b8ff8b7ff0510c29c9d00d30b3 (patch)
treeb978be1044d72ab78739edd441385253f6c932ac
parentaf909a57fde821627282204ba43f27331342bf26 (diff)
ext4: remove deprecated oldalloc
For a long time now orlov is the default block allocator in the ext4. It performs better than the old one and no one seems to claim otherwise so we can safely drop it and make oldalloc and orlov mount option deprecated. This is a part of the effort to reduce number of ext4 options hence the test matrix. Signed-off-by: Lukas Czerner <lczerner@redhat.com> Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
-rw-r--r--Documentation/filesystems/ext4.txt8
-rw-r--r--fs/ext4/ext4.h1
-rw-r--r--fs/ext4/ialloc.c138
-rw-r--r--fs/ext4/super.c8
4 files changed, 7 insertions, 148 deletions
diff --git a/Documentation/filesystems/ext4.txt b/Documentation/filesystems/ext4.txt
index a5304019396..4917cf24a5e 100644
--- a/Documentation/filesystems/ext4.txt
+++ b/Documentation/filesystems/ext4.txt
@@ -203,14 +203,6 @@ inode_readahead_blks=n This tuning parameter controls the maximum
203 table readahead algorithm will pre-read into 203 table readahead algorithm will pre-read into
204 the buffer cache. The default value is 32 blocks. 204 the buffer cache. The default value is 32 blocks.
205 205
206orlov (*) This enables the new Orlov block allocator. It is
207 enabled by default.
208
209oldalloc This disables the Orlov block allocator and enables
210 the old block allocator. Orlov should have better
211 performance - we'd like to get some feedback if it's
212 the contrary for you.
213
214nouser_xattr Disables Extended User Attributes. If you have extended 206nouser_xattr Disables Extended User Attributes. If you have extended
215 attribute support enabled in the kernel configuration 207 attribute support enabled in the kernel configuration
216 (CONFIG_EXT4_FS_XATTR), extended attribute support 208 (CONFIG_EXT4_FS_XATTR), extended attribute support
diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
index 1bbd2caebe7..61b0b5cd4aa 100644
--- a/fs/ext4/ext4.h
+++ b/fs/ext4/ext4.h
@@ -913,7 +913,6 @@ struct ext4_inode_info {
913/* 913/*
914 * Mount flags 914 * Mount flags
915 */ 915 */
916#define EXT4_MOUNT_OLDALLOC 0x00002 /* Don't use the new Orlov allocator */
917#define EXT4_MOUNT_GRPID 0x00004 /* Create files with directory's group */ 916#define EXT4_MOUNT_GRPID 0x00004 /* Create files with directory's group */
918#define EXT4_MOUNT_DEBUG 0x00008 /* Some debugging messages */ 917#define EXT4_MOUNT_DEBUG 0x00008 /* Some debugging messages */
919#define EXT4_MOUNT_ERRORS_CONT 0x00010 /* Continue on errors */ 918#define EXT4_MOUNT_ERRORS_CONT 0x00010 /* Continue on errors */
diff --git a/fs/ext4/ialloc.c b/fs/ext4/ialloc.c
index d50a7d5e472..04219988e75 100644
--- a/fs/ext4/ialloc.c
+++ b/fs/ext4/ialloc.c
@@ -293,120 +293,6 @@ error_return:
293 ext4_std_error(sb, fatal); 293 ext4_std_error(sb, fatal);
294} 294}
295 295
296/*
297 * There are two policies for allocating an inode. If the new inode is
298 * a directory, then a forward search is made for a block group with both
299 * free space and a low directory-to-inode ratio; if that fails, then of
300 * the groups with above-average free space, that group with the fewest
301 * directories already is chosen.
302 *
303 * For other inodes, search forward from the parent directory\'s block
304 * group to find a free inode.
305 */
306static int find_group_dir(struct super_block *sb, struct inode *parent,
307 ext4_group_t *best_group)
308{
309 ext4_group_t ngroups = ext4_get_groups_count(sb);
310 unsigned int freei, avefreei;
311 struct ext4_group_desc *desc, *best_desc = NULL;
312 ext4_group_t group;
313 int ret = -1;
314
315 freei = percpu_counter_read_positive(&EXT4_SB(sb)->s_freeinodes_counter);
316 avefreei = freei / ngroups;
317
318 for (group = 0; group < ngroups; group++) {
319 desc = ext4_get_group_desc(sb, group, NULL);
320 if (!desc || !ext4_free_inodes_count(sb, desc))
321 continue;
322 if (ext4_free_inodes_count(sb, desc) < avefreei)
323 continue;
324 if (!best_desc ||
325 (ext4_free_group_clusters(sb, desc) >
326 ext4_free_group_clusters(sb, best_desc))) {
327 *best_group = group;
328 best_desc = desc;
329 ret = 0;
330 }
331 }
332 return ret;
333}
334
335#define free_block_ratio 10
336
337static int find_group_flex(struct super_block *sb, struct inode *parent,
338 ext4_group_t *best_group)
339{
340 struct ext4_sb_info *sbi = EXT4_SB(sb);
341 struct ext4_group_desc *desc;
342 struct flex_groups *flex_group = sbi->s_flex_groups;
343 ext4_group_t parent_group = EXT4_I(parent)->i_block_group;
344 ext4_group_t parent_fbg_group = ext4_flex_group(sbi, parent_group);
345 ext4_group_t ngroups = ext4_get_groups_count(sb);
346 int flex_size = ext4_flex_bg_size(sbi);
347 ext4_group_t best_flex = parent_fbg_group;
348 int blocks_per_flex = sbi->s_blocks_per_group * flex_size;
349 int flexbg_free_clusters;
350 int flex_freeb_ratio;
351 ext4_group_t n_fbg_groups;
352 ext4_group_t i;
353
354 n_fbg_groups = (ngroups + flex_size - 1) >>
355 sbi->s_log_groups_per_flex;
356
357find_close_to_parent:
358 flexbg_free_clusters = atomic_read(&flex_group[best_flex].free_clusters);
359 flex_freeb_ratio = EXT4_C2B(sbi, flexbg_free_clusters) * 100 /
360 blocks_per_flex;
361 if (atomic_read(&flex_group[best_flex].free_inodes) &&
362 flex_freeb_ratio > free_block_ratio)
363 goto found_flexbg;
364
365 if (best_flex && best_flex == parent_fbg_group) {
366 best_flex--;
367 goto find_close_to_parent;
368 }
369
370 for (i = 0; i < n_fbg_groups; i++) {
371 if (i == parent_fbg_group || i == parent_fbg_group - 1)
372 continue;
373
374 flexbg_free_clusters = atomic_read(&flex_group[i].free_clusters);
375 flex_freeb_ratio = EXT4_C2B(sbi, flexbg_free_clusters) * 100 /
376 blocks_per_flex;
377
378 if (flex_freeb_ratio > free_block_ratio &&
379 (atomic_read(&flex_group[i].free_inodes))) {
380 best_flex = i;
381 goto found_flexbg;
382 }
383
384 if ((atomic_read(&flex_group[best_flex].free_inodes) == 0) ||
385 ((atomic_read(&flex_group[i].free_clusters) >
386 atomic_read(&flex_group[best_flex].free_clusters)) &&
387 atomic_read(&flex_group[i].free_inodes)))
388 best_flex = i;
389 }
390
391 if (!atomic_read(&flex_group[best_flex].free_inodes) ||
392 !atomic_read(&flex_group[best_flex].free_clusters))
393 return -1;
394
395found_flexbg:
396 for (i = best_flex * flex_size; i < ngroups &&
397 i < (best_flex + 1) * flex_size; i++) {
398 desc = ext4_get_group_desc(sb, i, NULL);
399 if (ext4_free_inodes_count(sb, desc)) {
400 *best_group = i;
401 goto out;
402 }
403 }
404
405 return -1;
406out:
407 return 0;
408}
409
410struct orlov_stats { 296struct orlov_stats {
411 __u32 free_inodes; 297 __u32 free_inodes;
412 __u32 free_clusters; 298 __u32 free_clusters;
@@ -819,7 +705,6 @@ struct inode *ext4_new_inode(handle_t *handle, struct inode *dir, int mode,
819 int ret2, err = 0; 705 int ret2, err = 0;
820 struct inode *ret; 706 struct inode *ret;
821 ext4_group_t i; 707 ext4_group_t i;
822 static int once = 1;
823 ext4_group_t flex_group; 708 ext4_group_t flex_group;
824 709
825 /* Cannot create files in a deleted directory */ 710 /* Cannot create files in a deleted directory */
@@ -845,26 +730,9 @@ struct inode *ext4_new_inode(handle_t *handle, struct inode *dir, int mode,
845 goto got_group; 730 goto got_group;
846 } 731 }
847 732
848 if (sbi->s_log_groups_per_flex && test_opt(sb, OLDALLOC)) { 733 if (S_ISDIR(mode))
849 ret2 = find_group_flex(sb, dir, &group); 734 ret2 = find_group_orlov(sb, dir, &group, mode, qstr);
850 if (ret2 == -1) { 735 else
851 ret2 = find_group_other(sb, dir, &group, mode);
852 if (ret2 == 0 && once) {
853 once = 0;
854 printk(KERN_NOTICE "ext4: find_group_flex "
855 "failed, fallback succeeded dir %lu\n",
856 dir->i_ino);
857 }
858 }
859 goto got_group;
860 }
861
862 if (S_ISDIR(mode)) {
863 if (test_opt(sb, OLDALLOC))
864 ret2 = find_group_dir(sb, dir, &group);
865 else
866 ret2 = find_group_orlov(sb, dir, &group, mode, qstr);
867 } else
868 ret2 = find_group_other(sb, dir, &group, mode); 736 ret2 = find_group_other(sb, dir, &group, mode);
869 737
870got_group: 738got_group:
diff --git a/fs/ext4/super.c b/fs/ext4/super.c
index db2cd3f2107..42f76c64df8 100644
--- a/fs/ext4/super.c
+++ b/fs/ext4/super.c
@@ -1073,8 +1073,6 @@ static int ext4_show_options(struct seq_file *seq, struct vfsmount *vfs)
1073 seq_puts(seq, ",nouid32"); 1073 seq_puts(seq, ",nouid32");
1074 if (test_opt(sb, DEBUG) && !(def_mount_opts & EXT4_DEFM_DEBUG)) 1074 if (test_opt(sb, DEBUG) && !(def_mount_opts & EXT4_DEFM_DEBUG))
1075 seq_puts(seq, ",debug"); 1075 seq_puts(seq, ",debug");
1076 if (test_opt(sb, OLDALLOC))
1077 seq_puts(seq, ",oldalloc");
1078#ifdef CONFIG_EXT4_FS_XATTR 1076#ifdef CONFIG_EXT4_FS_XATTR
1079 if (test_opt(sb, XATTR_USER)) 1077 if (test_opt(sb, XATTR_USER))
1080 seq_puts(seq, ",user_xattr"); 1078 seq_puts(seq, ",user_xattr");
@@ -1583,10 +1581,12 @@ static int parse_options(char *options, struct super_block *sb,
1583 set_opt(sb, DEBUG); 1581 set_opt(sb, DEBUG);
1584 break; 1582 break;
1585 case Opt_oldalloc: 1583 case Opt_oldalloc:
1586 set_opt(sb, OLDALLOC); 1584 ext4_msg(sb, KERN_WARNING,
1585 "Ignoring deprecated oldalloc option");
1587 break; 1586 break;
1588 case Opt_orlov: 1587 case Opt_orlov:
1589 clear_opt(sb, OLDALLOC); 1588 ext4_msg(sb, KERN_WARNING,
1589 "Ignoring deprecated orlov option");
1590 break; 1590 break;
1591#ifdef CONFIG_EXT4_FS_XATTR 1591#ifdef CONFIG_EXT4_FS_XATTR
1592 case Opt_user_xattr: 1592 case Opt_user_xattr: