NFSD: move create/destroy of laundry_wq to init_nfsd and exit_nfsd
[ Upstream commit d76cc46b37e123e8d245cc3490978dbda56f979d ] This patch moves create/destroy of laundry_wq from nfs4_state_start and nfs4_state_shutdown_net to init_nfsd and exit_nfsd to prevent the laundromat from being freed while a thread is processing a conflicting lock. Reviewed-by: J. Bruce Fields <bfields@fieldses.org> Signed-off-by: Dai Ngo <dai.ngo@oracle.com> Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:

committed by
Greg Kroah-Hartman

parent
a26848e2bc
commit
461d0b57c9
@@ -127,6 +127,21 @@ static const struct nfsd4_callback_ops nfsd4_cb_notify_lock_ops;
|
|||||||
|
|
||||||
static struct workqueue_struct *laundry_wq;
|
static struct workqueue_struct *laundry_wq;
|
||||||
|
|
||||||
|
int nfsd4_create_laundry_wq(void)
|
||||||
|
{
|
||||||
|
int rc = 0;
|
||||||
|
|
||||||
|
laundry_wq = alloc_workqueue("%s", WQ_UNBOUND, 0, "nfsd4");
|
||||||
|
if (laundry_wq == NULL)
|
||||||
|
rc = -ENOMEM;
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
void nfsd4_destroy_laundry_wq(void)
|
||||||
|
{
|
||||||
|
destroy_workqueue(laundry_wq);
|
||||||
|
}
|
||||||
|
|
||||||
static bool is_session_dead(struct nfsd4_session *ses)
|
static bool is_session_dead(struct nfsd4_session *ses)
|
||||||
{
|
{
|
||||||
return ses->se_flags & NFS4_SESSION_DEAD;
|
return ses->se_flags & NFS4_SESSION_DEAD;
|
||||||
@@ -7775,22 +7790,12 @@ nfs4_state_start(void)
|
|||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
laundry_wq = alloc_workqueue("%s", WQ_UNBOUND, 0, "nfsd4");
|
|
||||||
if (laundry_wq == NULL) {
|
|
||||||
ret = -ENOMEM;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
ret = nfsd4_create_callback_queue();
|
ret = nfsd4_create_callback_queue();
|
||||||
if (ret)
|
if (ret)
|
||||||
goto out_free_laundry;
|
return ret;
|
||||||
|
|
||||||
set_max_delegations();
|
set_max_delegations();
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
out_free_laundry:
|
|
||||||
destroy_workqueue(laundry_wq);
|
|
||||||
out:
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -7827,7 +7832,6 @@ nfs4_state_shutdown_net(struct net *net)
|
|||||||
void
|
void
|
||||||
nfs4_state_shutdown(void)
|
nfs4_state_shutdown(void)
|
||||||
{
|
{
|
||||||
destroy_workqueue(laundry_wq);
|
|
||||||
nfsd4_destroy_callback_queue();
|
nfsd4_destroy_callback_queue();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1542,6 +1542,9 @@ static int __init init_nfsd(void)
|
|||||||
if (retval < 0)
|
if (retval < 0)
|
||||||
goto out_free_filesystem;
|
goto out_free_filesystem;
|
||||||
retval = register_cld_notifier();
|
retval = register_cld_notifier();
|
||||||
|
if (retval)
|
||||||
|
goto out_free_all;
|
||||||
|
retval = nfsd4_create_laundry_wq();
|
||||||
if (retval)
|
if (retval)
|
||||||
goto out_free_all;
|
goto out_free_all;
|
||||||
return 0;
|
return 0;
|
||||||
@@ -1566,6 +1569,7 @@ out_free_slabs:
|
|||||||
|
|
||||||
static void __exit exit_nfsd(void)
|
static void __exit exit_nfsd(void)
|
||||||
{
|
{
|
||||||
|
nfsd4_destroy_laundry_wq();
|
||||||
unregister_cld_notifier();
|
unregister_cld_notifier();
|
||||||
unregister_pernet_subsys(&nfsd_net_ops);
|
unregister_pernet_subsys(&nfsd_net_ops);
|
||||||
nfsd_drc_slab_free();
|
nfsd_drc_slab_free();
|
||||||
|
@@ -162,6 +162,8 @@ void nfs4_state_shutdown_net(struct net *net);
|
|||||||
int nfs4_reset_recoverydir(char *recdir);
|
int nfs4_reset_recoverydir(char *recdir);
|
||||||
char * nfs4_recoverydir(void);
|
char * nfs4_recoverydir(void);
|
||||||
bool nfsd4_spo_must_allow(struct svc_rqst *rqstp);
|
bool nfsd4_spo_must_allow(struct svc_rqst *rqstp);
|
||||||
|
int nfsd4_create_laundry_wq(void);
|
||||||
|
void nfsd4_destroy_laundry_wq(void);
|
||||||
#else
|
#else
|
||||||
static inline int nfsd4_init_slabs(void) { return 0; }
|
static inline int nfsd4_init_slabs(void) { return 0; }
|
||||||
static inline void nfsd4_free_slabs(void) { }
|
static inline void nfsd4_free_slabs(void) { }
|
||||||
@@ -175,6 +177,8 @@ static inline bool nfsd4_spo_must_allow(struct svc_rqst *rqstp)
|
|||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
static inline int nfsd4_create_laundry_wq(void) { return 0; };
|
||||||
|
static inline void nfsd4_destroy_laundry_wq(void) {};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Reference in New Issue
Block a user