NFS: Create a free_client rpc_op

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>
This commit is contained in:
Bryan Schumaker 2012-06-20 15:53:45 -04:00 committed by Trond Myklebust
parent 57ec14c55d
commit cdb7ecedec
7 changed files with 16 additions and 9 deletions

View File

@ -242,6 +242,12 @@ static void nfs4_shutdown_client(struct nfs_client *clp)
kfree(clp->cl_implid); 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 */ /* 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) void nfs_cleanup_cb_ident_idr(struct net *net)
{ {
@ -272,10 +278,6 @@ static void nfs4_destroy_server(struct nfs_server *server)
} }
#else #else
static void nfs4_shutdown_client(struct nfs_client *clp)
{
}
void nfs_cleanup_cb_ident_idr(struct net *net) 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 * 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); dprintk("--> nfs_free_client(%u)\n", clp->rpc_ops->version);
nfs4_shutdown_client(clp);
nfs_fscache_release_client_cookie(clp); nfs_fscache_release_client_cookie(clp);
/* -EIO all pending I/O */ /* -EIO all pending I/O */
@ -335,7 +335,7 @@ void nfs_put_client(struct nfs_client *clp)
BUG_ON(!list_empty(&clp->cl_superblocks)); BUG_ON(!list_empty(&clp->cl_superblocks));
nfs_free_client(clp); clp->rpc_ops->free_client(clp);
} }
} }
EXPORT_SYMBOL_GPL(nfs_put_client); EXPORT_SYMBOL_GPL(nfs_put_client);
@ -574,7 +574,7 @@ nfs_get_client(const struct nfs_client_initdata *cl_init,
if (clp) { if (clp) {
spin_unlock(&nn->nfs_client_lock); spin_unlock(&nn->nfs_client_lock);
if (new) if (new)
nfs_free_client(new); new->rpc_ops->free_client(new);
return nfs_found_client(cl_init, clp); return nfs_found_client(cl_init, clp);
} }
if (new) { if (new) {

View 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_cleanup_cb_ident_idr(struct net *);
extern void nfs_put_client(struct nfs_client *); 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_ident(struct net *, int);
extern struct nfs_client * extern struct nfs_client *
nfs4_find_client_sessionid(struct net *, const struct sockaddr *, nfs4_find_client_sessionid(struct net *, const struct sockaddr *,

View File

@ -935,4 +935,5 @@ const struct nfs_rpc_ops nfs_v3_clientops = {
.have_delegation = nfs3_have_delegation, .have_delegation = nfs3_have_delegation,
.return_delegation = nfs3_return_delegation, .return_delegation = nfs3_return_delegation,
.init_client = nfs_init_client, .init_client = nfs_init_client,
.free_client = nfs_free_client,
}; };

View File

@ -301,6 +301,8 @@ extern const u32 nfs4_pathconf_bitmap[2];
extern const u32 nfs4_fsinfo_bitmap[3]; extern const u32 nfs4_fsinfo_bitmap[3];
extern const u32 nfs4_fs_locations_bitmap[2]; extern const u32 nfs4_fs_locations_bitmap[2];
void nfs4_free_client(struct nfs_client *);
/* nfs4renewd.c */ /* nfs4renewd.c */
extern void nfs4_schedule_state_renewal(struct nfs_client *); extern void nfs4_schedule_state_renewal(struct nfs_client *);
extern void nfs4_renewd_prepare_shutdown(struct nfs_server *); extern void nfs4_renewd_prepare_shutdown(struct nfs_server *);

View File

@ -6807,6 +6807,7 @@ const struct nfs_rpc_ops nfs_v4_clientops = {
.have_delegation = nfs4_have_delegation, .have_delegation = nfs4_have_delegation,
.return_delegation = nfs4_inode_return_delegation, .return_delegation = nfs4_inode_return_delegation,
.init_client = nfs4_init_client, .init_client = nfs4_init_client,
.free_client = nfs4_free_client,
}; };
static const struct xattr_handler nfs4_xattr_nfs4_acl_handler = { static const struct xattr_handler nfs4_xattr_nfs4_acl_handler = {

View File

@ -791,4 +791,5 @@ const struct nfs_rpc_ops nfs_v2_clientops = {
.have_delegation = nfs_have_delegation, .have_delegation = nfs_have_delegation,
.return_delegation = nfs_return_delegation, .return_delegation = nfs_return_delegation,
.init_client = nfs_init_client, .init_client = nfs_init_client,
.free_client = nfs_free_client,
}; };

View File

@ -1427,6 +1427,7 @@ struct nfs_rpc_ops {
struct nfs_client * struct nfs_client *
(*init_client) (struct nfs_client *, const struct rpc_timeout *, (*init_client) (struct nfs_client *, const struct rpc_timeout *,
const char *, rpc_authflavor_t); const char *, rpc_authflavor_t);
void (*free_client) (struct nfs_client *);
}; };
/* /*