diff options
Diffstat (limited to 'fs/nfs/nfsroot.c')
| -rw-r--r-- | fs/nfs/nfsroot.c | 29 |
1 files changed, 14 insertions, 15 deletions
diff --git a/fs/nfs/nfsroot.c b/fs/nfs/nfsroot.c index 903908a2002..c541093a5bf 100644 --- a/fs/nfs/nfsroot.c +++ b/fs/nfs/nfsroot.c | |||
| @@ -86,11 +86,14 @@ | |||
| 86 | /* Default path we try to mount. "%s" gets replaced by our IP address */ | 86 | /* Default path we try to mount. "%s" gets replaced by our IP address */ |
| 87 | #define NFS_ROOT "/tftpboot/%s" | 87 | #define NFS_ROOT "/tftpboot/%s" |
| 88 | 88 | ||
| 89 | /* Default NFSROOT mount options. */ | ||
| 90 | #define NFS_DEF_OPTIONS "udp" | ||
| 91 | |||
| 89 | /* Parameters passed from the kernel command line */ | 92 | /* Parameters passed from the kernel command line */ |
| 90 | static char nfs_root_parms[256] __initdata = ""; | 93 | static char nfs_root_parms[256] __initdata = ""; |
| 91 | 94 | ||
| 92 | /* Text-based mount options passed to super.c */ | 95 | /* Text-based mount options passed to super.c */ |
| 93 | static char nfs_root_options[256] __initdata = ""; | 96 | static char nfs_root_options[256] __initdata = NFS_DEF_OPTIONS; |
| 94 | 97 | ||
| 95 | /* Address of NFS server */ | 98 | /* Address of NFS server */ |
| 96 | static __be32 servaddr __initdata = htonl(INADDR_NONE); | 99 | static __be32 servaddr __initdata = htonl(INADDR_NONE); |
| @@ -160,8 +163,14 @@ static int __init root_nfs_copy(char *dest, const char *src, | |||
| 160 | } | 163 | } |
| 161 | 164 | ||
| 162 | static int __init root_nfs_cat(char *dest, const char *src, | 165 | static int __init root_nfs_cat(char *dest, const char *src, |
| 163 | const size_t destlen) | 166 | const size_t destlen) |
| 164 | { | 167 | { |
| 168 | size_t len = strlen(dest); | ||
| 169 | |||
| 170 | if (len && dest[len - 1] != ',') | ||
| 171 | if (strlcat(dest, ",", destlen) > destlen) | ||
| 172 | return -1; | ||
| 173 | |||
| 165 | if (strlcat(dest, src, destlen) > destlen) | 174 | if (strlcat(dest, src, destlen) > destlen) |
| 166 | return -1; | 175 | return -1; |
| 167 | return 0; | 176 | return 0; |
| @@ -194,16 +203,6 @@ static int __init root_nfs_parse_options(char *incoming, char *exppath, | |||
| 194 | if (root_nfs_cat(nfs_root_options, incoming, | 203 | if (root_nfs_cat(nfs_root_options, incoming, |
| 195 | sizeof(nfs_root_options))) | 204 | sizeof(nfs_root_options))) |
| 196 | return -1; | 205 | return -1; |
| 197 | |||
| 198 | /* | ||
| 199 | * Possibly prepare for more options to be appended | ||
| 200 | */ | ||
| 201 | if (nfs_root_options[0] != '\0' && | ||
| 202 | nfs_root_options[strlen(nfs_root_options)] != ',') | ||
| 203 | if (root_nfs_cat(nfs_root_options, ",", | ||
| 204 | sizeof(nfs_root_options))) | ||
| 205 | return -1; | ||
| 206 | |||
| 207 | return 0; | 206 | return 0; |
| 208 | } | 207 | } |
| 209 | 208 | ||
| @@ -217,7 +216,7 @@ static int __init root_nfs_parse_options(char *incoming, char *exppath, | |||
| 217 | */ | 216 | */ |
| 218 | static int __init root_nfs_data(char *cmdline) | 217 | static int __init root_nfs_data(char *cmdline) |
| 219 | { | 218 | { |
| 220 | char addr_option[sizeof("nolock,addr=") + INET_ADDRSTRLEN + 1]; | 219 | char mand_options[sizeof("nolock,addr=") + INET_ADDRSTRLEN + 1]; |
| 221 | int len, retval = -1; | 220 | int len, retval = -1; |
| 222 | char *tmp = NULL; | 221 | char *tmp = NULL; |
| 223 | const size_t tmplen = sizeof(nfs_export_path); | 222 | const size_t tmplen = sizeof(nfs_export_path); |
| @@ -244,9 +243,9 @@ static int __init root_nfs_data(char *cmdline) | |||
| 244 | * Append mandatory options for nfsroot so they override | 243 | * Append mandatory options for nfsroot so they override |
| 245 | * what has come before | 244 | * what has come before |
| 246 | */ | 245 | */ |
| 247 | snprintf(addr_option, sizeof(addr_option), "nolock,addr=%pI4", | 246 | snprintf(mand_options, sizeof(mand_options), "nolock,addr=%pI4", |
| 248 | &servaddr); | 247 | &servaddr); |
| 249 | if (root_nfs_cat(nfs_root_options, addr_option, | 248 | if (root_nfs_cat(nfs_root_options, mand_options, |
| 250 | sizeof(nfs_root_options))) | 249 | sizeof(nfs_root_options))) |
| 251 | goto out_optionstoolong; | 250 | goto out_optionstoolong; |
| 252 | 251 | ||
