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: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:
parent
c36dcfe1f7
commit
298fc3558b
|
@ -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,
|
||||||
}
|
}
|
||||||
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)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue