NFSD: Fix a memory leak if nfsd4_recdir_load fail
authorKinglong Mee <kinglongmee@gmail.com>
Tue, 2 Sep 2014 14:12:17 +0000 (22:12 +0800)
committerJ. Bruce Fields <bfields@redhat.com>
Wed, 3 Sep 2014 21:43:01 +0000 (17:43 -0400)
Signed-off-by: Kinglong Mee <kinglongmee@gmail.com>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
fs/nfsd/nfs4recover.c

index e37ac1c53adb11d79467d432cb7980becb05f3f5..bb66037b63a0c0018568173f67a5fbecc22cc446 100644 (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 @@ err:
        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);
 }