Skip to content

Commit 0246f3e

Browse files
committed
netfs: Add a tracepoint to log failures that would be otherwise unseen
Add a tracepoint to log internal failures (such as cache errors) that we don't otherwise want to pass back to the netfs. Signed-off-by: David Howells <[email protected]> Tested-by: Jeff Layton <[email protected]> Tested-by: Dave Wysochanski <[email protected]> Tested-By: Marc Dionne <[email protected]> cc: Matthew Wilcox <[email protected]> cc: [email protected] cc: [email protected] cc: [email protected] cc: [email protected] cc: [email protected] cc: [email protected] cc: [email protected] cc: [email protected] Link: https://lore.kernel.org/r/161781048813.463527.1557000804674707986.stgit@warthog.procyon.org.uk/ Link: https://lore.kernel.org/r/161789082749.6155.15498680577213140870.stgit@warthog.procyon.org.uk/ # v6
1 parent 726218f commit 0246f3e

File tree

2 files changed

+70
-2
lines changed

2 files changed

+70
-2
lines changed

fs/netfs/read_helper.c

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,8 @@ static void netfs_rreq_copy_terminated(void *priv, ssize_t transferred_or_error,
271271

272272
if (IS_ERR_VALUE(transferred_or_error)) {
273273
netfs_stat(&netfs_n_rh_write_failed);
274+
trace_netfs_failure(rreq, subreq, transferred_or_error,
275+
netfs_fail_copy_to_cache);
274276
} else {
275277
netfs_stat(&netfs_n_rh_write_done);
276278
}
@@ -323,6 +325,7 @@ static void netfs_rreq_do_write_to_cache(struct netfs_read_request *rreq)
323325
ret = cres->ops->prepare_write(cres, &subreq->start, &subreq->len,
324326
rreq->i_size);
325327
if (ret < 0) {
328+
trace_netfs_failure(rreq, subreq, ret, netfs_fail_prepare_write);
326329
trace_netfs_sreq(subreq, netfs_sreq_trace_write_skip);
327330
continue;
328331
}
@@ -627,6 +630,8 @@ void netfs_subreq_terminated(struct netfs_read_subrequest *subreq,
627630

628631
if (IS_ERR_VALUE(transferred_or_error)) {
629632
subreq->error = transferred_or_error;
633+
trace_netfs_failure(rreq, subreq, transferred_or_error,
634+
netfs_fail_read);
630635
goto failed;
631636
}
632637

@@ -996,8 +1001,10 @@ int netfs_readpage(struct file *file,
9961001
} while (test_bit(NETFS_RREQ_IN_PROGRESS, &rreq->flags));
9971002

9981003
ret = rreq->error;
999-
if (ret == 0 && rreq->submitted < rreq->len)
1004+
if (ret == 0 && rreq->submitted < rreq->len) {
1005+
trace_netfs_failure(rreq, NULL, ret, netfs_fail_short_readpage);
10001006
ret = -EIO;
1007+
}
10011008
out:
10021009
netfs_put_read_request(rreq, false);
10031010
return ret;
@@ -1069,6 +1076,7 @@ int netfs_write_begin(struct file *file, struct address_space *mapping,
10691076
/* Allow the netfs (eg. ceph) to flush conflicts. */
10701077
ret = ops->check_write_begin(file, pos, len, page, _fsdata);
10711078
if (ret < 0) {
1079+
trace_netfs_failure(NULL, NULL, ret, netfs_fail_check_write_begin);
10721080
if (ret == -EAGAIN)
10731081
goto retry;
10741082
goto error;
@@ -1145,8 +1153,10 @@ int netfs_write_begin(struct file *file, struct address_space *mapping,
11451153
}
11461154

11471155
ret = rreq->error;
1148-
if (ret == 0 && rreq->submitted < rreq->len)
1156+
if (ret == 0 && rreq->submitted < rreq->len) {
1157+
trace_netfs_failure(rreq, NULL, ret, netfs_fail_short_write_begin);
11491158
ret = -EIO;
1159+
}
11501160
netfs_put_read_request(rreq, false);
11511161
if (ret < 0)
11521162
goto error;

include/trace/events/netfs.h

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,15 @@ enum netfs_sreq_trace {
4747
netfs_sreq_trace_write_term,
4848
};
4949

50+
enum netfs_failure {
51+
netfs_fail_check_write_begin,
52+
netfs_fail_copy_to_cache,
53+
netfs_fail_read,
54+
netfs_fail_short_readpage,
55+
netfs_fail_short_write_begin,
56+
netfs_fail_prepare_write,
57+
};
58+
5059
#endif
5160

5261
#define netfs_read_traces \
@@ -81,6 +90,14 @@ enum netfs_sreq_trace {
8190
EM(netfs_sreq_trace_write_skip, "SKIP ") \
8291
E_(netfs_sreq_trace_write_term, "WTERM")
8392

93+
#define netfs_failures \
94+
EM(netfs_fail_check_write_begin, "check-write-begin") \
95+
EM(netfs_fail_copy_to_cache, "copy-to-cache") \
96+
EM(netfs_fail_read, "read") \
97+
EM(netfs_fail_short_readpage, "short-readpage") \
98+
EM(netfs_fail_short_write_begin, "short-write-begin") \
99+
E_(netfs_fail_prepare_write, "prep-write")
100+
84101

85102
/*
86103
* Export enum symbols via userspace.
@@ -94,6 +111,7 @@ netfs_read_traces;
94111
netfs_rreq_traces;
95112
netfs_sreq_sources;
96113
netfs_sreq_traces;
114+
netfs_failures;
97115

98116
/*
99117
* Now redefine the EM() and E_() macros to map the enums to the strings that
@@ -197,6 +215,46 @@ TRACE_EVENT(netfs_sreq,
197215
__entry->error)
198216
);
199217

218+
TRACE_EVENT(netfs_failure,
219+
TP_PROTO(struct netfs_read_request *rreq,
220+
struct netfs_read_subrequest *sreq,
221+
int error, enum netfs_failure what),
222+
223+
TP_ARGS(rreq, sreq, error, what),
224+
225+
TP_STRUCT__entry(
226+
__field(unsigned int, rreq )
227+
__field(unsigned short, index )
228+
__field(short, error )
229+
__field(unsigned short, flags )
230+
__field(enum netfs_read_source, source )
231+
__field(enum netfs_failure, what )
232+
__field(size_t, len )
233+
__field(size_t, transferred )
234+
__field(loff_t, start )
235+
),
236+
237+
TP_fast_assign(
238+
__entry->rreq = rreq->debug_id;
239+
__entry->index = sreq ? sreq->debug_index : 0;
240+
__entry->error = error;
241+
__entry->flags = sreq ? sreq->flags : 0;
242+
__entry->source = sreq ? sreq->source : NETFS_INVALID_READ;
243+
__entry->what = what;
244+
__entry->len = sreq ? sreq->len : 0;
245+
__entry->transferred = sreq ? sreq->transferred : 0;
246+
__entry->start = sreq ? sreq->start : 0;
247+
),
248+
249+
TP_printk("R=%08x[%u] %s f=%02x s=%llx %zx/%zx %s e=%d",
250+
__entry->rreq, __entry->index,
251+
__print_symbolic(__entry->source, netfs_sreq_sources),
252+
__entry->flags,
253+
__entry->start, __entry->transferred, __entry->len,
254+
__print_symbolic(__entry->what, netfs_failures),
255+
__entry->error)
256+
);
257+
200258
#endif /* _TRACE_NETFS_H */
201259

202260
/* This part must be outside protection */

0 commit comments

Comments
 (0)