diff options
author | Christoph Hellwig <hch@lst.de> | 2009-11-21 06:28:52 -0500 |
---|---|---|
committer | OGAWA Hirofumi <hirofumi@mail.parknet.co.jp> | 2009-11-21 06:36:52 -0500 |
commit | 681142f9211b23e6aa2984259d38b76d7bdc05a8 (patch) | |
tree | cad526094c576b74eb12b0cdb1b497bbb4765128 /fs/fat | |
parent | a8a8a669ea13d792296737505adc43ccacf3a648 (diff) |
fat: make discard a mount option
Currently shipping discard capable SSDs and arrays have rather sub-optimal
implementations of the command and can the use of it can cause massive
slowdowns. Make issueing these commands option as it's already in btrfs
and gfs2.
Signed-off-by: Christoph Hellwig <hch@lst.de>
[hirofumi@mail.parknet.co.jp: tweaks, and add "discard" to fat_show_options]
Signed-off-by: OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>
Diffstat (limited to 'fs/fat')
-rw-r--r-- | fs/fat/fat.h | 3 | ||||
-rw-r--r-- | fs/fat/fatent.c | 25 | ||||
-rw-r--r-- | fs/fat/inode.c | 8 |
3 files changed, 24 insertions, 12 deletions
diff --git a/fs/fat/fat.h b/fs/fat/fat.h index 7db0979c6b7..e6efdfa0f6d 100644 --- a/fs/fat/fat.h +++ b/fs/fat/fat.h | |||
@@ -44,7 +44,8 @@ struct fat_mount_options { | |||
44 | nocase:1, /* Does this need case conversion? 0=need case conversion*/ | 44 | nocase:1, /* Does this need case conversion? 0=need case conversion*/ |
45 | usefree:1, /* Use free_clusters for FAT32 */ | 45 | usefree:1, /* Use free_clusters for FAT32 */ |
46 | tz_utc:1, /* Filesystem timestamps are in UTC */ | 46 | tz_utc:1, /* Filesystem timestamps are in UTC */ |
47 | rodir:1; /* allow ATTR_RO for directory */ | 47 | rodir:1, /* allow ATTR_RO for directory */ |
48 | discard:1; /* Issue discard requests on deletions */ | ||
48 | }; | 49 | }; |
49 | 50 | ||
50 | #define FAT_HASH_BITS 8 | 51 | #define FAT_HASH_BITS 8 |
diff --git a/fs/fat/fatent.c b/fs/fat/fatent.c index a81037721a6..81184d3b75a 100644 --- a/fs/fat/fatent.c +++ b/fs/fat/fatent.c | |||
@@ -566,16 +566,21 @@ int fat_free_clusters(struct inode *inode, int cluster) | |||
566 | goto error; | 566 | goto error; |
567 | } | 567 | } |
568 | 568 | ||
569 | /* | 569 | if (sbi->options.discard) { |
570 | * Issue discard for the sectors we no longer care about, | 570 | /* |
571 | * batching contiguous clusters into one request | 571 | * Issue discard for the sectors we no longer |
572 | */ | 572 | * care about, batching contiguous clusters |
573 | if (cluster != fatent.entry + 1) { | 573 | * into one request |
574 | int nr_clus = fatent.entry - first_cl + 1; | 574 | */ |
575 | 575 | if (cluster != fatent.entry + 1) { | |
576 | sb_issue_discard(sb, fat_clus_to_blknr(sbi, first_cl), | 576 | int nr_clus = fatent.entry - first_cl + 1; |
577 | nr_clus * sbi->sec_per_clus); | 577 | |
578 | first_cl = cluster; | 578 | sb_issue_discard(sb, |
579 | fat_clus_to_blknr(sbi, first_cl), | ||
580 | nr_clus * sbi->sec_per_clus); | ||
581 | |||
582 | first_cl = cluster; | ||
583 | } | ||
579 | } | 584 | } |
580 | 585 | ||
581 | ops->ent_put(&fatent, FAT_ENT_FREE); | 586 | ops->ent_put(&fatent, FAT_ENT_FREE); |
diff --git a/fs/fat/inode.c b/fs/fat/inode.c index 76b7961ab66..14da530b05c 100644 --- a/fs/fat/inode.c +++ b/fs/fat/inode.c | |||
@@ -858,6 +858,8 @@ static int fat_show_options(struct seq_file *m, struct vfsmount *mnt) | |||
858 | seq_puts(m, ",errors=panic"); | 858 | seq_puts(m, ",errors=panic"); |
859 | else | 859 | else |
860 | seq_puts(m, ",errors=remount-ro"); | 860 | seq_puts(m, ",errors=remount-ro"); |
861 | if (opts->discard) | ||
862 | seq_puts(m, ",discard"); | ||
861 | 863 | ||
862 | return 0; | 864 | return 0; |
863 | } | 865 | } |
@@ -871,7 +873,7 @@ enum { | |||
871 | Opt_shortname_winnt, Opt_shortname_mixed, Opt_utf8_no, Opt_utf8_yes, | 873 | Opt_shortname_winnt, Opt_shortname_mixed, Opt_utf8_no, Opt_utf8_yes, |
872 | Opt_uni_xl_no, Opt_uni_xl_yes, Opt_nonumtail_no, Opt_nonumtail_yes, | 874 | Opt_uni_xl_no, Opt_uni_xl_yes, Opt_nonumtail_no, Opt_nonumtail_yes, |
873 | Opt_obsolate, Opt_flush, Opt_tz_utc, Opt_rodir, Opt_err_cont, | 875 | Opt_obsolate, Opt_flush, Opt_tz_utc, Opt_rodir, Opt_err_cont, |
874 | Opt_err_panic, Opt_err_ro, Opt_err, | 876 | Opt_err_panic, Opt_err_ro, Opt_discard, Opt_err, |
875 | }; | 877 | }; |
876 | 878 | ||
877 | static const match_table_t fat_tokens = { | 879 | static const match_table_t fat_tokens = { |
@@ -899,6 +901,7 @@ static const match_table_t fat_tokens = { | |||
899 | {Opt_err_cont, "errors=continue"}, | 901 | {Opt_err_cont, "errors=continue"}, |
900 | {Opt_err_panic, "errors=panic"}, | 902 | {Opt_err_panic, "errors=panic"}, |
901 | {Opt_err_ro, "errors=remount-ro"}, | 903 | {Opt_err_ro, "errors=remount-ro"}, |
904 | {Opt_discard, "discard"}, | ||
902 | {Opt_obsolate, "conv=binary"}, | 905 | {Opt_obsolate, "conv=binary"}, |
903 | {Opt_obsolate, "conv=text"}, | 906 | {Opt_obsolate, "conv=text"}, |
904 | {Opt_obsolate, "conv=auto"}, | 907 | {Opt_obsolate, "conv=auto"}, |
@@ -1136,6 +1139,9 @@ static int parse_options(char *options, int is_vfat, int silent, int *debug, | |||
1136 | case Opt_rodir: | 1139 | case Opt_rodir: |
1137 | opts->rodir = 1; | 1140 | opts->rodir = 1; |
1138 | break; | 1141 | break; |
1142 | case Opt_discard: | ||
1143 | opts->discard = 1; | ||
1144 | break; | ||
1139 | 1145 | ||
1140 | /* obsolete mount options */ | 1146 | /* obsolete mount options */ |
1141 | case Opt_obsolate: | 1147 | case Opt_obsolate: |