FAT: add 'errors' mount option
On severe errors FAT remounts itself in read-only mode. Allow to specify FAT fs desired behavior through 'errors' mount option: panic, continue or remount read-only. `mount -t [fat|vfat] -o errors=[panic,remount-ro,continue] \ <bdev> <mount point>` This is analog to ext2 fs 'errors' mount option. Signed-off-by: Denis Karpov <ext-denis.2.karpov@nokia.com> Signed-off-by: OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>
This commit is contained in:
committed by
OGAWA Hirofumi
parent
9fa7eb283c
commit
85c7859190
@@ -76,7 +76,7 @@ static inline int __fat_get_block(struct inode *inode, sector_t iblock,
|
||||
return 0;
|
||||
|
||||
if (iblock != MSDOS_I(inode)->mmu_private >> sb->s_blocksize_bits) {
|
||||
fat_fs_panic(sb, "corrupted file size (i_pos %lld, %lld)",
|
||||
fat_fs_error(sb, "corrupted file size (i_pos %lld, %lld)",
|
||||
MSDOS_I(inode)->i_pos, MSDOS_I(inode)->mmu_private);
|
||||
return -EIO;
|
||||
}
|
||||
@@ -834,6 +834,12 @@ static int fat_show_options(struct seq_file *m, struct vfsmount *mnt)
|
||||
seq_puts(m, ",flush");
|
||||
if (opts->tz_utc)
|
||||
seq_puts(m, ",tz=UTC");
|
||||
if (opts->errors == FAT_ERRORS_CONT)
|
||||
seq_puts(m, ",errors=continue");
|
||||
else if (opts->errors == FAT_ERRORS_PANIC)
|
||||
seq_puts(m, ",errors=panic");
|
||||
else
|
||||
seq_puts(m, ",errors=remount-ro");
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -846,7 +852,8 @@ enum {
|
||||
Opt_charset, Opt_shortname_lower, Opt_shortname_win95,
|
||||
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_obsolate, Opt_flush, Opt_tz_utc, Opt_rodir, Opt_err,
|
||||
Opt_obsolate, Opt_flush, Opt_tz_utc, Opt_rodir, Opt_err_cont,
|
||||
Opt_err_panic, Opt_err_ro, Opt_err,
|
||||
};
|
||||
|
||||
static const match_table_t fat_tokens = {
|
||||
@@ -869,6 +876,11 @@ static const match_table_t fat_tokens = {
|
||||
{Opt_showexec, "showexec"},
|
||||
{Opt_debug, "debug"},
|
||||
{Opt_immutable, "sys_immutable"},
|
||||
{Opt_flush, "flush"},
|
||||
{Opt_tz_utc, "tz=UTC"},
|
||||
{Opt_err_cont, "errors=continue"},
|
||||
{Opt_err_panic, "errors=panic"},
|
||||
{Opt_err_ro, "errors=remount-ro"},
|
||||
{Opt_obsolate, "conv=binary"},
|
||||
{Opt_obsolate, "conv=text"},
|
||||
{Opt_obsolate, "conv=auto"},
|
||||
@@ -880,8 +892,6 @@ static const match_table_t fat_tokens = {
|
||||
{Opt_obsolate, "cvf_format=%20s"},
|
||||
{Opt_obsolate, "cvf_options=%100s"},
|
||||
{Opt_obsolate, "posix"},
|
||||
{Opt_flush, "flush"},
|
||||
{Opt_tz_utc, "tz=UTC"},
|
||||
{Opt_err, NULL},
|
||||
};
|
||||
static const match_table_t msdos_tokens = {
|
||||
@@ -951,6 +961,7 @@ static int parse_options(char *options, int is_vfat, int silent, int *debug,
|
||||
opts->numtail = 1;
|
||||
opts->usefree = opts->nocase = 0;
|
||||
opts->tz_utc = 0;
|
||||
opts->errors = FAT_ERRORS_RO;
|
||||
*debug = 0;
|
||||
|
||||
if (!options)
|
||||
@@ -1043,6 +1054,15 @@ static int parse_options(char *options, int is_vfat, int silent, int *debug,
|
||||
case Opt_tz_utc:
|
||||
opts->tz_utc = 1;
|
||||
break;
|
||||
case Opt_err_cont:
|
||||
opts->errors = FAT_ERRORS_CONT;
|
||||
break;
|
||||
case Opt_err_panic:
|
||||
opts->errors = FAT_ERRORS_PANIC;
|
||||
break;
|
||||
case Opt_err_ro:
|
||||
opts->errors = FAT_ERRORS_RO;
|
||||
break;
|
||||
|
||||
/* msdos specific */
|
||||
case Opt_dots:
|
||||
|
Reference in New Issue
Block a user