Commit 298fc355 authored by Trond Myklebust's avatar Trond Myklebust

SUNRPC: Add a helper to allow sharing of rpc_pipefs directory objects

Add support for looking up existing objects and creating new ones if there
is no match.
Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
parent c36dcfe1
...@@ -106,6 +106,12 @@ extern int rpc_add_pipe_dir_object(struct net *net, ...@@ -106,6 +106,12 @@ extern int rpc_add_pipe_dir_object(struct net *net,
extern void rpc_remove_pipe_dir_object(struct net *net, extern void rpc_remove_pipe_dir_object(struct net *net,
struct rpc_pipe_dir_head *pdh, struct rpc_pipe_dir_head *pdh,
struct rpc_pipe_dir_object *pdo); struct rpc_pipe_dir_object *pdo);
extern struct rpc_pipe_dir_object *rpc_find_or_alloc_pipe_dir_object(
struct net *net,
struct rpc_pipe_dir_head *pdh,
int (*match)(struct rpc_pipe_dir_object *, void *),
struct rpc_pipe_dir_object *(*alloc)(void *),
void *data);
struct cache_detail; struct cache_detail;
extern struct dentry *rpc_create_cache_dir(struct dentry *, extern struct dentry *rpc_create_cache_dir(struct dentry *,
......
...@@ -982,6 +982,41 @@ rpc_remove_pipe_dir_object(struct net *net, ...@@ -982,6 +982,41 @@ rpc_remove_pipe_dir_object(struct net *net,
} }
EXPORT_SYMBOL_GPL(rpc_remove_pipe_dir_object); EXPORT_SYMBOL_GPL(rpc_remove_pipe_dir_object);
/**
* rpc_find_or_alloc_pipe_dir_object
* @net: pointer to struct net
* @pdh: pointer to struct rpc_pipe_dir_head
* @match: match struct rpc_pipe_dir_object to data
* @alloc: allocate a new struct rpc_pipe_dir_object
* @data: user defined data for match() and alloc()
*
*/
struct rpc_pipe_dir_object *
rpc_find_or_alloc_pipe_dir_object(struct net *net,
struct rpc_pipe_dir_head *pdh,
int (*match)(struct rpc_pipe_dir_object *, void *),
struct rpc_pipe_dir_object *(*alloc)(void *),
void *data)
{
struct sunrpc_net *sn = net_generic(net, sunrpc_net_id);
struct rpc_pipe_dir_object *pdo;
mutex_lock(&sn->pipefs_sb_lock);
list_for_each_entry(pdo, &pdh->pdh_entries, pdo_head) {
if (!match(pdo, data))
continue;
goto out;
}
pdo = alloc(data);
if (!pdo)
goto out;
rpc_add_pipe_dir_object_locked(net, pdh, pdo);
out:
mutex_unlock(&sn->pipefs_sb_lock);
return pdo;
}
EXPORT_SYMBOL_GPL(rpc_find_or_alloc_pipe_dir_object);
static void static void
rpc_create_pipe_dir_objects(struct rpc_pipe_dir_head *pdh) rpc_create_pipe_dir_objects(struct rpc_pipe_dir_head *pdh)
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment