Wait up to 10 seconds for late-initializing network interfaces to arrive.
Reviewed by: rmacklem
This commit is contained in:
@@ -57,6 +57,8 @@ __FBSDID("$FreeBSD$");
|
|||||||
#include <nfsclient/nfs.h>
|
#include <nfsclient/nfs.h>
|
||||||
#include <nfs/nfsdiskless.h>
|
#include <nfs/nfsdiskless.h>
|
||||||
|
|
||||||
|
#define NFS_IFACE_TIMEOUT_SECS 10 /* Timeout for interface to appear. */
|
||||||
|
|
||||||
static int inaddr_to_sockaddr(char *ev, struct sockaddr_in *sa);
|
static int inaddr_to_sockaddr(char *ev, struct sockaddr_in *sa);
|
||||||
static int hwaddr_to_sockaddr(char *ev, struct sockaddr_dl *sa);
|
static int hwaddr_to_sockaddr(char *ev, struct sockaddr_dl *sa);
|
||||||
static int decode_nfshandle(char *ev, u_char *fh, int maxfh);
|
static int decode_nfshandle(char *ev, u_char *fh, int maxfh);
|
||||||
@@ -170,6 +172,7 @@ nfs_setup_diskless(void)
|
|||||||
char *cp;
|
char *cp;
|
||||||
int cnt, fhlen, is_nfsv3;
|
int cnt, fhlen, is_nfsv3;
|
||||||
uint32_t len;
|
uint32_t len;
|
||||||
|
time_t timeout_at;
|
||||||
|
|
||||||
if (nfs_diskless_valid != 0)
|
if (nfs_diskless_valid != 0)
|
||||||
return;
|
return;
|
||||||
@@ -214,6 +217,8 @@ nfs_setup_diskless(void)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ifa = NULL;
|
ifa = NULL;
|
||||||
|
timeout_at = time_uptime + NFS_IFACE_TIMEOUT_SECS;
|
||||||
|
retry:
|
||||||
CURVNET_SET(TD_TO_VNET(curthread));
|
CURVNET_SET(TD_TO_VNET(curthread));
|
||||||
IFNET_RLOCK();
|
IFNET_RLOCK();
|
||||||
TAILQ_FOREACH(ifp, &V_ifnet, if_link) {
|
TAILQ_FOREACH(ifp, &V_ifnet, if_link) {
|
||||||
@@ -234,6 +239,10 @@ nfs_setup_diskless(void)
|
|||||||
}
|
}
|
||||||
IFNET_RUNLOCK();
|
IFNET_RUNLOCK();
|
||||||
CURVNET_RESTORE();
|
CURVNET_RESTORE();
|
||||||
|
if (time_uptime < timeout_at) {
|
||||||
|
pause("nfssdl", hz / 5);
|
||||||
|
goto retry;
|
||||||
|
}
|
||||||
printf("nfs_diskless: no interface\n");
|
printf("nfs_diskless: no interface\n");
|
||||||
return; /* no matching interface */
|
return; /* no matching interface */
|
||||||
match_done:
|
match_done:
|
||||||
|
|||||||
Reference in New Issue
Block a user