@ -4088,6 +4088,22 @@ static const struct rpc_call_ops nfs4_recover_lock_ops = {
. rpc_release = nfs4_lock_release ,
} ;
static void nfs4_handle_setlk_error ( struct nfs_server * server , struct nfs4_lock_state * lsp , int new_lock_owner , int error )
{
struct nfs_client * clp = server - > nfs_client ;
struct nfs4_state * state = lsp - > ls_state ;
switch ( error ) {
case - NFS4ERR_ADMIN_REVOKED :
case - NFS4ERR_BAD_STATEID :
case - NFS4ERR_EXPIRED :
if ( new_lock_owner ! = 0 | |
( lsp - > ls_flags & NFS_LOCK_INITIALIZED ) ! = 0 )
nfs4_state_mark_reclaim_nograce ( clp , state ) ;
lsp - > ls_seqid . flags & = ~ NFS_SEQID_CONFIRMED ;
} ;
}
static int _nfs4_do_setlk ( struct nfs4_state * state , int cmd , struct file_lock * fl , int recovery_type )
{
struct nfs4_lockdata * data ;
@ -4126,6 +4142,9 @@ static int _nfs4_do_setlk(struct nfs4_state *state, int cmd, struct file_lock *f
ret = nfs4_wait_for_completion_rpc_task ( task ) ;
if ( ret = = 0 ) {
ret = data - > rpc_status ;
if ( ret )
nfs4_handle_setlk_error ( data - > server , data - > lsp ,
data - > arg . new_lock_owner , ret ) ;
} else
data - > cancelled = 1 ;
rpc_put_task ( task ) ;