NFSD: Fix a memory leak if nfsd4_recdir_load fail

Signed-off-by: Kinglong Mee <kinglongmee@gmail.com>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
This commit is contained in:
Kinglong Mee 2014-09-02 22:12:17 +08:00 committed by J. Bruce Fields
parent c2236f141e
commit 15d176c195

View file

@ -480,6 +480,16 @@ nfsd4_init_recdir(struct net *net)
return status;
}
static void
nfsd4_shutdown_recdir(struct net *net)
{
struct nfsd_net *nn = net_generic(net, nfsd_net_id);
if (!nn->rec_file)
return;
fput(nn->rec_file);
nn->rec_file = NULL;
}
static int
nfs4_legacy_state_init(struct net *net)
@ -513,10 +523,13 @@ nfsd4_load_reboot_recovery_data(struct net *net)
int status;
status = nfsd4_init_recdir(net);
if (!status)
status = nfsd4_recdir_load(net);
if (status)
printk(KERN_ERR "NFSD: Failure reading reboot recovery data\n");
return status;
status = nfsd4_recdir_load(net);
if (status)
nfsd4_shutdown_recdir(net);
return status;
}
@ -546,22 +559,13 @@ nfsd4_legacy_tracking_init(struct net *net)
return status;
}
static void
nfsd4_shutdown_recdir(struct nfsd_net *nn)
{
if (!nn->rec_file)
return;
fput(nn->rec_file);
nn->rec_file = NULL;
}
static void
nfsd4_legacy_tracking_exit(struct net *net)
{
struct nfsd_net *nn = net_generic(net, nfsd_net_id);
nfs4_release_reclaim(nn);
nfsd4_shutdown_recdir(nn);
nfsd4_shutdown_recdir(net);
nfs4_legacy_state_shutdown(net);
}