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

pNFS/flexfiles: Add tracing for layout errors

Trace layout errors for pNFS/flexfiles on read/write/commit operations.

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
088f3e68 7bdd297e

+132 -9
+19 -9
fs/nfs/flexfilelayout/flexfilelayout.c
··· 1266 1266 1267 1267 static void ff_layout_io_track_ds_error(struct pnfs_layout_segment *lseg, 1268 1268 int idx, u64 offset, u64 length, 1269 - u32 status, int opnum, int error) 1269 + u32 *op_status, int opnum, int error) 1270 1270 { 1271 1271 struct nfs4_ff_layout_mirror *mirror; 1272 + u32 status = *op_status; 1272 1273 int err; 1273 1274 1274 1275 if (status == 0) { ··· 1287 1286 case -ENOBUFS: 1288 1287 case -EPIPE: 1289 1288 case -EPERM: 1290 - status = NFS4ERR_NXIO; 1289 + *op_status = status = NFS4ERR_NXIO; 1291 1290 break; 1292 1291 case -EACCES: 1293 - status = NFS4ERR_ACCESS; 1292 + *op_status = status = NFS4ERR_ACCESS; 1294 1293 break; 1295 1294 default: 1296 1295 return; ··· 1322 1321 int new_idx = hdr->pgio_mirror_idx; 1323 1322 int err; 1324 1323 1325 - if (task->tk_status < 0) 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, 1328 - hdr->res.op_status, OP_READ, 1327 + &hdr->res.op_status, OP_READ, 1329 1328 task->tk_status); 1329 + trace_ff_layout_read_error(hdr); 1330 + } 1331 + 1330 1332 err = ff_layout_async_handle_error(task, hdr->args.context->state, 1331 1333 hdr->ds_clp, hdr->lseg, 1332 1334 hdr->pgio_mirror_idx); ··· 1498 1494 loff_t end_offs = 0; 1499 1495 int err; 1500 1496 1501 - if (task->tk_status < 0) 1497 + if (task->tk_status < 0) { 1502 1498 ff_layout_io_track_ds_error(hdr->lseg, hdr->pgio_mirror_idx, 1503 1499 hdr->args.offset, hdr->args.count, 1504 - hdr->res.op_status, OP_WRITE, 1500 + &hdr->res.op_status, OP_WRITE, 1505 1501 task->tk_status); 1502 + trace_ff_layout_write_error(hdr); 1503 + } 1504 + 1506 1505 err = ff_layout_async_handle_error(task, hdr->args.context->state, 1507 1506 hdr->ds_clp, hdr->lseg, 1508 1507 hdr->pgio_mirror_idx); ··· 1544 1537 { 1545 1538 int err; 1546 1539 1547 - if (task->tk_status < 0) 1540 + if (task->tk_status < 0) { 1548 1541 ff_layout_io_track_ds_error(data->lseg, data->ds_commit_index, 1549 1542 data->args.offset, data->args.count, 1550 - data->res.op_status, OP_COMMIT, 1543 + &data->res.op_status, OP_COMMIT, 1551 1544 task->tk_status); 1545 + trace_ff_layout_commit_error(data); 1546 + } 1547 + 1552 1548 err = ff_layout_async_handle_error(task, NULL, data->ds_clp, 1553 1549 data->lseg, data->ds_commit_index); 1554 1550
+4
fs/nfs/nfs4trace.c
··· 24 24 EXPORT_TRACEPOINT_SYMBOL_GPL(pnfs_mds_fallback_write_done); 25 25 EXPORT_TRACEPOINT_SYMBOL_GPL(pnfs_mds_fallback_read_pagelist); 26 26 EXPORT_TRACEPOINT_SYMBOL_GPL(pnfs_mds_fallback_write_pagelist); 27 + 28 + EXPORT_TRACEPOINT_SYMBOL_GPL(ff_layout_read_error); 29 + EXPORT_TRACEPOINT_SYMBOL_GPL(ff_layout_write_error); 30 + EXPORT_TRACEPOINT_SYMBOL_GPL(ff_layout_commit_error); 27 31 #endif
+109
fs/nfs/nfs4trace.h
··· 2152 2152 DEFINE_PNFS_LAYOUT_EVENT(pnfs_mds_fallback_read_pagelist); 2153 2153 DEFINE_PNFS_LAYOUT_EVENT(pnfs_mds_fallback_write_pagelist); 2154 2154 2155 + DECLARE_EVENT_CLASS(nfs4_flexfiles_io_event, 2156 + TP_PROTO( 2157 + const struct nfs_pgio_header *hdr 2158 + ), 2159 + 2160 + TP_ARGS(hdr), 2161 + 2162 + TP_STRUCT__entry( 2163 + __field(unsigned long, error) 2164 + __field(dev_t, dev) 2165 + __field(u32, fhandle) 2166 + __field(u64, fileid) 2167 + __field(loff_t, offset) 2168 + __field(u32, count) 2169 + __field(int, stateid_seq) 2170 + __field(u32, stateid_hash) 2171 + __string(dstaddr, hdr->ds_clp ? 2172 + rpc_peeraddr2str(hdr->ds_clp->cl_rpcclient, 2173 + RPC_DISPLAY_ADDR) : "unknown") 2174 + ), 2175 + 2176 + TP_fast_assign( 2177 + const struct inode *inode = hdr->inode; 2178 + 2179 + __entry->error = hdr->res.op_status; 2180 + __entry->fhandle = nfs_fhandle_hash(hdr->args.fh); 2181 + __entry->fileid = NFS_FILEID(inode); 2182 + __entry->dev = inode->i_sb->s_dev; 2183 + __entry->offset = hdr->args.offset; 2184 + __entry->count = hdr->args.count; 2185 + __entry->stateid_seq = 2186 + be32_to_cpu(hdr->args.stateid.seqid); 2187 + __entry->stateid_hash = 2188 + nfs_stateid_hash(&hdr->args.stateid); 2189 + __assign_str(dstaddr, hdr->ds_clp ? 2190 + rpc_peeraddr2str(hdr->ds_clp->cl_rpcclient, 2191 + RPC_DISPLAY_ADDR) : "unknown"); 2192 + ), 2193 + 2194 + TP_printk( 2195 + "error=%ld (%s) fileid=%02x:%02x:%llu fhandle=0x%08x " 2196 + "offset=%llu count=%u stateid=%d:0x%08x dstaddr=%s", 2197 + -__entry->error, 2198 + show_nfsv4_errors(__entry->error), 2199 + MAJOR(__entry->dev), MINOR(__entry->dev), 2200 + (unsigned long long)__entry->fileid, 2201 + __entry->fhandle, 2202 + __entry->offset, __entry->count, 2203 + __entry->stateid_seq, __entry->stateid_hash, 2204 + __get_str(dstaddr) 2205 + ) 2206 + ); 2207 + 2208 + #define DEFINE_NFS4_FLEXFILES_IO_EVENT(name) \ 2209 + DEFINE_EVENT(nfs4_flexfiles_io_event, name, \ 2210 + TP_PROTO( \ 2211 + const struct nfs_pgio_header *hdr \ 2212 + ), \ 2213 + TP_ARGS(hdr)) 2214 + DEFINE_NFS4_FLEXFILES_IO_EVENT(ff_layout_read_error); 2215 + DEFINE_NFS4_FLEXFILES_IO_EVENT(ff_layout_write_error); 2216 + 2217 + TRACE_EVENT(ff_layout_commit_error, 2218 + TP_PROTO( 2219 + const struct nfs_commit_data *data 2220 + ), 2221 + 2222 + TP_ARGS(data), 2223 + 2224 + TP_STRUCT__entry( 2225 + __field(unsigned long, error) 2226 + __field(dev_t, dev) 2227 + __field(u32, fhandle) 2228 + __field(u64, fileid) 2229 + __field(loff_t, offset) 2230 + __field(u32, count) 2231 + __string(dstaddr, data->ds_clp ? 2232 + rpc_peeraddr2str(data->ds_clp->cl_rpcclient, 2233 + RPC_DISPLAY_ADDR) : "unknown") 2234 + ), 2235 + 2236 + TP_fast_assign( 2237 + const struct inode *inode = data->inode; 2238 + 2239 + __entry->error = data->res.op_status; 2240 + __entry->fhandle = nfs_fhandle_hash(data->args.fh); 2241 + __entry->fileid = NFS_FILEID(inode); 2242 + __entry->dev = inode->i_sb->s_dev; 2243 + __entry->offset = data->args.offset; 2244 + __entry->count = data->args.count; 2245 + __assign_str(dstaddr, data->ds_clp ? 2246 + rpc_peeraddr2str(data->ds_clp->cl_rpcclient, 2247 + RPC_DISPLAY_ADDR) : "unknown"); 2248 + ), 2249 + 2250 + TP_printk( 2251 + "error=%ld (%s) fileid=%02x:%02x:%llu fhandle=0x%08x " 2252 + "offset=%llu count=%u dstaddr=%s", 2253 + -__entry->error, 2254 + show_nfsv4_errors(__entry->error), 2255 + MAJOR(__entry->dev), MINOR(__entry->dev), 2256 + (unsigned long long)__entry->fileid, 2257 + __entry->fhandle, 2258 + __entry->offset, __entry->count, 2259 + __get_str(dstaddr) 2260 + ) 2261 + ); 2262 + 2263 + 2155 2264 #endif /* CONFIG_NFS_V4_1 */ 2156 2265 2157 2266 #endif /* _TRACE_NFS4_H */