NFS: Add a helper nfs_client_for_each_server()
[ Upstream commit 3c9e502b59fbd243cfac7cc6c875e432d285102a ] Add a helper nfs_client_for_each_server() to iterate through all the filesystems that are attached to a struct nfs_client, and apply a function to all the active ones. Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com> Stable-dep-of: ed1cc05aa1f7 ("NFSv4: Fix a nfs4_state_manager() race") Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
e2d4fc53e9
commit
f90821f667
@ -411,7 +411,9 @@ extern int __init register_nfs_fs(void);
|
|||||||
extern void __exit unregister_nfs_fs(void);
|
extern void __exit unregister_nfs_fs(void);
|
||||||
extern bool nfs_sb_active(struct super_block *sb);
|
extern bool nfs_sb_active(struct super_block *sb);
|
||||||
extern void nfs_sb_deactive(struct super_block *sb);
|
extern void nfs_sb_deactive(struct super_block *sb);
|
||||||
|
extern int nfs_client_for_each_server(struct nfs_client *clp,
|
||||||
|
int (*fn)(struct nfs_server *, void *),
|
||||||
|
void *data);
|
||||||
/* io.c */
|
/* io.c */
|
||||||
extern void nfs_start_io_read(struct inode *inode);
|
extern void nfs_start_io_read(struct inode *inode);
|
||||||
extern void nfs_end_io_read(struct inode *inode);
|
extern void nfs_end_io_read(struct inode *inode);
|
||||||
|
@ -436,6 +436,41 @@ void nfs_sb_deactive(struct super_block *sb)
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(nfs_sb_deactive);
|
EXPORT_SYMBOL_GPL(nfs_sb_deactive);
|
||||||
|
|
||||||
|
static int __nfs_list_for_each_server(struct list_head *head,
|
||||||
|
int (*fn)(struct nfs_server *, void *),
|
||||||
|
void *data)
|
||||||
|
{
|
||||||
|
struct nfs_server *server, *last = NULL;
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
rcu_read_lock();
|
||||||
|
list_for_each_entry_rcu(server, head, client_link) {
|
||||||
|
if (!nfs_sb_active(server->super))
|
||||||
|
continue;
|
||||||
|
rcu_read_unlock();
|
||||||
|
if (last)
|
||||||
|
nfs_sb_deactive(last->super);
|
||||||
|
last = server;
|
||||||
|
ret = fn(server, data);
|
||||||
|
if (ret)
|
||||||
|
goto out;
|
||||||
|
rcu_read_lock();
|
||||||
|
}
|
||||||
|
rcu_read_unlock();
|
||||||
|
out:
|
||||||
|
if (last)
|
||||||
|
nfs_sb_deactive(last->super);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int nfs_client_for_each_server(struct nfs_client *clp,
|
||||||
|
int (*fn)(struct nfs_server *, void *),
|
||||||
|
void *data)
|
||||||
|
{
|
||||||
|
return __nfs_list_for_each_server(&clp->cl_superblocks, fn, data);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(nfs_client_for_each_server);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Deliver file system statistics to userspace
|
* Deliver file system statistics to userspace
|
||||||
*/
|
*/
|
||||||
|
Loading…
Reference in New Issue
Block a user