[PATCH 4.9 44/51] nfsd/callback: Cleanup callback cred on shutdown

2017-10-19 Thread Greg Kroah-Hartman
4.9-stable review patch.  If anyone has any objections, please let me know.

--

From: Kinglong Mee 


[ Upstream commit f7d1ddbe7648af7460d23688c8c131342eb43b3a ]

The rpccred gotten from rpc_lookup_machine_cred() should be put when
state is shutdown.

Signed-off-by: Kinglong Mee 
Signed-off-by: J. Bruce Fields 
Signed-off-by: Sasha Levin 
Signed-off-by: Greg Kroah-Hartman 
---
 fs/nfsd/nfs4callback.c |8 
 fs/nfsd/nfs4state.c|   10 ++
 fs/nfsd/state.h|1 +
 3 files changed, 15 insertions(+), 4 deletions(-)

--- a/fs/nfsd/nfs4callback.c
+++ b/fs/nfsd/nfs4callback.c
@@ -753,6 +753,14 @@ int set_callback_cred(void)
return 0;
 }
 
+void cleanup_callback_cred(void)
+{
+   if (callback_cred) {
+   put_rpccred(callback_cred);
+   callback_cred = NULL;
+   }
+}
+
 static struct rpc_cred *get_backchannel_cred(struct nfs4_client *clp, struct 
rpc_clnt *client, struct nfsd4_session *ses)
 {
if (clp->cl_minorversion == 0) {
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -7012,23 +7012,24 @@ nfs4_state_start(void)
 
ret = set_callback_cred();
if (ret)
-   return -ENOMEM;
+   return ret;
+
laundry_wq = alloc_workqueue("%s", WQ_UNBOUND, 0, "nfsd4");
if (laundry_wq == NULL) {
ret = -ENOMEM;
-   goto out_recovery;
+   goto out_cleanup_cred;
}
ret = nfsd4_create_callback_queue();
if (ret)
goto out_free_laundry;
 
set_max_delegations();
-
return 0;
 
 out_free_laundry:
destroy_workqueue(laundry_wq);
-out_recovery:
+out_cleanup_cred:
+   cleanup_callback_cred();
return ret;
 }
 
@@ -7086,6 +7087,7 @@ nfs4_state_shutdown(void)
 {
destroy_workqueue(laundry_wq);
nfsd4_destroy_callback_queue();
+   cleanup_callback_cred();
 }
 
 static void
--- a/fs/nfsd/state.h
+++ b/fs/nfsd/state.h
@@ -615,6 +615,7 @@ extern struct nfs4_client_reclaim *nfsd4
 extern __be32 nfs4_check_open_reclaim(clientid_t *clid,
struct nfsd4_compound_state *cstate, struct nfsd_net *nn);
 extern int set_callback_cred(void);
+extern void cleanup_callback_cred(void);
 extern void nfsd4_probe_callback(struct nfs4_client *clp);
 extern void nfsd4_probe_callback_sync(struct nfs4_client *clp);
 extern void nfsd4_change_callback(struct nfs4_client *clp, struct nfs4_cb_conn 
*);




[PATCH 4.9 44/51] nfsd/callback: Cleanup callback cred on shutdown

2017-10-19 Thread Greg Kroah-Hartman
4.9-stable review patch.  If anyone has any objections, please let me know.

--

From: Kinglong Mee 


[ Upstream commit f7d1ddbe7648af7460d23688c8c131342eb43b3a ]

The rpccred gotten from rpc_lookup_machine_cred() should be put when
state is shutdown.

Signed-off-by: Kinglong Mee 
Signed-off-by: J. Bruce Fields 
Signed-off-by: Sasha Levin 
Signed-off-by: Greg Kroah-Hartman 
---
 fs/nfsd/nfs4callback.c |8 
 fs/nfsd/nfs4state.c|   10 ++
 fs/nfsd/state.h|1 +
 3 files changed, 15 insertions(+), 4 deletions(-)

--- a/fs/nfsd/nfs4callback.c
+++ b/fs/nfsd/nfs4callback.c
@@ -753,6 +753,14 @@ int set_callback_cred(void)
return 0;
 }
 
+void cleanup_callback_cred(void)
+{
+   if (callback_cred) {
+   put_rpccred(callback_cred);
+   callback_cred = NULL;
+   }
+}
+
 static struct rpc_cred *get_backchannel_cred(struct nfs4_client *clp, struct 
rpc_clnt *client, struct nfsd4_session *ses)
 {
if (clp->cl_minorversion == 0) {
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -7012,23 +7012,24 @@ nfs4_state_start(void)
 
ret = set_callback_cred();
if (ret)
-   return -ENOMEM;
+   return ret;
+
laundry_wq = alloc_workqueue("%s", WQ_UNBOUND, 0, "nfsd4");
if (laundry_wq == NULL) {
ret = -ENOMEM;
-   goto out_recovery;
+   goto out_cleanup_cred;
}
ret = nfsd4_create_callback_queue();
if (ret)
goto out_free_laundry;
 
set_max_delegations();
-
return 0;
 
 out_free_laundry:
destroy_workqueue(laundry_wq);
-out_recovery:
+out_cleanup_cred:
+   cleanup_callback_cred();
return ret;
 }
 
@@ -7086,6 +7087,7 @@ nfs4_state_shutdown(void)
 {
destroy_workqueue(laundry_wq);
nfsd4_destroy_callback_queue();
+   cleanup_callback_cred();
 }
 
 static void
--- a/fs/nfsd/state.h
+++ b/fs/nfsd/state.h
@@ -615,6 +615,7 @@ extern struct nfs4_client_reclaim *nfsd4
 extern __be32 nfs4_check_open_reclaim(clientid_t *clid,
struct nfsd4_compound_state *cstate, struct nfsd_net *nn);
 extern int set_callback_cred(void);
+extern void cleanup_callback_cred(void);
 extern void nfsd4_probe_callback(struct nfs4_client *clp);
 extern void nfsd4_probe_callback_sync(struct nfs4_client *clp);
 extern void nfsd4_change_callback(struct nfs4_client *clp, struct nfs4_cb_conn 
*);