]> git.baikalelectronics.ru Git - kernel.git/commitdiff
nfsd: initialize nfsd versions before creating svc
authorJ. Bruce Fields <bfields@redhat.com>
Fri, 6 Aug 2010 19:48:03 +0000 (15:48 -0400)
committerJ. Bruce Fields <bfields@redhat.com>
Fri, 6 Aug 2010 21:05:40 +0000 (17:05 -0400)
Commit 4e181d9b8c86bf8c0fb90625401d748715f7daec "nfsd: move more into
nfsd_startup()" inadvertently moved nfsd_versions after
nfsd_create_svc().  On older distributions using an rpc.nfsd that does
not explicitly set the list of nfsd versions, this results in
svc-create_pooled() being called with an empty versions array.  The
resulting incomplete initialization leads to a NULL dereference in
svc_process_common() the first time a client accesses the server.

Move nfsd_reset_versions() back before the svc_create_pooled(); this
time, put it closer to the svc_create_pooled() call, to make this
mistake more difficult in the future.

Signed-off-by: J. Bruce Fields <bfields@redhat.com>
fs/nfsd/nfssvc.c

index 39ced4a52c5fd2c96a04a605c7c71d360287e509..e2c43464f23764405fef5e525e3829777be1a1a7 100644 (file)
@@ -224,7 +224,6 @@ static int nfsd_startup(unsigned short port, int nrservs)
        ret = nfs4_state_start();
        if (ret)
                goto out_lockd;
-       nfsd_reset_versions();
        nfsd_up = true;
        return 0;
 out_lockd:
@@ -329,6 +328,7 @@ int nfsd_create_serv(void)
                       nfsd_max_blksize >= 8*1024*2)
                        nfsd_max_blksize /= 2;
        }
+       nfsd_reset_versions();
 
        nfsd_serv = svc_create_pooled(&nfsd_program, nfsd_max_blksize,
                                      nfsd_last_thread, nfsd, THIS_MODULE);