Skip to content

Commit

Permalink
NFS: Create a free_client rpc_op
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Bryan Schumaker authored and Trond Myklebust committed Jun 29, 2012
1 parent 57ec14c commit cdb7ece
Show file tree
Hide file tree
Showing 7 changed files with 16 additions and 9 deletions.
18 changes: 9 additions & 9 deletions fs/nfs/client.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down Expand Up @@ -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)
{
}
Expand All @@ -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 */
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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) {
Expand Down
1 change: 1 addition & 0 deletions fs/nfs/internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 *,
Expand Down
1 change: 1 addition & 0 deletions fs/nfs/nfs3proc.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
};
2 changes: 2 additions & 0 deletions fs/nfs/nfs4_fs.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 *);
Expand Down
1 change: 1 addition & 0 deletions fs/nfs/nfs4proc.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 = {
Expand Down
1 change: 1 addition & 0 deletions fs/nfs/proc.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
};
1 change: 1 addition & 0 deletions include/linux/nfs_xdr.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 *);
};

/*
Expand Down

0 comments on commit cdb7ece

Please sign in to comment.