Skip to content

Commit

Permalink
LOCKD: Fix a race when initialising nlmsvc_timeout
Browse files Browse the repository at this point in the history
commit 06bed7d upstream.

This commit fixes a race whereby nlmclnt_init() first starts the lockd
daemon, and then calls nlm_bind_host() with the expectation that
nlmsvc_timeout has already been initialised. Unfortunately, there is no
no synchronisation between lockd() and lockd_up() to guarantee that this
is the case.

Fix is to move the initialisation of nlmsvc_timeout into lockd_create_svc

Fixes: 9a1b6bf ("LOCKD: Don't call utsname()->nodename...")
Cc: Bruce Fields <[email protected]>
Cc: [email protected] # 3.10.x
Signed-off-by: Trond Myklebust <[email protected]>
Signed-off-by: Greg Kroah-Hartman <[email protected]>
  • Loading branch information
trondmypd authored and gregkh committed Jan 27, 2015
1 parent 8e044b9 commit 7055233
Showing 1 changed file with 4 additions and 4 deletions.
8 changes: 4 additions & 4 deletions fs/lockd/svc.c
Original file line number Diff line number Diff line change
Expand Up @@ -137,10 +137,6 @@ lockd(void *vrqstp)

dprintk("NFS locking service started (ver " LOCKD_VERSION ").\n");

if (!nlm_timeout)
nlm_timeout = LOCKD_DFLT_TIMEO;
nlmsvc_timeout = nlm_timeout * HZ;

/*
* The main request loop. We don't terminate until the last
* NFS mount or NFS daemon has gone away.
Expand Down Expand Up @@ -346,6 +342,10 @@ static struct svc_serv *lockd_create_svc(void)
printk(KERN_WARNING
"lockd_up: no pid, %d users??\n", nlmsvc_users);

if (!nlm_timeout)
nlm_timeout = LOCKD_DFLT_TIMEO;
nlmsvc_timeout = nlm_timeout * HZ;

serv = svc_create(&nlmsvc_program, LOCKD_BUFSIZE, NULL);
if (!serv) {
printk(KERN_WARNING "lockd_up: create service failed\n");
Expand Down

0 comments on commit 7055233

Please sign in to comment.