nfsd: Fix cld_net->cn_tfm initialization
authorScott Mayhew <smayhew@redhat.com>
Tue, 12 Nov 2019 19:01:43 +0000 (14:01 -0500)
committerJ. Bruce Fields <bfields@redhat.com>
Tue, 12 Nov 2019 19:53:26 +0000 (14:53 -0500)
Don't assign an error pointer to cld_net->cn_tfm, otherwise an oops will
occur in nfsd4_remove_cld_pipe().

Also, move the initialization of cld_net->cn_tfm so that it occurs after
the check to see if nfsdcld is running.  This is necessary because
nfsd4_client_tracking_init() looks for -ETIMEDOUT to determine whether
to use the "old" nfsdcld tracking ops.

Fixes: 6ee95d1c8991 ("nfsd: add support for upcall version 2")
Reported-by: Jamie Heilman <jamie@audible.transient.net>
Signed-off-by: Scott Mayhew <smayhew@redhat.com>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
fs/nfsd/nfs4recover.c

index 29dff4c..2481e76 100644 (file)
@@ -1578,6 +1578,7 @@ nfsd4_cld_tracking_init(struct net *net)
        struct nfsd_net *nn = net_generic(net, nfsd_net_id);
        bool running;
        int retries = 10;
+       struct crypto_shash *tfm;
 
        status = nfs4_cld_state_init(net);
        if (status)
@@ -1586,11 +1587,6 @@ nfsd4_cld_tracking_init(struct net *net)
        status = __nfsd4_init_cld_pipe(net);
        if (status)
                goto err_shutdown;
-       nn->cld_net->cn_tfm = crypto_alloc_shash("sha256", 0, 0);
-       if (IS_ERR(nn->cld_net->cn_tfm)) {
-               status = PTR_ERR(nn->cld_net->cn_tfm);
-               goto err_remove;
-       }
 
        /*
         * rpc pipe upcalls take 30 seconds to time out, so we don't want to
@@ -1607,6 +1603,12 @@ nfsd4_cld_tracking_init(struct net *net)
                status = -ETIMEDOUT;
                goto err_remove;
        }
+       tfm = crypto_alloc_shash("sha256", 0, 0);
+       if (IS_ERR(tfm)) {
+               status = PTR_ERR(tfm);
+               goto err_remove;
+       }
+       nn->cld_net->cn_tfm = tfm;
 
        status = nfsd4_cld_get_version(nn);
        if (status == -EOPNOTSUPP)