diff options
Diffstat (limited to 'fs/fat')
| -rw-r--r-- | fs/fat/fat.h | 7 | ||||
| -rw-r--r-- | fs/fat/inode.c | 23 |
2 files changed, 21 insertions, 9 deletions
diff --git a/fs/fat/fat.h b/fs/fat/fat.h index e9cc3f0d58e2..a7b1d86b37c7 100644 --- a/fs/fat/fat.h +++ b/fs/fat/fat.h | |||
| @@ -23,6 +23,9 @@ | |||
| 23 | #define FAT_ERRORS_PANIC 2 /* panic on error */ | 23 | #define FAT_ERRORS_PANIC 2 /* panic on error */ |
| 24 | #define FAT_ERRORS_RO 3 /* remount r/o on error */ | 24 | #define FAT_ERRORS_RO 3 /* remount r/o on error */ |
| 25 | 25 | ||
| 26 | #define FAT_NFS_STALE_RW 1 /* NFS RW support, can cause ESTALE */ | ||
| 27 | #define FAT_NFS_NOSTALE_RO 2 /* NFS RO support, no ESTALE issue */ | ||
| 28 | |||
| 26 | struct fat_mount_options { | 29 | struct fat_mount_options { |
| 27 | kuid_t fs_uid; | 30 | kuid_t fs_uid; |
| 28 | kgid_t fs_gid; | 31 | kgid_t fs_gid; |
| @@ -34,6 +37,7 @@ struct fat_mount_options { | |||
| 34 | unsigned short shortname; /* flags for shortname display/create rule */ | 37 | unsigned short shortname; /* flags for shortname display/create rule */ |
| 35 | unsigned char name_check; /* r = relaxed, n = normal, s = strict */ | 38 | unsigned char name_check; /* r = relaxed, n = normal, s = strict */ |
| 36 | unsigned char errors; /* On error: continue, panic, remount-ro */ | 39 | unsigned char errors; /* On error: continue, panic, remount-ro */ |
| 40 | unsigned char nfs; /* NFS support: nostale_ro, stale_rw */ | ||
| 37 | unsigned short allow_utime;/* permission for setting the [am]time */ | 41 | unsigned short allow_utime;/* permission for setting the [am]time */ |
| 38 | unsigned quiet:1, /* set = fake successful chmods and chowns */ | 42 | unsigned quiet:1, /* set = fake successful chmods and chowns */ |
| 39 | showexec:1, /* set = only set x bit for com/exe/bat */ | 43 | showexec:1, /* set = only set x bit for com/exe/bat */ |
| @@ -48,8 +52,7 @@ struct fat_mount_options { | |||
| 48 | usefree:1, /* Use free_clusters for FAT32 */ | 52 | usefree:1, /* Use free_clusters for FAT32 */ |
| 49 | tz_set:1, /* Filesystem timestamps' offset set */ | 53 | tz_set:1, /* Filesystem timestamps' offset set */ |
| 50 | rodir:1, /* allow ATTR_RO for directory */ | 54 | rodir:1, /* allow ATTR_RO for directory */ |
| 51 | discard:1, /* Issue discard requests on deletions */ | 55 | discard:1; /* Issue discard requests on deletions */ |
| 52 | nfs:1; /* Do extra work needed for NFS export */ | ||
| 53 | }; | 56 | }; |
| 54 | 57 | ||
| 55 | #define FAT_HASH_BITS 8 | 58 | #define FAT_HASH_BITS 8 |
diff --git a/fs/fat/inode.c b/fs/fat/inode.c index acf6e479b443..93fbc8a7f098 100644 --- a/fs/fat/inode.c +++ b/fs/fat/inode.c | |||
| @@ -814,8 +814,6 @@ static int fat_show_options(struct seq_file *m, struct dentry *root) | |||
| 814 | seq_puts(m, ",usefree"); | 814 | seq_puts(m, ",usefree"); |
| 815 | if (opts->quiet) | 815 | if (opts->quiet) |
| 816 | seq_puts(m, ",quiet"); | 816 | seq_puts(m, ",quiet"); |
| 817 | if (opts->nfs) | ||
| 818 | seq_puts(m, ",nfs"); | ||
| 819 | if (opts->showexec) | 817 | if (opts->showexec) |
| 820 | seq_puts(m, ",showexec"); | 818 | seq_puts(m, ",showexec"); |
| 821 | if (opts->sys_immutable) | 819 | if (opts->sys_immutable) |
| @@ -849,6 +847,10 @@ static int fat_show_options(struct seq_file *m, struct dentry *root) | |||
| 849 | seq_puts(m, ",errors=panic"); | 847 | seq_puts(m, ",errors=panic"); |
| 850 | else | 848 | else |
| 851 | seq_puts(m, ",errors=remount-ro"); | 849 | seq_puts(m, ",errors=remount-ro"); |
| 850 | if (opts->nfs == FAT_NFS_NOSTALE_RO) | ||
| 851 | seq_puts(m, ",nfs=nostale_ro"); | ||
| 852 | else if (opts->nfs) | ||
| 853 | seq_puts(m, ",nfs=stale_rw"); | ||
| 852 | if (opts->discard) | 854 | if (opts->discard) |
| 853 | seq_puts(m, ",discard"); | 855 | seq_puts(m, ",discard"); |
| 854 | 856 | ||
| @@ -865,7 +867,7 @@ enum { | |||
| 865 | Opt_uni_xl_no, Opt_uni_xl_yes, Opt_nonumtail_no, Opt_nonumtail_yes, | 867 | Opt_uni_xl_no, Opt_uni_xl_yes, Opt_nonumtail_no, Opt_nonumtail_yes, |
| 866 | Opt_obsolete, Opt_flush, Opt_tz_utc, Opt_rodir, Opt_err_cont, | 868 | Opt_obsolete, Opt_flush, Opt_tz_utc, Opt_rodir, Opt_err_cont, |
| 867 | Opt_err_panic, Opt_err_ro, Opt_discard, Opt_nfs, Opt_time_offset, | 869 | Opt_err_panic, Opt_err_ro, Opt_discard, Opt_nfs, Opt_time_offset, |
| 868 | Opt_err, | 870 | Opt_nfs_stale_rw, Opt_nfs_nostale_ro, Opt_err, |
| 869 | }; | 871 | }; |
| 870 | 872 | ||
| 871 | static const match_table_t fat_tokens = { | 873 | static const match_table_t fat_tokens = { |
| @@ -895,7 +897,9 @@ static const match_table_t fat_tokens = { | |||
| 895 | {Opt_err_panic, "errors=panic"}, | 897 | {Opt_err_panic, "errors=panic"}, |
| 896 | {Opt_err_ro, "errors=remount-ro"}, | 898 | {Opt_err_ro, "errors=remount-ro"}, |
| 897 | {Opt_discard, "discard"}, | 899 | {Opt_discard, "discard"}, |
| 898 | {Opt_nfs, "nfs"}, | 900 | {Opt_nfs_stale_rw, "nfs"}, |
| 901 | {Opt_nfs_stale_rw, "nfs=stale_rw"}, | ||
| 902 | {Opt_nfs_nostale_ro, "nfs=nostale_ro"}, | ||
| 899 | {Opt_obsolete, "conv=binary"}, | 903 | {Opt_obsolete, "conv=binary"}, |
| 900 | {Opt_obsolete, "conv=text"}, | 904 | {Opt_obsolete, "conv=text"}, |
| 901 | {Opt_obsolete, "conv=auto"}, | 905 | {Opt_obsolete, "conv=auto"}, |
| @@ -1092,6 +1096,12 @@ static int parse_options(struct super_block *sb, char *options, int is_vfat, | |||
| 1092 | case Opt_err_ro: | 1096 | case Opt_err_ro: |
| 1093 | opts->errors = FAT_ERRORS_RO; | 1097 | opts->errors = FAT_ERRORS_RO; |
| 1094 | break; | 1098 | break; |
| 1099 | case Opt_nfs_stale_rw: | ||
| 1100 | opts->nfs = FAT_NFS_STALE_RW; | ||
| 1101 | break; | ||
| 1102 | case Opt_nfs_nostale_ro: | ||
| 1103 | opts->nfs = FAT_NFS_NOSTALE_RO; | ||
| 1104 | break; | ||
| 1095 | 1105 | ||
| 1096 | /* msdos specific */ | 1106 | /* msdos specific */ |
| 1097 | case Opt_dots: | 1107 | case Opt_dots: |
| @@ -1150,9 +1160,6 @@ static int parse_options(struct super_block *sb, char *options, int is_vfat, | |||
| 1150 | case Opt_discard: | 1160 | case Opt_discard: |
| 1151 | opts->discard = 1; | 1161 | opts->discard = 1; |
| 1152 | break; | 1162 | break; |
| 1153 | case Opt_nfs: | ||
| 1154 | opts->nfs = 1; | ||
| 1155 | break; | ||
| 1156 | 1163 | ||
| 1157 | /* obsolete mount options */ | 1164 | /* obsolete mount options */ |
| 1158 | case Opt_obsolete: | 1165 | case Opt_obsolete: |
| @@ -1183,6 +1190,8 @@ out: | |||
| 1183 | opts->allow_utime = ~opts->fs_dmask & (S_IWGRP | S_IWOTH); | 1190 | opts->allow_utime = ~opts->fs_dmask & (S_IWGRP | S_IWOTH); |
| 1184 | if (opts->unicode_xlate) | 1191 | if (opts->unicode_xlate) |
| 1185 | opts->utf8 = 0; | 1192 | opts->utf8 = 0; |
| 1193 | if (opts->nfs == FAT_NFS_NOSTALE_RO) | ||
| 1194 | sb->s_flags |= MS_RDONLY; | ||
| 1186 | 1195 | ||
| 1187 | return 0; | 1196 | return 0; |
| 1188 | } | 1197 | } |
