mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-12 13:55:32 +00:00
NFSv4.1/flexfiles: Don't mark the entire deviceid as bad for file errors
If the file was fenced and/or has been deleted on the DS, then we want to retry pNFS after a layoutreturn with error report. If the server cannot fix the problem, then we rely on it to tell us so in the response to the LAYOUTGET. Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
This commit is contained in:
parent
099392048c
commit
90816d1dda
1 changed files with 16 additions and 8 deletions
|
@ -1075,18 +1075,26 @@ static int ff_layout_async_handle_error_v3(struct rpc_task *task,
|
|||
if (task->tk_status >= 0)
|
||||
return 0;
|
||||
|
||||
if (task->tk_status != -EJUKEBOX) {
|
||||
switch (task->tk_status) {
|
||||
/* File access problems. Don't mark the device as unavailable */
|
||||
case -EACCES:
|
||||
case -ESTALE:
|
||||
case -EISDIR:
|
||||
case -EBADHANDLE:
|
||||
case -ELOOP:
|
||||
case -ENOSPC:
|
||||
break;
|
||||
case -EJUKEBOX:
|
||||
nfs_inc_stats(lseg->pls_layout->plh_inode, NFSIOS_DELAY);
|
||||
goto out_retry;
|
||||
default:
|
||||
dprintk("%s DS connection error %d\n", __func__,
|
||||
task->tk_status);
|
||||
nfs4_mark_deviceid_unavailable(devid);
|
||||
if (ff_layout_has_available_ds(lseg))
|
||||
return -NFS4ERR_RESET_TO_PNFS;
|
||||
else
|
||||
return -NFS4ERR_RESET_TO_MDS;
|
||||
}
|
||||
|
||||
if (task->tk_status == -EJUKEBOX)
|
||||
nfs_inc_stats(lseg->pls_layout->plh_inode, NFSIOS_DELAY);
|
||||
/* FIXME: Need to prevent infinite looping here. */
|
||||
return -NFS4ERR_RESET_TO_PNFS;
|
||||
out_retry:
|
||||
task->tk_status = 0;
|
||||
rpc_restart_call(task);
|
||||
rpc_delay(task, NFS_JUKEBOX_RETRY_TIME);
|
||||
|
|
Loading…
Reference in a new issue