Merge tag 'nfsd-4.5' of git://linux-nfs.org/~bfields/linux
Pull nfsd updates from Bruce Fields: "Smaller bugfixes and cleanup, including a fix for a failures of kerberized NFSv4.1 mounts, and Scott Mayhew's work addressing ACK storms that can affect some high-availability NFS setups" * tag 'nfsd-4.5' of git://linux-nfs.org/~bfields/linux: nfsd: add new io class tracepoint nfsd: give up on CB_LAYOUTRECALLs after two lease periods nfsd: Fix nfsd leaks sunrpc module references lockd: constify nlmsvc_binding structure lockd: use to_delayed_work nfsd: use to_delayed_work Revert "svcrdma: Do not send XDR roundup bytes for a write chunk" lockd: Register callbacks on the inetaddr_chain and inet6addr_chain nfsd: Register callbacks on the inetaddr_chain and inet6addr_chain sunrpc: Add a function to close temporary transports immediately nfsd: don't base cl_cb_status on stale information nfsd4: fix gss-proxy 4.1 mounts for some AD principals nfsd: fix unlikely NULL deref in mach_creds_match nfsd: minor consolidation of mach_cred handling code nfsd: helper for dup of possibly NULL string svcrpc: move some initialization to common code nfsd: fix a warning message nfsd: constify nfsd4_callback_ops structure nfsd: recover: constify nfsd4_client_tracking_ops structures svcrdma: Do not send XDR roundup bytes for a write chunk
Esse commit está contido em:
@@ -22,7 +22,7 @@ struct nfs4_layout {
|
||||
static struct kmem_cache *nfs4_layout_cache;
|
||||
static struct kmem_cache *nfs4_layout_stateid_cache;
|
||||
|
||||
static struct nfsd4_callback_ops nfsd4_cb_layout_ops;
|
||||
static const struct nfsd4_callback_ops nfsd4_cb_layout_ops;
|
||||
static const struct lock_manager_operations nfsd4_layouts_lm_ops;
|
||||
|
||||
const struct nfsd4_layout_ops *nfsd4_layout_ops[LAYOUT_TYPE_MAX] = {
|
||||
@@ -624,24 +624,39 @@ nfsd4_cb_layout_done(struct nfsd4_callback *cb, struct rpc_task *task)
|
||||
{
|
||||
struct nfs4_layout_stateid *ls =
|
||||
container_of(cb, struct nfs4_layout_stateid, ls_recall);
|
||||
struct nfsd_net *nn;
|
||||
ktime_t now, cutoff;
|
||||
LIST_HEAD(reaplist);
|
||||
|
||||
|
||||
switch (task->tk_status) {
|
||||
case 0:
|
||||
return 1;
|
||||
case -NFS4ERR_DELAY:
|
||||
/*
|
||||
* Anything left? If not, then call it done. Note that we don't
|
||||
* take the spinlock since this is an optimization and nothing
|
||||
* should get added until the cb counter goes to zero.
|
||||
*/
|
||||
if (list_empty(&ls->ls_layouts))
|
||||
return 1;
|
||||
|
||||
/* Poll the client until it's done with the layout */
|
||||
now = ktime_get();
|
||||
nn = net_generic(ls->ls_stid.sc_client->net, nfsd_net_id);
|
||||
|
||||
/* Client gets 2 lease periods to return it */
|
||||
cutoff = ktime_add_ns(task->tk_start,
|
||||
nn->nfsd4_lease * NSEC_PER_SEC * 2);
|
||||
|
||||
if (ktime_before(now, cutoff)) {
|
||||
rpc_delay(task, HZ/100); /* 10 mili-seconds */
|
||||
return 0;
|
||||
}
|
||||
/* Fallthrough */
|
||||
case -NFS4ERR_NOMATCHING_LAYOUT:
|
||||
trace_layout_recall_done(&ls->ls_stid.sc_stateid);
|
||||
task->tk_status = 0;
|
||||
return 1;
|
||||
case -NFS4ERR_DELAY:
|
||||
/* Poll the client until it's done with the layout */
|
||||
/* FIXME: cap number of retries.
|
||||
* The pnfs standard states that we need to only expire
|
||||
* the client after at-least "lease time" .eg lease-time * 2
|
||||
* when failing to communicate a recall
|
||||
*/
|
||||
rpc_delay(task, HZ/100); /* 10 mili-seconds */
|
||||
return 0;
|
||||
default:
|
||||
/*
|
||||
* Unknown error or non-responding client, we'll need to fence.
|
||||
@@ -665,7 +680,7 @@ nfsd4_cb_layout_release(struct nfsd4_callback *cb)
|
||||
nfs4_put_stid(&ls->ls_stid);
|
||||
}
|
||||
|
||||
static struct nfsd4_callback_ops nfsd4_cb_layout_ops = {
|
||||
static const struct nfsd4_callback_ops nfsd4_cb_layout_ops = {
|
||||
.prepare = nfsd4_cb_layout_prepare,
|
||||
.done = nfsd4_cb_layout_done,
|
||||
.release = nfsd4_cb_layout_release,
|
||||
|
Referência em uma nova issue
Block a user