From 5dc43eb0f66de2e7de1d6459c865d4df6c4221cc Mon Sep 17 00:00:00 2001 From: Chuck Lever Date: Mon, 5 Dec 2011 15:40:30 -0500 Subject: [PATCH] --- yaml --- r: 282931 b: refs/heads/master c: 43717c7daebf10b43f12e68512484b3095bb1ba5 h: refs/heads/master i: 282929: 92b8b70b1045a78ff4baca7d704f37353dc6ae1d 282927: d614fc1e3434ff07fd13c2bba3a7c814ee686bdb v: v3 --- [refs] | 2 +- trunk/init/do_mounts.c | 35 +++++++++++++++++++++++++++++++---- 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/[refs] b/[refs] index 27b28018270b..44bd9959d75d 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 68c97153fb7f2877f98aa6c29546381d9cad2fed +refs/heads/master: 43717c7daebf10b43f12e68512484b3095bb1ba5 diff --git a/trunk/init/do_mounts.c b/trunk/init/do_mounts.c index 0f6e1d985a3b..db6e5ee0e1db 100644 --- a/trunk/init/do_mounts.c +++ b/trunk/init/do_mounts.c @@ -398,15 +398,42 @@ void __init mount_block_root(char *name, int flags) } #ifdef CONFIG_ROOT_NFS + +#define NFSROOT_TIMEOUT_MIN 5 +#define NFSROOT_TIMEOUT_MAX 30 +#define NFSROOT_RETRY_MAX 5 + static int __init mount_nfs_root(void) { char *root_dev, *root_data; + unsigned int timeout; + int try, err; - if (nfs_root_data(&root_dev, &root_data) != 0) - return 0; - if (do_mount_root(root_dev, "nfs", root_mountflags, root_data) != 0) + err = nfs_root_data(&root_dev, &root_data); + if (err != 0) return 0; - return 1; + + /* + * The server or network may not be ready, so try several + * times. Stop after a few tries in case the client wants + * to fall back to other boot methods. + */ + timeout = NFSROOT_TIMEOUT_MIN; + for (try = 1; ; try++) { + err = do_mount_root(root_dev, "nfs", + root_mountflags, root_data); + if (err == 0) + return 1; + if (try > NFSROOT_RETRY_MAX) + break; + + /* Wait, in case the server refused us immediately */ + ssleep(timeout); + timeout <<= 1; + if (timeout > NFSROOT_TIMEOUT_MAX) + timeout = NFSROOT_TIMEOUT_MAX; + } + return 0; } #endif