Commit 337e4a1a authored by Linus Torvalds's avatar Linus Torvalds
parents 7949456b 681142f9
...@@ -44,7 +44,8 @@ struct fat_mount_options { ...@@ -44,7 +44,8 @@ struct fat_mount_options {
nocase:1, /* Does this need case conversion? 0=need case conversion*/ nocase:1, /* Does this need case conversion? 0=need case conversion*/
usefree:1, /* Use free_clusters for FAT32 */ usefree:1, /* Use free_clusters for FAT32 */
tz_utc:1, /* Filesystem timestamps are in UTC */ tz_utc:1, /* Filesystem timestamps are in UTC */
rodir:1; /* allow ATTR_RO for directory */ rodir:1, /* allow ATTR_RO for directory */
discard:1; /* Issue discard requests on deletions */
}; };
#define FAT_HASH_BITS 8 #define FAT_HASH_BITS 8
......
...@@ -566,17 +566,22 @@ int fat_free_clusters(struct inode *inode, int cluster) ...@@ -566,17 +566,22 @@ int fat_free_clusters(struct inode *inode, int cluster)
goto error; goto error;
} }
if (sbi->options.discard) {
/* /*
* Issue discard for the sectors we no longer care about, * Issue discard for the sectors we no longer
* batching contiguous clusters into one request * care about, batching contiguous clusters
* into one request
*/ */
if (cluster != fatent.entry + 1) { if (cluster != fatent.entry + 1) {
int nr_clus = fatent.entry - first_cl + 1; int nr_clus = fatent.entry - first_cl + 1;
sb_issue_discard(sb, fat_clus_to_blknr(sbi, first_cl), sb_issue_discard(sb,
fat_clus_to_blknr(sbi, first_cl),
nr_clus * sbi->sec_per_clus); nr_clus * sbi->sec_per_clus);
first_cl = cluster; first_cl = cluster;
} }
}
ops->ent_put(&fatent, FAT_ENT_FREE); ops->ent_put(&fatent, FAT_ENT_FREE);
if (sbi->free_clusters != -1) { if (sbi->free_clusters != -1) {
......
...@@ -858,6 +858,8 @@ static int fat_show_options(struct seq_file *m, struct vfsmount *mnt) ...@@ -858,6 +858,8 @@ static int fat_show_options(struct seq_file *m, struct vfsmount *mnt)
seq_puts(m, ",errors=panic"); seq_puts(m, ",errors=panic");
else else
seq_puts(m, ",errors=remount-ro"); seq_puts(m, ",errors=remount-ro");
if (opts->discard)
seq_puts(m, ",discard");
return 0; return 0;
} }
...@@ -871,7 +873,7 @@ enum { ...@@ -871,7 +873,7 @@ enum {
Opt_shortname_winnt, Opt_shortname_mixed, Opt_utf8_no, Opt_utf8_yes, Opt_shortname_winnt, Opt_shortname_mixed, Opt_utf8_no, Opt_utf8_yes,
Opt_uni_xl_no, Opt_uni_xl_yes, Opt_nonumtail_no, Opt_nonumtail_yes, Opt_uni_xl_no, Opt_uni_xl_yes, Opt_nonumtail_no, Opt_nonumtail_yes,
Opt_obsolate, Opt_flush, Opt_tz_utc, Opt_rodir, Opt_err_cont, Opt_obsolate, Opt_flush, Opt_tz_utc, Opt_rodir, Opt_err_cont,
Opt_err_panic, Opt_err_ro, Opt_err, Opt_err_panic, Opt_err_ro, Opt_discard, Opt_err,
}; };
static const match_table_t fat_tokens = { static const match_table_t fat_tokens = {
...@@ -899,6 +901,7 @@ static const match_table_t fat_tokens = { ...@@ -899,6 +901,7 @@ static const match_table_t fat_tokens = {
{Opt_err_cont, "errors=continue"}, {Opt_err_cont, "errors=continue"},
{Opt_err_panic, "errors=panic"}, {Opt_err_panic, "errors=panic"},
{Opt_err_ro, "errors=remount-ro"}, {Opt_err_ro, "errors=remount-ro"},
{Opt_discard, "discard"},
{Opt_obsolate, "conv=binary"}, {Opt_obsolate, "conv=binary"},
{Opt_obsolate, "conv=text"}, {Opt_obsolate, "conv=text"},
{Opt_obsolate, "conv=auto"}, {Opt_obsolate, "conv=auto"},
...@@ -1136,6 +1139,9 @@ static int parse_options(char *options, int is_vfat, int silent, int *debug, ...@@ -1136,6 +1139,9 @@ static int parse_options(char *options, int is_vfat, int silent, int *debug,
case Opt_rodir: case Opt_rodir:
opts->rodir = 1; opts->rodir = 1;
break; break;
case Opt_discard:
opts->discard = 1;
break;
/* obsolete mount options */ /* obsolete mount options */
case Opt_obsolate: case Opt_obsolate:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment