[PATCH v12 3/5] cachefiles: Add a tracepoint to log insufficient space errors
David Howells
dhowells at redhat.com
Thu Sep 10 15:02:38 PDT 2026
Add a tracepoint to log insufficient space errors.
Signed-off-by: David Howells <dhowells at redhat.com>
cc: Marc Dionne <marc.dionne at auristor.com>
cc: Paulo Alcantara <pc at manguebit.org>
cc: netfs at lists.linux.dev
cc: linux-fsdevel at vger.kernel.org
---
fs/cachefiles/io.c | 15 +++++++++++----
fs/cachefiles/namei.c | 10 ++++++++--
include/trace/events/cachefiles.h | 30 +++++++++++++++++++++++++++++-
3 files changed, 48 insertions(+), 7 deletions(-)
diff --git a/fs/cachefiles/io.c b/fs/cachefiles/io.c
index dac48fdf85d1..4b3ceda17426 100644
--- a/fs/cachefiles/io.c
+++ b/fs/cachefiles/io.c
@@ -533,10 +533,14 @@ int __cachefiles_prepare_write(struct cachefiles_object *object,
* space, we need to see if it's fully allocated. If it's not, we may
* want to cull it.
*/
- if (cachefiles_has_space(cache, 0, *_len / PAGE_SIZE,
- cachefiles_has_space_check) == 0)
+ ret = cachefiles_has_space(cache, 0, *_len / PAGE_SIZE,
+ cachefiles_has_space_check);
+ if (ret == 0)
return 0; /* Enough space to simply overwrite the whole block */
+ if (ret == -ENOBUFS)
+ trace_cachefiles_no_space(object, cachefiles_trace_write_nospace_2);
+
pos = cachefiles_inject_read_error();
if (pos == 0)
pos = vfs_llseek(file, start, SEEK_HOLE);
@@ -565,8 +569,11 @@ int __cachefiles_prepare_write(struct cachefiles_object *object,
return ret;
check_space:
- return cachefiles_has_space(cache, 0, *_len / PAGE_SIZE,
- cachefiles_has_space_for_write);
+ ret = cachefiles_has_space(cache, 0, *_len / PAGE_SIZE,
+ cachefiles_has_space_for_write);
+ if (ret == -ENOBUFS)
+ trace_cachefiles_no_space(object, cachefiles_trace_write_nospace);
+ return ret;
}
static int cachefiles_prepare_write(struct netfs_cache_resources *cres,
diff --git a/fs/cachefiles/namei.c b/fs/cachefiles/namei.c
index 88955249a1a6..4780ce6dc830 100644
--- a/fs/cachefiles/namei.c
+++ b/fs/cachefiles/namei.c
@@ -117,8 +117,11 @@ struct dentry *cachefiles_get_directory(struct cachefiles_cache *cache,
if (d_is_negative(subdir)) {
ret = cachefiles_has_space(cache, 1, 0,
cachefiles_has_space_for_create);
- if (ret < 0)
+ if (ret < 0) {
+ if (ret == -ENOBUFS)
+ trace_cachefiles_no_space(NULL, cachefiles_trace_mkdir_nospace);
goto mkdir_error;
+ }
_debug("attempt mkdir");
@@ -487,8 +490,11 @@ static bool cachefiles_create_file(struct cachefiles_object *object)
ret = cachefiles_has_space(object->volume->cache, 1, 0,
cachefiles_has_space_for_create);
- if (ret < 0)
+ if (ret < 0) {
+ if (ret == -ENOBUFS)
+ trace_cachefiles_no_space(object, cachefiles_trace_create_nospace);
return false;
+ }
file = cachefiles_create_tmpfile(object);
if (IS_ERR(file))
diff --git a/include/trace/events/cachefiles.h b/include/trace/events/cachefiles.h
index 1938d51a9459..cd865c265c24 100644
--- a/include/trace/events/cachefiles.h
+++ b/include/trace/events/cachefiles.h
@@ -80,11 +80,13 @@ enum cachefiles_prepare_read_trace {
};
enum cachefiles_error_trace {
+ cachefiles_trace_create_nospace,
cachefiles_trace_fallocate_error,
cachefiles_trace_getxattr_error,
cachefiles_trace_link_error,
cachefiles_trace_lookup_error,
cachefiles_trace_mkdir_error,
+ cachefiles_trace_mkdir_nospace,
cachefiles_trace_notify_change_error,
cachefiles_trace_open_error,
cachefiles_trace_read_error,
@@ -97,6 +99,8 @@ enum cachefiles_error_trace {
cachefiles_trace_trunc_error,
cachefiles_trace_unlink_error,
cachefiles_trace_write_error,
+ cachefiles_trace_write_nospace,
+ cachefiles_trace_write_nospace_2,
};
#endif
@@ -161,11 +165,13 @@ enum cachefiles_error_trace {
E_(cachefiles_trace_read_seek_nxio, "seek-enxio")
#define cachefiles_error_traces \
+ EM(cachefiles_trace_create_nospace, "create-nospace") \
EM(cachefiles_trace_fallocate_error, "fallocate") \
EM(cachefiles_trace_getxattr_error, "getxattr") \
EM(cachefiles_trace_link_error, "link") \
EM(cachefiles_trace_lookup_error, "lookup") \
EM(cachefiles_trace_mkdir_error, "mkdir") \
+ EM(cachefiles_trace_mkdir_nospace, "mkdir-nospace") \
EM(cachefiles_trace_notify_change_error, "notify_change") \
EM(cachefiles_trace_open_error, "open") \
EM(cachefiles_trace_read_error, "read") \
@@ -177,7 +183,9 @@ enum cachefiles_error_trace {
EM(cachefiles_trace_tmpfile_error, "tmpfile") \
EM(cachefiles_trace_trunc_error, "trunc") \
EM(cachefiles_trace_unlink_error, "unlink") \
- E_(cachefiles_trace_write_error, "write")
+ EM(cachefiles_trace_write_error, "write") \
+ EM(cachefiles_trace_write_nospace, "write-nospace") \
+ E_(cachefiles_trace_write_nospace_2, "write-nospace-2")
/*
@@ -694,6 +702,26 @@ TRACE_EVENT(cachefiles_io_error,
__entry->error)
);
+TRACE_EVENT(cachefiles_no_space,
+ TP_PROTO(struct cachefiles_object *obj, enum cachefiles_error_trace trace),
+
+ TP_ARGS(obj, trace),
+
+ TP_STRUCT__entry(
+ __field(unsigned int, obj)
+ __field(enum cachefiles_error_trace, trace)
+ ),
+
+ TP_fast_assign(
+ __entry->obj = obj ? obj->debug_id : 0;
+ __entry->trace = trace;
+ ),
+
+ TP_printk("o=%08x %s",
+ __entry->obj,
+ __print_symbolic(__entry->trace, cachefiles_error_traces))
+ );
+
#endif /* _TRACE_CACHEFILES_H */
/* This part must be outside protection */
More information about the linux-afs
mailing list