NFSv4.1/flexfiles: Don't mark the entire deviceid as bad for file errors
authorTrond Myklebust <trond.myklebust@primarydata.com>
Sun, 30 Aug 2015 16:53:06 +0000 (09:53 -0700)
committerTrond Myklebust <trond.myklebust@primarydata.com>
Sun, 30 Aug 2015 20:10:27 +0000 (13:10 -0700)
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>
fs/nfs/flexfilelayout/flexfilelayout.c

index 4ec624cfcf8b3907a5014be05ef4b0cb2a6274b9..61ccf1122494d2ae3ac55553d881fc9a0bd28d7b 100644 (file)
@@ -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);