struct gss_api_mech *mech;
        enum rpc_gss_svc service;
        struct rpc_clnt *client;
+       struct net *net;
        /*
         * There are two upcall pipes; dentry[1], named "gssd", is used
         * for the new text-based upcall; dentry[0] is named after the
 static void
 gss_release_msg(struct gss_upcall_msg *gss_msg)
 {
-       struct net *net = rpc_net_ns(gss_msg->auth->client);
+       struct net *net = gss_msg->auth->net;
        if (!atomic_dec_and_test(&gss_msg->count))
                return;
        put_pipe_version(net);
 }
 
 static struct gss_upcall_msg *
-gss_alloc_msg(struct gss_auth *gss_auth, struct rpc_clnt *clnt,
+gss_alloc_msg(struct gss_auth *gss_auth,
                kuid_t uid, const char *service_name)
 {
        struct gss_upcall_msg *gss_msg;
        gss_msg = kzalloc(sizeof(*gss_msg), GFP_NOFS);
        if (gss_msg == NULL)
                return ERR_PTR(-ENOMEM);
-       vers = get_pipe_version(rpc_net_ns(clnt));
+       vers = get_pipe_version(gss_auth->net);
        if (vers < 0) {
                kfree(gss_msg);
                return ERR_PTR(vers);
 }
 
 static struct gss_upcall_msg *
-gss_setup_upcall(struct rpc_clnt *clnt, struct gss_auth *gss_auth, struct rpc_cred *cred)
+gss_setup_upcall(struct gss_auth *gss_auth, struct rpc_cred *cred)
 {
        struct gss_cred *gss_cred = container_of(cred,
                        struct gss_cred, gc_base);
        struct gss_upcall_msg *gss_new, *gss_msg;
        kuid_t uid = cred->cr_uid;
 
-       gss_new = gss_alloc_msg(gss_auth, clnt, uid, gss_cred->gc_principal);
+       gss_new = gss_alloc_msg(gss_auth, uid, gss_cred->gc_principal);
        if (IS_ERR(gss_new))
                return gss_new;
        gss_msg = gss_add_msg(gss_new);
 
        dprintk("RPC: %5u %s for uid %u\n",
                task->tk_pid, __func__, from_kuid(&init_user_ns, cred->cr_uid));
-       gss_msg = gss_setup_upcall(task->tk_client, gss_auth, cred);
+       gss_msg = gss_setup_upcall(gss_auth, cred);
        if (PTR_ERR(gss_msg) == -EAGAIN) {
                /* XXX: warning on the first, under the assumption we
                 * shouldn't normally hit this case on a refresh. */
 static inline int
 gss_create_upcall(struct gss_auth *gss_auth, struct gss_cred *gss_cred)
 {
-       struct net *net = rpc_net_ns(gss_auth->client);
+       struct net *net = gss_auth->net;
        struct sunrpc_net *sn = net_generic(net, sunrpc_net_id);
        struct rpc_pipe *pipe;
        struct rpc_cred *cred = &gss_cred->gc_base;
        timeout = 15 * HZ;
        if (!sn->gssd_running)
                timeout = HZ >> 2;
-       gss_msg = gss_setup_upcall(gss_auth->client, gss_auth, cred);
+       gss_msg = gss_setup_upcall(gss_auth, cred);
        if (PTR_ERR(gss_msg) == -EAGAIN) {
                err = wait_event_interruptible_timeout(pipe_version_waitqueue,
                                sn->pipe_version >= 0, timeout);
 static void gss_pipes_dentries_destroy_net(struct rpc_clnt *clnt,
                                           struct rpc_auth *auth)
 {
-       struct net *net = rpc_net_ns(clnt);
+       struct gss_auth *gss_auth = container_of(auth, struct gss_auth,
+                       rpc_auth);
+       struct net *net = gss_auth->net;
        struct super_block *sb;
 
        sb = rpc_get_sb_net(net);
 static int gss_pipes_dentries_create_net(struct rpc_clnt *clnt,
                                         struct rpc_auth *auth)
 {
-       struct net *net = rpc_net_ns(clnt);
+       struct gss_auth *gss_auth = container_of(auth, struct gss_auth,
+                       rpc_auth);
+       struct net *net = gss_auth->net;
        struct super_block *sb;
        int err = 0;
 
                        goto err_free;
        }
        gss_auth->client = clnt;
+       gss_auth->net = get_net(rpc_net_ns(clnt));
        err = -EINVAL;
        gss_auth->mech = gss_mech_get_by_pseudoflavor(flavor);
        if (!gss_auth->mech) {
                dprintk("RPC:       Pseudoflavor %d not found!\n", flavor);
-               goto err_free;
+               goto err_put_net;
        }
        gss_auth->service = gss_pseudoflavor_to_service(gss_auth->mech, flavor);
        if (gss_auth->service == 0)
        rpc_destroy_pipe_data(gss_auth->pipe[1]);
 err_put_mech:
        gss_mech_put(gss_auth->mech);
+err_put_net:
+       put_net(gss_auth->net);
 err_free:
        kfree(gss_auth->target_name);
        kfree(gss_auth);
        rpc_destroy_pipe_data(gss_auth->pipe[0]);
        rpc_destroy_pipe_data(gss_auth->pipe[1]);
        gss_mech_put(gss_auth->mech);
+       put_net(gss_auth->net);
        kfree(gss_auth->target_name);
 
        kfree(gss_auth);