rpc_pipe: fix cleanup of dummy gssd directory when notification fails
authorJeff Layton <jlayton@redhat.com>
Mon, 9 Dec 2013 14:38:00 +0000 (09:38 -0500)
committerTrond Myklebust <Trond.Myklebust@netapp.com>
Tue, 10 Dec 2013 17:39:53 +0000 (19:39 +0200)
Currently, it could leak dentry references in some cases. Make sure
we clean up properly.

Signed-off-by: Jeff Layton <jlayton@redhat.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
net/sunrpc/rpc_pipe.c

index 5d973b25b5b0543fc5abb9afa3652fe809cb5387..b185548985622c0c23b1e0dc01acb783ee81246a 100644 (file)
@@ -1369,6 +1369,18 @@ out:
        return pipe_dentry;
 }
 
+static void
+rpc_gssd_dummy_depopulate(struct dentry *pipe_dentry)
+{
+       struct dentry *clnt_dir = pipe_dentry->d_parent;
+       struct dentry *gssd_dir = clnt_dir->d_parent;
+
+       __rpc_rmpipe(clnt_dir->d_inode, pipe_dentry);
+       __rpc_depopulate(clnt_dir, gssd_dummy_info_file, 0, 1);
+       __rpc_depopulate(gssd_dir, gssd_dummy_clnt_dir, 0, 1);
+       dput(pipe_dentry);
+}
+
 static int
 rpc_fill_super(struct super_block *sb, void *data, int silent)
 {
@@ -1412,7 +1424,7 @@ rpc_fill_super(struct super_block *sb, void *data, int silent)
        return 0;
 
 err_depopulate:
-       dput(gssd_dentry);
+       rpc_gssd_dummy_depopulate(gssd_dentry);
        blocking_notifier_call_chain(&rpc_pipefs_notifier_list,
                                           RPC_PIPEFS_UMOUNT,
                                           sb);