diff options
author | Chris Mason <chris.mason@oracle.com> | 2009-06-09 20:28:34 -0400 |
---|---|---|
committer | Chris Mason <chris.mason@oracle.com> | 2009-06-10 11:29:52 -0400 |
commit | 451d7585a8bb1b9bec0d676ce3dece1923164e55 (patch) | |
tree | b4e9103b7010e45e02deff9ae4470df71475f8de /fs/btrfs/super.c | |
parent | c604480171c510c1beeb81b82418e5bc4de8f1ae (diff) |
Btrfs: add mount -o ssd_spread to spread allocations out
Some SSDs perform best when reusing block numbers often, while
others perform much better when clustering strictly allocates
big chunks of unused space.
The default mount -o ssd will find rough groupings of blocks
where there are a bunch of free blocks that might have some
allocated blocks mixed in.
mount -o ssd_spread will make sure there are no allocated blocks
mixed in. It should perform better on lower end SSDs.
Signed-off-by: Chris Mason <chris.mason@oracle.com>
Diffstat (limited to 'fs/btrfs/super.c')
-rw-r--r-- | fs/btrfs/super.c | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c index 22855a18eb48..7f5b2889949a 100644 --- a/fs/btrfs/super.c +++ b/fs/btrfs/super.c | |||
@@ -66,8 +66,8 @@ static void btrfs_put_super(struct super_block *sb) | |||
66 | enum { | 66 | enum { |
67 | Opt_degraded, Opt_subvol, Opt_device, Opt_nodatasum, Opt_nodatacow, | 67 | Opt_degraded, Opt_subvol, Opt_device, Opt_nodatasum, Opt_nodatacow, |
68 | Opt_max_extent, Opt_max_inline, Opt_alloc_start, Opt_nobarrier, | 68 | Opt_max_extent, Opt_max_inline, Opt_alloc_start, Opt_nobarrier, |
69 | Opt_ssd, Opt_nossd, Opt_thread_pool, Opt_noacl, Opt_compress, | 69 | Opt_ssd, Opt_nossd, Opt_ssd_spread, Opt_thread_pool, Opt_noacl, |
70 | Opt_notreelog, Opt_ratio, Opt_flushoncommit, Opt_err, | 70 | Opt_compress, Opt_notreelog, Opt_ratio, Opt_flushoncommit, Opt_err, |
71 | }; | 71 | }; |
72 | 72 | ||
73 | static match_table_t tokens = { | 73 | static match_table_t tokens = { |
@@ -83,6 +83,7 @@ static match_table_t tokens = { | |||
83 | {Opt_thread_pool, "thread_pool=%d"}, | 83 | {Opt_thread_pool, "thread_pool=%d"}, |
84 | {Opt_compress, "compress"}, | 84 | {Opt_compress, "compress"}, |
85 | {Opt_ssd, "ssd"}, | 85 | {Opt_ssd, "ssd"}, |
86 | {Opt_ssd_spread, "ssd_spread"}, | ||
86 | {Opt_nossd, "nossd"}, | 87 | {Opt_nossd, "nossd"}, |
87 | {Opt_noacl, "noacl"}, | 88 | {Opt_noacl, "noacl"}, |
88 | {Opt_notreelog, "notreelog"}, | 89 | {Opt_notreelog, "notreelog"}, |
@@ -174,9 +175,17 @@ int btrfs_parse_options(struct btrfs_root *root, char *options) | |||
174 | printk(KERN_INFO "btrfs: use ssd allocation scheme\n"); | 175 | printk(KERN_INFO "btrfs: use ssd allocation scheme\n"); |
175 | btrfs_set_opt(info->mount_opt, SSD); | 176 | btrfs_set_opt(info->mount_opt, SSD); |
176 | break; | 177 | break; |
178 | case Opt_ssd_spread: | ||
179 | printk(KERN_INFO "btrfs: use spread ssd " | ||
180 | "allocation scheme\n"); | ||
181 | btrfs_set_opt(info->mount_opt, SSD); | ||
182 | btrfs_set_opt(info->mount_opt, SSD_SPREAD); | ||
183 | break; | ||
177 | case Opt_nossd: | 184 | case Opt_nossd: |
178 | printk(KERN_INFO "btrfs: not using ssd allocation scheme\n"); | 185 | printk(KERN_INFO "btrfs: not using ssd allocation " |
186 | "scheme\n"); | ||
179 | btrfs_clear_opt(info->mount_opt, SSD); | 187 | btrfs_clear_opt(info->mount_opt, SSD); |
188 | btrfs_clear_opt(info->mount_opt, SSD_SPREAD); | ||
180 | break; | 189 | break; |
181 | case Opt_nobarrier: | 190 | case Opt_nobarrier: |
182 | printk(KERN_INFO "btrfs: turning off barriers\n"); | 191 | printk(KERN_INFO "btrfs: turning off barriers\n"); |
@@ -429,7 +438,9 @@ static int btrfs_show_options(struct seq_file *seq, struct vfsmount *vfs) | |||
429 | seq_printf(seq, ",thread_pool=%d", info->thread_pool_size); | 438 | seq_printf(seq, ",thread_pool=%d", info->thread_pool_size); |
430 | if (btrfs_test_opt(root, COMPRESS)) | 439 | if (btrfs_test_opt(root, COMPRESS)) |
431 | seq_puts(seq, ",compress"); | 440 | seq_puts(seq, ",compress"); |
432 | if (btrfs_test_opt(root, SSD)) | 441 | if (btrfs_test_opt(root, SSD_SPREAD)) |
442 | seq_puts(seq, ",ssd_spread"); | ||
443 | else if (btrfs_test_opt(root, SSD)) | ||
433 | seq_puts(seq, ",ssd"); | 444 | seq_puts(seq, ",ssd"); |
434 | if (btrfs_test_opt(root, NOTREELOG)) | 445 | if (btrfs_test_opt(root, NOTREELOG)) |
435 | seq_puts(seq, ",notreelog"); | 446 | seq_puts(seq, ",notreelog"); |