Merge branch 'nfs-for-2.6.37' of git://git.linux-nfs.org/projects/trondmy/nfs-2.6
* 'nfs-for-2.6.37' of git://git.linux-nfs.org/projects/trondmy/nfs-2.6: (67 commits) SUNRPC: Cleanup duplicate assignment in rpcauth_refreshcred nfs: fix unchecked value Ask for time_delta during fsinfo probe Revalidate caches on lock SUNRPC: After calling xprt_release(), we must restart from call_reserve NFSv4: Fix up the 'dircount' hint in encode_readdir NFSv4: Clean up nfs4_decode_dirent NFSv4: nfs4_decode_dirent must clear entry->fattr->valid NFSv4: Fix a regression in decode_getfattr NFSv4: Fix up decode_attr_filehandle() to handle the case of empty fh pointer NFS: Ensure we check all allocation return values in new readdir code NFS: Readdir plus in v4 NFS: introduce generic decode_getattr function NFS: check xdr_decode for errors NFS: nfs_readdir_filler catch all errors NFS: readdir with vmapped pages NFS: remove page size checking code NFS: decode_dirent should use an xdr_stream SUNRPC: Add a helper function xdr_inline_peek NFS: remove readdir plus limit ...
This commit is contained in:
@@ -46,6 +46,7 @@
|
||||
#include <linux/kthread.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/random.h>
|
||||
#include <linux/ratelimit.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/bitops.h>
|
||||
|
||||
@@ -1063,6 +1064,14 @@ restart:
|
||||
/* Mark the file as being 'closed' */
|
||||
state->state = 0;
|
||||
break;
|
||||
case -EKEYEXPIRED:
|
||||
/*
|
||||
* User RPCSEC_GSS context has expired.
|
||||
* We cannot recover this stateid now, so
|
||||
* skip it and allow recovery thread to
|
||||
* proceed.
|
||||
*/
|
||||
break;
|
||||
case -NFS4ERR_ADMIN_REVOKED:
|
||||
case -NFS4ERR_STALE_STATEID:
|
||||
case -NFS4ERR_BAD_STATEID:
|
||||
@@ -1138,16 +1147,14 @@ static void nfs4_reclaim_complete(struct nfs_client *clp,
|
||||
(void)ops->reclaim_complete(clp);
|
||||
}
|
||||
|
||||
static void nfs4_state_end_reclaim_reboot(struct nfs_client *clp)
|
||||
static int nfs4_state_clear_reclaim_reboot(struct nfs_client *clp)
|
||||
{
|
||||
struct nfs4_state_owner *sp;
|
||||
struct rb_node *pos;
|
||||
struct nfs4_state *state;
|
||||
|
||||
if (!test_and_clear_bit(NFS4CLNT_RECLAIM_REBOOT, &clp->cl_state))
|
||||
return;
|
||||
|
||||
nfs4_reclaim_complete(clp, clp->cl_mvops->reboot_recovery_ops);
|
||||
return 0;
|
||||
|
||||
for (pos = rb_first(&clp->cl_state_owners); pos != NULL; pos = rb_next(pos)) {
|
||||
sp = rb_entry(pos, struct nfs4_state_owner, so_client_node);
|
||||
@@ -1161,6 +1168,14 @@ static void nfs4_state_end_reclaim_reboot(struct nfs_client *clp)
|
||||
}
|
||||
|
||||
nfs_delegation_reap_unclaimed(clp);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void nfs4_state_end_reclaim_reboot(struct nfs_client *clp)
|
||||
{
|
||||
if (!nfs4_state_clear_reclaim_reboot(clp))
|
||||
return;
|
||||
nfs4_reclaim_complete(clp, clp->cl_mvops->reboot_recovery_ops);
|
||||
}
|
||||
|
||||
static void nfs_delegation_clear_all(struct nfs_client *clp)
|
||||
@@ -1175,6 +1190,14 @@ static void nfs4_state_start_reclaim_nograce(struct nfs_client *clp)
|
||||
nfs4_state_mark_reclaim_helper(clp, nfs4_state_mark_reclaim_nograce);
|
||||
}
|
||||
|
||||
static void nfs4_warn_keyexpired(const char *s)
|
||||
{
|
||||
printk_ratelimited(KERN_WARNING "Error: state manager"
|
||||
" encountered RPCSEC_GSS session"
|
||||
" expired against NFSv4 server %s.\n",
|
||||
s);
|
||||
}
|
||||
|
||||
static int nfs4_recovery_handle_error(struct nfs_client *clp, int error)
|
||||
{
|
||||
switch (error) {
|
||||
@@ -1187,7 +1210,7 @@ static int nfs4_recovery_handle_error(struct nfs_client *clp, int error)
|
||||
case -NFS4ERR_STALE_CLIENTID:
|
||||
case -NFS4ERR_LEASE_MOVED:
|
||||
set_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state);
|
||||
nfs4_state_end_reclaim_reboot(clp);
|
||||
nfs4_state_clear_reclaim_reboot(clp);
|
||||
nfs4_state_start_reclaim_reboot(clp);
|
||||
break;
|
||||
case -NFS4ERR_EXPIRED:
|
||||
@@ -1204,6 +1227,10 @@ static int nfs4_recovery_handle_error(struct nfs_client *clp, int error)
|
||||
set_bit(NFS4CLNT_SESSION_RESET, &clp->cl_state);
|
||||
/* Zero session reset errors */
|
||||
return 0;
|
||||
case -EKEYEXPIRED:
|
||||
/* Nothing we can do */
|
||||
nfs4_warn_keyexpired(clp->cl_hostname);
|
||||
return 0;
|
||||
}
|
||||
return error;
|
||||
}
|
||||
@@ -1414,9 +1441,10 @@ static void nfs4_set_lease_expired(struct nfs_client *clp, int status)
|
||||
case -NFS4ERR_DELAY:
|
||||
case -NFS4ERR_CLID_INUSE:
|
||||
case -EAGAIN:
|
||||
case -EKEYEXPIRED:
|
||||
break;
|
||||
|
||||
case -EKEYEXPIRED:
|
||||
nfs4_warn_keyexpired(clp->cl_hostname);
|
||||
case -NFS4ERR_NOT_SAME: /* FixMe: implement recovery
|
||||
* in nfs4_exchange_id */
|
||||
default:
|
||||
|
Reference in New Issue
Block a user