Skip to content

Commit 8c9f0df

Browse files
author
Trond Myklebust
committed
pNFS/flexfiles: Treat ENETUNREACH errors as fatal in containers
Propagate the NFS_MOUNT_NETUNREACH_FATAL flag to work with the pNFS flexfiles client. In these circumstances, the client needs to treat the ENETDOWN and ENETUNREACH errors as fatal, and should abandon the attempted I/O. Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com> Reviewed-by: Jeff Layton <jlayton@kernel.org> Tested-by: Jeff Layton <jlayton@kernel.org> Acked-by: Chuck Lever <chuck.lever@oracle.com>
1 parent 9827144 commit 8c9f0df

File tree

4 files changed

+29
-2
lines changed

4 files changed

+29
-2
lines changed

fs/nfs/flexfilelayout/flexfilelayout.c

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1154,10 +1154,14 @@ static int ff_layout_async_handle_error_v4(struct rpc_task *task,
11541154
rpc_wake_up(&tbl->slot_tbl_waitq);
11551155
goto reset;
11561156
/* RPC connection errors */
1157+
case -ENETDOWN:
1158+
case -ENETUNREACH:
1159+
if (test_bit(NFS_CS_NETUNREACH_FATAL, &clp->cl_flags))
1160+
return -NFS4ERR_FATAL_IOERROR;
1161+
fallthrough;
11571162
case -ECONNREFUSED:
11581163
case -EHOSTDOWN:
11591164
case -EHOSTUNREACH:
1160-
case -ENETUNREACH:
11611165
case -EIO:
11621166
case -ETIMEDOUT:
11631167
case -EPIPE:
@@ -1183,6 +1187,7 @@ static int ff_layout_async_handle_error_v4(struct rpc_task *task,
11831187

11841188
/* Retry all errors through either pNFS or MDS except for -EJUKEBOX */
11851189
static int ff_layout_async_handle_error_v3(struct rpc_task *task,
1190+
struct nfs_client *clp,
11861191
struct pnfs_layout_segment *lseg,
11871192
u32 idx)
11881193
{
@@ -1200,6 +1205,11 @@ static int ff_layout_async_handle_error_v3(struct rpc_task *task,
12001205
case -EJUKEBOX:
12011206
nfs_inc_stats(lseg->pls_layout->plh_inode, NFSIOS_DELAY);
12021207
goto out_retry;
1208+
case -ENETDOWN:
1209+
case -ENETUNREACH:
1210+
if (test_bit(NFS_CS_NETUNREACH_FATAL, &clp->cl_flags))
1211+
return -NFS4ERR_FATAL_IOERROR;
1212+
fallthrough;
12031213
default:
12041214
dprintk("%s DS connection error %d\n", __func__,
12051215
task->tk_status);
@@ -1234,7 +1244,7 @@ static int ff_layout_async_handle_error(struct rpc_task *task,
12341244

12351245
switch (vers) {
12361246
case 3:
1237-
return ff_layout_async_handle_error_v3(task, lseg, idx);
1247+
return ff_layout_async_handle_error_v3(task, clp, lseg, idx);
12381248
case 4:
12391249
return ff_layout_async_handle_error_v4(task, state, clp,
12401250
lseg, idx);
@@ -1337,6 +1347,9 @@ static int ff_layout_read_done_cb(struct rpc_task *task,
13371347
return task->tk_status;
13381348
case -EAGAIN:
13391349
goto out_eagain;
1350+
case -NFS4ERR_FATAL_IOERROR:
1351+
task->tk_status = -EIO;
1352+
return 0;
13401353
}
13411354

13421355
return 0;
@@ -1507,6 +1520,9 @@ static int ff_layout_write_done_cb(struct rpc_task *task,
15071520
return task->tk_status;
15081521
case -EAGAIN:
15091522
return -EAGAIN;
1523+
case -NFS4ERR_FATAL_IOERROR:
1524+
task->tk_status = -EIO;
1525+
return 0;
15101526
}
15111527

15121528
if (hdr->res.verf->committed == NFS_FILE_SYNC ||
@@ -1551,6 +1567,9 @@ static int ff_layout_commit_done_cb(struct rpc_task *task,
15511567
case -EAGAIN:
15521568
rpc_restart_call_prepare(task);
15531569
return -EAGAIN;
1570+
case -NFS4ERR_FATAL_IOERROR:
1571+
task->tk_status = -EIO;
1572+
return 0;
15541573
}
15551574

15561575
ff_layout_set_layoutcommit(data->inode, data->lseg, data->lwb);

fs/nfs/nfs3client.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,8 @@ struct nfs_client *nfs3_set_ds_client(struct nfs_server *mds_srv,
120120

121121
if (mds_srv->flags & NFS_MOUNT_NORESVPORT)
122122
__set_bit(NFS_CS_NORESVPORT, &cl_init.init_flags);
123+
if (test_bit(NFS_CS_NETUNREACH_FATAL, &mds_clp->cl_flags))
124+
__set_bit(NFS_CS_NETUNREACH_FATAL, &cl_init.init_flags);
123125

124126
__set_bit(NFS_CS_DS, &cl_init.init_flags);
125127

fs/nfs/nfs4client.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -939,6 +939,9 @@ static int nfs4_set_client(struct nfs_server *server,
939939
__set_bit(NFS_CS_TSM_POSSIBLE, &cl_init.init_flags);
940940
server->port = rpc_get_port((struct sockaddr *)addr);
941941

942+
if (server->flags & NFS_MOUNT_NETUNREACH_FATAL)
943+
__set_bit(NFS_CS_NETUNREACH_FATAL, &cl_init.init_flags);
944+
942945
/* Allocate or find a client reference we can use */
943946
clp = nfs_get_client(&cl_init);
944947
if (IS_ERR(clp))
@@ -1013,6 +1016,8 @@ struct nfs_client *nfs4_set_ds_client(struct nfs_server *mds_srv,
10131016

10141017
if (mds_srv->flags & NFS_MOUNT_NORESVPORT)
10151018
__set_bit(NFS_CS_NORESVPORT, &cl_init.init_flags);
1019+
if (test_bit(NFS_CS_NETUNREACH_FATAL, &mds_clp->cl_flags))
1020+
__set_bit(NFS_CS_NETUNREACH_FATAL, &cl_init.init_flags);
10161021

10171022
__set_bit(NFS_CS_PNFS, &cl_init.init_flags);
10181023
cl_init.max_connect = NFS_MAX_TRANSPORTS;

include/linux/nfs4.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -300,6 +300,7 @@ enum nfsstat4 {
300300
/* error codes for internal client use */
301301
#define NFS4ERR_RESET_TO_MDS 12001
302302
#define NFS4ERR_RESET_TO_PNFS 12002
303+
#define NFS4ERR_FATAL_IOERROR 12003
303304

304305
static inline bool seqid_mutating_err(u32 err)
305306
{

0 commit comments

Comments
 (0)