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 | |
| 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>
| -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 7db0979c6b72..e6efdfa0f6db 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 a81037721a6f..81184d3b75a3 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 76b7961ab663..14da530b05ca 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: |
