Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

pNFS/flexfiles: Record resend attempts on I/O failure

If the attempt to do pNFS fails, then record what action we
take to recover (resend, reset to pnfs or reset to mds).

Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>

authored by

Trond Myklebust and committed by
Anna Schumaker
0722dc9f 118b6292

+14 -8
+3 -3
fs/nfs/flexfilelayout/flexfilelayout.c
··· 1321 1321 int new_idx = hdr->pgio_mirror_idx; 1322 1322 int err; 1323 1323 1324 - trace_nfs4_pnfs_read(hdr, task->tk_status); 1325 1324 if (task->tk_status < 0) 1326 1325 ff_layout_io_track_ds_error(hdr->lseg, hdr->pgio_mirror_idx, 1327 1326 hdr->args.offset, hdr->args.count, ··· 1330 1331 hdr->ds_clp, hdr->lseg, 1331 1332 hdr->pgio_mirror_idx); 1332 1333 1334 + trace_nfs4_pnfs_read(hdr, err); 1333 1335 clear_bit(NFS_IOHDR_RESEND_PNFS, &hdr->flags); 1334 1336 clear_bit(NFS_IOHDR_RESEND_MDS, &hdr->flags); 1335 1337 switch (err) { ··· 1494 1494 loff_t end_offs = 0; 1495 1495 int err; 1496 1496 1497 - trace_nfs4_pnfs_write(hdr, task->tk_status); 1498 1497 if (task->tk_status < 0) 1499 1498 ff_layout_io_track_ds_error(hdr->lseg, hdr->pgio_mirror_idx, 1500 1499 hdr->args.offset, hdr->args.count, ··· 1503 1504 hdr->ds_clp, hdr->lseg, 1504 1505 hdr->pgio_mirror_idx); 1505 1506 1507 + trace_nfs4_pnfs_write(hdr, err); 1506 1508 clear_bit(NFS_IOHDR_RESEND_PNFS, &hdr->flags); 1507 1509 clear_bit(NFS_IOHDR_RESEND_MDS, &hdr->flags); 1508 1510 switch (err) { ··· 1537 1537 { 1538 1538 int err; 1539 1539 1540 - trace_nfs4_pnfs_commit_ds(data, task->tk_status); 1541 1540 if (task->tk_status < 0) 1542 1541 ff_layout_io_track_ds_error(data->lseg, data->ds_commit_index, 1543 1542 data->args.offset, data->args.count, ··· 1545 1546 err = ff_layout_async_handle_error(task, NULL, data->ds_clp, 1546 1547 data->lseg, data->ds_commit_index); 1547 1548 1549 + trace_nfs4_pnfs_commit_ds(data, err); 1548 1550 switch (err) { 1549 1551 case -NFS4ERR_RESET_TO_PNFS: 1550 1552 pnfs_generic_prepare_to_resend_writes(data);
+7 -1
fs/nfs/nfs4trace.h
··· 155 155 TRACE_DEFINE_ENUM(NFS4ERR_WRONG_TYPE); 156 156 TRACE_DEFINE_ENUM(NFS4ERR_XDEV); 157 157 158 + TRACE_DEFINE_ENUM(NFS4ERR_RESET_TO_MDS); 159 + TRACE_DEFINE_ENUM(NFS4ERR_RESET_TO_PNFS); 160 + 158 161 #define show_nfsv4_errors(error) \ 159 162 __print_symbolic(error, \ 160 163 { NFS4_OK, "OK" }, \ ··· 308 305 { NFS4ERR_WRONGSEC, "WRONGSEC" }, \ 309 306 { NFS4ERR_WRONG_CRED, "WRONG_CRED" }, \ 310 307 { NFS4ERR_WRONG_TYPE, "WRONG_TYPE" }, \ 311 - { NFS4ERR_XDEV, "XDEV" }) 308 + { NFS4ERR_XDEV, "XDEV" }, \ 309 + /* ***** Internal to Linux NFS client ***** */ \ 310 + { NFS4ERR_RESET_TO_MDS, "RESET_TO_MDS" }, \ 311 + { NFS4ERR_RESET_TO_PNFS, "RESET_TO_PNFS" }) 312 312 313 313 #define show_open_flags(flags) \ 314 314 __print_flags(flags, "|", \
+4 -4
fs/nfs/pnfs.h
··· 79 79 PNFS_TRY_AGAIN = 2, 80 80 }; 81 81 82 + /* error codes for internal use */ 83 + #define NFS4ERR_RESET_TO_MDS 12001 84 + #define NFS4ERR_RESET_TO_PNFS 12002 85 + 82 86 #ifdef CONFIG_NFS_V4_1 83 87 84 88 #define LAYOUT_NFSV4_1_MODULE_PREFIX "nfs-layouttype4" ··· 94 90 #define NFS4_DEF_DS_TIMEO 600 /* in tenths of a second */ 95 91 #define NFS4_DEF_DS_RETRANS 5 96 92 #define PNFS_DEVICE_RETRY_TIMEOUT (120*HZ) 97 - 98 - /* error codes for internal use */ 99 - #define NFS4ERR_RESET_TO_MDS 12001 100 - #define NFS4ERR_RESET_TO_PNFS 12002 101 93 102 94 enum { 103 95 NFS_LAYOUT_RO_FAILED = 0, /* get ro layout failed stop trying */