NFS: Create a free_client rpc_op
authorBryan Schumaker <bjschuma@netapp.com>
Wed, 20 Jun 2012 19:53:45 +0000 (15:53 -0400)
committerTrond Myklebust <Trond.Myklebust@netapp.com>
Fri, 29 Jun 2012 15:46:45 +0000 (11:46 -0400)
NFS v4 needs a way to shut down callbacks and sessions, but v2 and v3
don't.

Signed-off-by: Bryan Schumaker <bjschuma@netapp.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
fs/nfs/client.c
fs/nfs/internal.h
fs/nfs/nfs3proc.c
fs/nfs/nfs4_fs.h
fs/nfs/nfs4proc.c
fs/nfs/proc.c
include/linux/nfs_xdr.h

index bf0f896284a8cfcd38e3618397a9646704708116..82cb8a386a8f4b824a778b08ad71ad3dd5046b2d 100644 (file)
@@ -242,6 +242,12 @@ static void nfs4_shutdown_client(struct nfs_client *clp)
        kfree(clp->cl_implid);
 }
 
+void nfs4_free_client(struct nfs_client *clp)
+{
+       nfs4_shutdown_client(clp);
+       nfs_free_client(clp);
+}
+
 /* idr_remove_all is not needed as all id's are removed by nfs_put_client */
 void nfs_cleanup_cb_ident_idr(struct net *net)
 {
@@ -272,10 +278,6 @@ static void nfs4_destroy_server(struct nfs_server *server)
 }
 
 #else
-static void nfs4_shutdown_client(struct nfs_client *clp)
-{
-}
-
 void nfs_cleanup_cb_ident_idr(struct net *net)
 {
 }
@@ -293,12 +295,10 @@ static void pnfs_init_server(struct nfs_server *server)
 /*
  * Destroy a shared client record
  */
-static void nfs_free_client(struct nfs_client *clp)
+void nfs_free_client(struct nfs_client *clp)
 {
        dprintk("--> nfs_free_client(%u)\n", clp->rpc_ops->version);
 
-       nfs4_shutdown_client(clp);
-
        nfs_fscache_release_client_cookie(clp);
 
        /* -EIO all pending I/O */
@@ -335,7 +335,7 @@ void nfs_put_client(struct nfs_client *clp)
 
                BUG_ON(!list_empty(&clp->cl_superblocks));
 
-               nfs_free_client(clp);
+               clp->rpc_ops->free_client(clp);
        }
 }
 EXPORT_SYMBOL_GPL(nfs_put_client);
@@ -574,7 +574,7 @@ nfs_get_client(const struct nfs_client_initdata *cl_init,
                if (clp) {
                        spin_unlock(&nn->nfs_client_lock);
                        if (new)
-                               nfs_free_client(new);
+                               new->rpc_ops->free_client(new);
                        return nfs_found_client(cl_init, clp);
                }
                if (new) {
index 18f99ef7134387128507e8ffd93fff6943b241d6..93b732523342f7f5229179923571c15abe073e67 100644 (file)
@@ -151,6 +151,7 @@ extern void nfs_clients_init(struct net *net);
 
 extern void nfs_cleanup_cb_ident_idr(struct net *);
 extern void nfs_put_client(struct nfs_client *);
+extern void nfs_free_client(struct nfs_client *);
 extern struct nfs_client *nfs4_find_client_ident(struct net *, int);
 extern struct nfs_client *
 nfs4_find_client_sessionid(struct net *, const struct sockaddr *,
index 4749a32e54bee50062e8b891cb18e774a949c0e6..4ccb34bf1732ab73d79e4c1598767943c1ab6a24 100644 (file)
@@ -935,4 +935,5 @@ const struct nfs_rpc_ops nfs_v3_clientops = {
        .have_delegation = nfs3_have_delegation,
        .return_delegation = nfs3_return_delegation,
        .init_client    = nfs_init_client,
+       .free_client    = nfs_free_client,
 };
index cc5900ac61b584774de45f10c48906b3ff99de74..9889ee476e375b36be399e35f83c12fee987b47d 100644 (file)
@@ -301,6 +301,8 @@ extern const u32 nfs4_pathconf_bitmap[2];
 extern const u32 nfs4_fsinfo_bitmap[3];
 extern const u32 nfs4_fs_locations_bitmap[2];
 
+void nfs4_free_client(struct nfs_client *);
+
 /* nfs4renewd.c */
 extern void nfs4_schedule_state_renewal(struct nfs_client *);
 extern void nfs4_renewd_prepare_shutdown(struct nfs_server *);
index 035f7a0829ec0fb61331ebb0ec4e24b00de7a6c1..f301c53926b251aedf4c0eded5e455785ab0c7a1 100644 (file)
@@ -6807,6 +6807,7 @@ const struct nfs_rpc_ops nfs_v4_clientops = {
        .have_delegation = nfs4_have_delegation,
        .return_delegation = nfs4_inode_return_delegation,
        .init_client    = nfs4_init_client,
+       .free_client    = nfs4_free_client,
 };
 
 static const struct xattr_handler nfs4_xattr_nfs4_acl_handler = {
index 16632930abd2fce16c9762f32e8f3aeb99e23d58..53620bf10969b6358a6c99dca75d7403b5603abb 100644 (file)
@@ -791,4 +791,5 @@ const struct nfs_rpc_ops nfs_v2_clientops = {
        .have_delegation = nfs_have_delegation,
        .return_delegation = nfs_return_delegation,
        .init_client    = nfs_init_client,
+       .free_client    = nfs_free_client,
 };
index 62235be07fb89d1c68f81f06f24cdc23541d4209..e61dc7235d5d18e589bdd0502f8c1e4c07318f94 100644 (file)
@@ -1427,6 +1427,7 @@ struct nfs_rpc_ops {
        struct nfs_client *
                (*init_client) (struct nfs_client *, const struct rpc_timeout *,
                                const char *, rpc_authflavor_t);
+       void    (*free_client) (struct nfs_client *);
 };
 
 /*