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:
parent
57ec14c55d
commit
cdb7ecedec
|
@ -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) {
|
||||||
|
|
|
@ -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 *,
|
||||||
|
|
|
@ -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,
|
||||||
};
|
};
|
||||||
|
|
|
@ -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 *);
|
||||||
|
|
|
@ -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 = {
|
||||||
|
|
|
@ -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,
|
||||||
};
|
};
|
||||||
|
|
|
@ -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 *);
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in New Issue