diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-01-10 17:57:40 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-01-10 17:57:40 -0500 |
| commit | 57eccf1c2acae2fcb748730881ba75643fc31c81 (patch) | |
| tree | be47ac42ef0b2e3e7157ce196ad2ed1224739c6c /init | |
| parent | 5c395ae7033099fc657114ea997858aa622f08b2 (diff) | |
| parent | 074b1d12fe2500d7d453902f9266e6674b30d84c (diff) | |
Merge branch 'nfs-for-3.3' of git://git.linux-nfs.org/projects/trondmy/linux-nfs
* 'nfs-for-3.3' of git://git.linux-nfs.org/projects/trondmy/linux-nfs:
NFSv4: Change the default setting of the nfs4_disable_idmapping parameter
NFSv4: Save the owner/group name string when doing open
NFS: Remove pNFS bloat from the generic write path
pnfs-obj: Must return layout on IO error
pnfs-obj: pNFS errors are communicated on iodata->pnfs_error
NFS: Cache state owners after files are closed
NFS: Clean up nfs4_find_state_owners_locked()
NFSv4: include bitmap in nfsv4 get acl data
nfs: fix a minor do_div portability issue
NFSv4.1: cleanup comment and debug printk
NFSv4.1: change nfs4_free_slot parameters for dynamic slots
NFSv4.1: cleanup init and reset of session slot tables
NFSv4.1: fix backchannel slotid off-by-one bug
nfs: fix regression in handling of context= option in NFSv4
NFS - fix recent breakage to NFS error handling.
NFS: Retry mounting NFSROOT
SUNRPC: Clean up the RPCSEC_GSS service ticket requests
Diffstat (limited to 'init')
| -rw-r--r-- | init/do_mounts.c | 35 |
1 files changed, 31 insertions, 4 deletions
diff --git a/init/do_mounts.c b/init/do_mounts.c index b2eee02e0f83..2974c8b3b351 100644 --- a/init/do_mounts.c +++ b/init/do_mounts.c | |||
| @@ -400,15 +400,42 @@ out: | |||
| 400 | } | 400 | } |
| 401 | 401 | ||
| 402 | #ifdef CONFIG_ROOT_NFS | 402 | #ifdef CONFIG_ROOT_NFS |
| 403 | |||
| 404 | #define NFSROOT_TIMEOUT_MIN 5 | ||
| 405 | #define NFSROOT_TIMEOUT_MAX 30 | ||
| 406 | #define NFSROOT_RETRY_MAX 5 | ||
| 407 | |||
| 403 | static int __init mount_nfs_root(void) | 408 | static int __init mount_nfs_root(void) |
| 404 | { | 409 | { |
| 405 | char *root_dev, *root_data; | 410 | char *root_dev, *root_data; |
| 411 | unsigned int timeout; | ||
| 412 | int try, err; | ||
| 406 | 413 | ||
| 407 | if (nfs_root_data(&root_dev, &root_data) != 0) | 414 | err = nfs_root_data(&root_dev, &root_data); |
| 408 | return 0; | 415 | if (err != 0) |
| 409 | if (do_mount_root(root_dev, "nfs", root_mountflags, root_data) != 0) | ||
| 410 | return 0; | 416 | return 0; |
| 411 | return 1; | 417 | |
| 418 | /* | ||
| 419 | * The server or network may not be ready, so try several | ||
| 420 | * times. Stop after a few tries in case the client wants | ||
| 421 | * to fall back to other boot methods. | ||
| 422 | */ | ||
| 423 | timeout = NFSROOT_TIMEOUT_MIN; | ||
| 424 | for (try = 1; ; try++) { | ||
| 425 | err = do_mount_root(root_dev, "nfs", | ||
| 426 | root_mountflags, root_data); | ||
| 427 | if (err == 0) | ||
| 428 | return 1; | ||
| 429 | if (try > NFSROOT_RETRY_MAX) | ||
| 430 | break; | ||
| 431 | |||
| 432 | /* Wait, in case the server refused us immediately */ | ||
| 433 | ssleep(timeout); | ||
| 434 | timeout <<= 1; | ||
| 435 | if (timeout > NFSROOT_TIMEOUT_MAX) | ||
| 436 | timeout = NFSROOT_TIMEOUT_MAX; | ||
| 437 | } | ||
| 438 | return 0; | ||
| 412 | } | 439 | } |
| 413 | #endif | 440 | #endif |
| 414 | 441 | ||
