diff options
Diffstat (limited to 'fs/nfs')
-rw-r--r-- | fs/nfs/super.c | 142 |
1 files changed, 108 insertions, 34 deletions
diff --git a/fs/nfs/super.c b/fs/nfs/super.c index a2b2805caf9d..b798ed1bd36d 100644 --- a/fs/nfs/super.c +++ b/fs/nfs/super.c | |||
@@ -139,22 +139,22 @@ static const match_table_t nfs_mount_option_tokens = { | |||
139 | { Opt_fscache_uniq, "fsc=%s" }, | 139 | { Opt_fscache_uniq, "fsc=%s" }, |
140 | { Opt_nofscache, "nofsc" }, | 140 | { Opt_nofscache, "nofsc" }, |
141 | 141 | ||
142 | { Opt_port, "port=%u" }, | 142 | { Opt_port, "port=%s" }, |
143 | { Opt_rsize, "rsize=%u" }, | 143 | { Opt_rsize, "rsize=%s" }, |
144 | { Opt_wsize, "wsize=%u" }, | 144 | { Opt_wsize, "wsize=%s" }, |
145 | { Opt_bsize, "bsize=%u" }, | 145 | { Opt_bsize, "bsize=%s" }, |
146 | { Opt_timeo, "timeo=%u" }, | 146 | { Opt_timeo, "timeo=%s" }, |
147 | { Opt_retrans, "retrans=%u" }, | 147 | { Opt_retrans, "retrans=%s" }, |
148 | { Opt_acregmin, "acregmin=%u" }, | 148 | { Opt_acregmin, "acregmin=%s" }, |
149 | { Opt_acregmax, "acregmax=%u" }, | 149 | { Opt_acregmax, "acregmax=%s" }, |
150 | { Opt_acdirmin, "acdirmin=%u" }, | 150 | { Opt_acdirmin, "acdirmin=%s" }, |
151 | { Opt_acdirmax, "acdirmax=%u" }, | 151 | { Opt_acdirmax, "acdirmax=%s" }, |
152 | { Opt_actimeo, "actimeo=%u" }, | 152 | { Opt_actimeo, "actimeo=%s" }, |
153 | { Opt_namelen, "namlen=%u" }, | 153 | { Opt_namelen, "namlen=%s" }, |
154 | { Opt_mountport, "mountport=%u" }, | 154 | { Opt_mountport, "mountport=%s" }, |
155 | { Opt_mountvers, "mountvers=%u" }, | 155 | { Opt_mountvers, "mountvers=%s" }, |
156 | { Opt_nfsvers, "nfsvers=%u" }, | 156 | { Opt_nfsvers, "nfsvers=%s" }, |
157 | { Opt_nfsvers, "vers=%u" }, | 157 | { Opt_nfsvers, "vers=%s" }, |
158 | 158 | ||
159 | { Opt_sec, "sec=%s" }, | 159 | { Opt_sec, "sec=%s" }, |
160 | { Opt_proto, "proto=%s" }, | 160 | { Opt_proto, "proto=%s" }, |
@@ -976,7 +976,8 @@ static int nfs_parse_mount_options(char *raw, | |||
976 | 976 | ||
977 | while ((p = strsep(&raw, ",")) != NULL) { | 977 | while ((p = strsep(&raw, ",")) != NULL) { |
978 | substring_t args[MAX_OPT_ARGS]; | 978 | substring_t args[MAX_OPT_ARGS]; |
979 | int option, token; | 979 | unsigned long option; |
980 | int token; | ||
980 | 981 | ||
981 | if (!*p) | 982 | if (!*p) |
982 | continue; | 983 | continue; |
@@ -1085,82 +1086,155 @@ static int nfs_parse_mount_options(char *raw, | |||
1085 | * options that take numeric values | 1086 | * options that take numeric values |
1086 | */ | 1087 | */ |
1087 | case Opt_port: | 1088 | case Opt_port: |
1088 | if (match_int(args, &option) || | 1089 | string = match_strdup(args); |
1089 | option < 0 || option > USHORT_MAX) | 1090 | if (string == NULL) |
1091 | goto out_nomem; | ||
1092 | rc = strict_strtoul(string, 10, &option); | ||
1093 | kfree(string); | ||
1094 | if (rc != 0 || option > USHORT_MAX) | ||
1090 | goto out_invalid_value; | 1095 | goto out_invalid_value; |
1091 | mnt->nfs_server.port = option; | 1096 | mnt->nfs_server.port = option; |
1092 | break; | 1097 | break; |
1093 | case Opt_rsize: | 1098 | case Opt_rsize: |
1094 | if (match_int(args, &option) || option < 0) | 1099 | string = match_strdup(args); |
1100 | if (string == NULL) | ||
1101 | goto out_nomem; | ||
1102 | rc = strict_strtoul(string, 10, &option); | ||
1103 | kfree(string); | ||
1104 | if (rc != 0) | ||
1095 | goto out_invalid_value; | 1105 | goto out_invalid_value; |
1096 | mnt->rsize = option; | 1106 | mnt->rsize = option; |
1097 | break; | 1107 | break; |
1098 | case Opt_wsize: | 1108 | case Opt_wsize: |
1099 | if (match_int(args, &option) || option < 0) | 1109 | string = match_strdup(args); |
1110 | if (string == NULL) | ||
1111 | goto out_nomem; | ||
1112 | rc = strict_strtoul(string, 10, &option); | ||
1113 | kfree(string); | ||
1114 | if (rc != 0) | ||
1100 | goto out_invalid_value; | 1115 | goto out_invalid_value; |
1101 | mnt->wsize = option; | 1116 | mnt->wsize = option; |
1102 | break; | 1117 | break; |
1103 | case Opt_bsize: | 1118 | case Opt_bsize: |
1104 | if (match_int(args, &option) || option < 0) | 1119 | string = match_strdup(args); |
1120 | if (string == NULL) | ||
1121 | goto out_nomem; | ||
1122 | rc = strict_strtoul(string, 10, &option); | ||
1123 | kfree(string); | ||
1124 | if (rc != 0) | ||
1105 | goto out_invalid_value; | 1125 | goto out_invalid_value; |
1106 | mnt->bsize = option; | 1126 | mnt->bsize = option; |
1107 | break; | 1127 | break; |
1108 | case Opt_timeo: | 1128 | case Opt_timeo: |
1109 | if (match_int(args, &option) || option <= 0) | 1129 | string = match_strdup(args); |
1130 | if (string == NULL) | ||
1131 | goto out_nomem; | ||
1132 | rc = strict_strtoul(string, 10, &option); | ||
1133 | kfree(string); | ||
1134 | if (rc != 0 || option == 0) | ||
1110 | goto out_invalid_value; | 1135 | goto out_invalid_value; |
1111 | mnt->timeo = option; | 1136 | mnt->timeo = option; |
1112 | break; | 1137 | break; |
1113 | case Opt_retrans: | 1138 | case Opt_retrans: |
1114 | if (match_int(args, &option) || option <= 0) | 1139 | string = match_strdup(args); |
1140 | if (string == NULL) | ||
1141 | goto out_nomem; | ||
1142 | rc = strict_strtoul(string, 10, &option); | ||
1143 | kfree(string); | ||
1144 | if (rc != 0 || option == 0) | ||
1115 | goto out_invalid_value; | 1145 | goto out_invalid_value; |
1116 | mnt->retrans = option; | 1146 | mnt->retrans = option; |
1117 | break; | 1147 | break; |
1118 | case Opt_acregmin: | 1148 | case Opt_acregmin: |
1119 | if (match_int(args, &option) || option < 0) | 1149 | string = match_strdup(args); |
1150 | if (string == NULL) | ||
1151 | goto out_nomem; | ||
1152 | rc = strict_strtoul(string, 10, &option); | ||
1153 | kfree(string); | ||
1154 | if (rc != 0) | ||
1120 | goto out_invalid_value; | 1155 | goto out_invalid_value; |
1121 | mnt->acregmin = option; | 1156 | mnt->acregmin = option; |
1122 | break; | 1157 | break; |
1123 | case Opt_acregmax: | 1158 | case Opt_acregmax: |
1124 | if (match_int(args, &option) || option < 0) | 1159 | string = match_strdup(args); |
1160 | if (string == NULL) | ||
1161 | goto out_nomem; | ||
1162 | rc = strict_strtoul(string, 10, &option); | ||
1163 | kfree(string); | ||
1164 | if (rc != 0) | ||
1125 | goto out_invalid_value; | 1165 | goto out_invalid_value; |
1126 | mnt->acregmax = option; | 1166 | mnt->acregmax = option; |
1127 | break; | 1167 | break; |
1128 | case Opt_acdirmin: | 1168 | case Opt_acdirmin: |
1129 | if (match_int(args, &option) || option < 0) | 1169 | string = match_strdup(args); |
1170 | if (string == NULL) | ||
1171 | goto out_nomem; | ||
1172 | rc = strict_strtoul(string, 10, &option); | ||
1173 | kfree(string); | ||
1174 | if (rc != 0) | ||
1130 | goto out_invalid_value; | 1175 | goto out_invalid_value; |
1131 | mnt->acdirmin = option; | 1176 | mnt->acdirmin = option; |
1132 | break; | 1177 | break; |
1133 | case Opt_acdirmax: | 1178 | case Opt_acdirmax: |
1134 | if (match_int(args, &option) || option < 0) | 1179 | string = match_strdup(args); |
1180 | if (string == NULL) | ||
1181 | goto out_nomem; | ||
1182 | rc = strict_strtoul(string, 10, &option); | ||
1183 | kfree(string); | ||
1184 | if (rc != 0) | ||
1135 | goto out_invalid_value; | 1185 | goto out_invalid_value; |
1136 | mnt->acdirmax = option; | 1186 | mnt->acdirmax = option; |
1137 | break; | 1187 | break; |
1138 | case Opt_actimeo: | 1188 | case Opt_actimeo: |
1139 | if (match_int(args, &option) || option < 0) | 1189 | string = match_strdup(args); |
1190 | if (string == NULL) | ||
1191 | goto out_nomem; | ||
1192 | rc = strict_strtoul(string, 10, &option); | ||
1193 | kfree(string); | ||
1194 | if (rc != 0) | ||
1140 | goto out_invalid_value; | 1195 | goto out_invalid_value; |
1141 | mnt->acregmin = mnt->acregmax = | 1196 | mnt->acregmin = mnt->acregmax = |
1142 | mnt->acdirmin = mnt->acdirmax = option; | 1197 | mnt->acdirmin = mnt->acdirmax = option; |
1143 | break; | 1198 | break; |
1144 | case Opt_namelen: | 1199 | case Opt_namelen: |
1145 | if (match_int(args, &option) || option < 0) | 1200 | string = match_strdup(args); |
1201 | if (string == NULL) | ||
1202 | goto out_nomem; | ||
1203 | rc = strict_strtoul(string, 10, &option); | ||
1204 | kfree(string); | ||
1205 | if (rc != 0) | ||
1146 | goto out_invalid_value; | 1206 | goto out_invalid_value; |
1147 | mnt->namlen = option; | 1207 | mnt->namlen = option; |
1148 | break; | 1208 | break; |
1149 | case Opt_mountport: | 1209 | case Opt_mountport: |
1150 | if (match_int(args, &option) || | 1210 | string = match_strdup(args); |
1151 | option < 0 || option > USHORT_MAX) | 1211 | if (string == NULL) |
1212 | goto out_nomem; | ||
1213 | rc = strict_strtoul(string, 10, &option); | ||
1214 | kfree(string); | ||
1215 | if (rc != 0 || option > USHORT_MAX) | ||
1152 | goto out_invalid_value; | 1216 | goto out_invalid_value; |
1153 | mnt->mount_server.port = option; | 1217 | mnt->mount_server.port = option; |
1154 | break; | 1218 | break; |
1155 | case Opt_mountvers: | 1219 | case Opt_mountvers: |
1156 | if (match_int(args, &option) || | 1220 | string = match_strdup(args); |
1221 | if (string == NULL) | ||
1222 | goto out_nomem; | ||
1223 | rc = strict_strtoul(string, 10, &option); | ||
1224 | kfree(string); | ||
1225 | if (rc != 0 || | ||
1157 | option < NFS_MNT_VERSION || | 1226 | option < NFS_MNT_VERSION || |
1158 | option > NFS_MNT3_VERSION) | 1227 | option > NFS_MNT3_VERSION) |
1159 | goto out_invalid_value; | 1228 | goto out_invalid_value; |
1160 | mnt->mount_server.version = option; | 1229 | mnt->mount_server.version = option; |
1161 | break; | 1230 | break; |
1162 | case Opt_nfsvers: | 1231 | case Opt_nfsvers: |
1163 | if (match_int(args, &option)) | 1232 | string = match_strdup(args); |
1233 | if (string == NULL) | ||
1234 | goto out_nomem; | ||
1235 | rc = strict_strtoul(string, 10, &option); | ||
1236 | kfree(string); | ||
1237 | if (rc != 0) | ||
1164 | goto out_invalid_value; | 1238 | goto out_invalid_value; |
1165 | switch (option) { | 1239 | switch (option) { |
1166 | case NFS2_VERSION: | 1240 | case NFS2_VERSION: |