mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00
nfs: probe for LOCALIO when v4 client reconnects to server
Introduce nfs_local_probe_async() for the NFS client to initiate if/when it reconnects with server. For NFSv4 it is a simple matter to call nfs_local_probe_async() from nfs4_do_reclaim (during NFSv4 grace). Signed-off-by: Mike Snitzer <snitzer@kernel.org> Reviewed-by: Jeff Layton <jlayton@kernel.org> Signed-off-by: Anna Schumaker <anna.schumaker@oracle.com>
This commit is contained in:
parent
779a395189
commit
76d4cb6345
5 changed files with 20 additions and 0 deletions
|
@ -186,6 +186,7 @@ struct nfs_client *nfs_alloc_client(const struct nfs_client_initdata *cl_init)
|
|||
seqlock_init(&clp->cl_boot_lock);
|
||||
ktime_get_real_ts64(&clp->cl_nfssvc_boot);
|
||||
nfs_uuid_init(&clp->cl_uuid);
|
||||
INIT_WORK(&clp->cl_local_probe_work, nfs_local_probe_async_work);
|
||||
#endif /* CONFIG_NFS_LOCALIO */
|
||||
|
||||
clp->cl_principal = "*";
|
||||
|
|
|
@ -456,6 +456,8 @@ extern int nfs_wait_bit_killable(struct wait_bit_key *key, int mode);
|
|||
#if IS_ENABLED(CONFIG_NFS_LOCALIO)
|
||||
/* localio.c */
|
||||
extern void nfs_local_probe(struct nfs_client *);
|
||||
extern void nfs_local_probe_async(struct nfs_client *);
|
||||
extern void nfs_local_probe_async_work(struct work_struct *);
|
||||
extern struct nfsd_file *nfs_local_open_fh(struct nfs_client *,
|
||||
const struct cred *,
|
||||
struct nfs_fh *,
|
||||
|
@ -472,6 +474,7 @@ extern bool nfs_server_is_local(const struct nfs_client *clp);
|
|||
|
||||
#else /* CONFIG_NFS_LOCALIO */
|
||||
static inline void nfs_local_probe(struct nfs_client *clp) {}
|
||||
static inline void nfs_local_probe_async(struct nfs_client *clp) {}
|
||||
static inline struct nfsd_file *
|
||||
nfs_local_open_fh(struct nfs_client *clp, const struct cred *cred,
|
||||
struct nfs_fh *fh, struct nfs_file_localio *nfl,
|
||||
|
|
|
@ -193,6 +193,20 @@ void nfs_local_probe(struct nfs_client *clp)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(nfs_local_probe);
|
||||
|
||||
void nfs_local_probe_async_work(struct work_struct *work)
|
||||
{
|
||||
struct nfs_client *clp =
|
||||
container_of(work, struct nfs_client, cl_local_probe_work);
|
||||
|
||||
nfs_local_probe(clp);
|
||||
}
|
||||
|
||||
void nfs_local_probe_async(struct nfs_client *clp)
|
||||
{
|
||||
queue_work(nfsiod_workqueue, &clp->cl_local_probe_work);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(nfs_local_probe_async);
|
||||
|
||||
static inline struct nfsd_file *nfs_local_file_get(struct nfsd_file *nf)
|
||||
{
|
||||
return nfs_to->nfsd_file_get(nf);
|
||||
|
|
|
@ -1955,6 +1955,7 @@ restart:
|
|||
}
|
||||
rcu_read_unlock();
|
||||
nfs4_free_state_owners(&freeme);
|
||||
nfs_local_probe_async(clp);
|
||||
if (lost_locks)
|
||||
pr_warn("NFS: %s: lost %d locks\n",
|
||||
clp->cl_hostname, lost_locks);
|
||||
|
|
|
@ -131,6 +131,7 @@ struct nfs_client {
|
|||
struct timespec64 cl_nfssvc_boot;
|
||||
seqlock_t cl_boot_lock;
|
||||
nfs_uuid_t cl_uuid;
|
||||
struct work_struct cl_local_probe_work;
|
||||
#endif /* CONFIG_NFS_LOCALIO */
|
||||
};
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue