* [fsinfo PATCH v2 0/3] fsinfo: add error state information to fsinfo
@ 2020-06-26 15:04 Jeff Layton
2020-06-26 15:04 ` [fsinfo PATCH v2 1/3] errseq: add a new errseq_scrape function Jeff Layton
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: Jeff Layton @ 2020-06-26 15:04 UTC (permalink / raw)
To: dhowells; +Cc: linux-fsdevel, andres
Hi David,
I sent a draft version of these patches back in 2018. The per-sb
errseq_t tracking was just merged for v5.8, so most of the underlying
infrastructure is now in place. Wiring up the reporting of that to
fsinfo() is fairly trivial.
Can you toss these onto your fsinfo pile? If that goes in at some point
in the future, it'd be nice to have this infolevel available on day 1.
This is based on your current fsinfo-core branch. The patches are also
available here if you want to cherry-pick them instead:
https://git.kernel.org/pub/scm/linux/kernel/git/jlayton/linux.git/log/?h=fsinfo-wberr
Thanks!
Jeff Layton (3):
errseq: add a new errseq_scrape function
vfs: allow fsinfo to fetch the current state of s_wb_err
samples: add error state information to test-fsinfo.c
fs/fsinfo.c | 11 +++++++++++
include/linux/errseq.h | 1 +
include/uapi/linux/fsinfo.h | 13 +++++++++++++
lib/errseq.c | 33 +++++++++++++++++++++++++++++++--
samples/vfs/test-fsinfo.c | 10 ++++++++++
5 files changed, 66 insertions(+), 2 deletions(-)
--
2.26.2
^ permalink raw reply [flat|nested] 4+ messages in thread
* [fsinfo PATCH v2 1/3] errseq: add a new errseq_scrape function
2020-06-26 15:04 [fsinfo PATCH v2 0/3] fsinfo: add error state information to fsinfo Jeff Layton
@ 2020-06-26 15:04 ` Jeff Layton
2020-06-26 15:04 ` [fsinfo PATCH v2 2/3] vfs: allow fsinfo to fetch the current state of s_wb_err Jeff Layton
2020-06-26 15:05 ` [fsinfo PATCH v2 3/3] samples: add error state information to test-fsinfo.c Jeff Layton
2 siblings, 0 replies; 4+ messages in thread
From: Jeff Layton @ 2020-06-26 15:04 UTC (permalink / raw)
To: dhowells; +Cc: linux-fsdevel, andres
From: Jeff Layton <jlayton@redhat.com>
To grab the current value of an errseq_t, mark it as seen and then
return the value with the seen bit masked off.
Signed-off-by: Jeff Layton <jlayton@redhat.com>
Reviewed-by: David Howells <dhowells@redhat.com>
Reviewed-by: Carlos Maiolino <cmaiolino@redhat.com>
---
include/linux/errseq.h | 1 +
lib/errseq.c | 33 +++++++++++++++++++++++++++++++--
2 files changed, 32 insertions(+), 2 deletions(-)
diff --git a/include/linux/errseq.h b/include/linux/errseq.h
index fc2777770768..de165623fa86 100644
--- a/include/linux/errseq.h
+++ b/include/linux/errseq.h
@@ -9,6 +9,7 @@ typedef u32 errseq_t;
errseq_t errseq_set(errseq_t *eseq, int err);
errseq_t errseq_sample(errseq_t *eseq);
+errseq_t errseq_scrape(errseq_t *eseq);
int errseq_check(errseq_t *eseq, errseq_t since);
int errseq_check_and_advance(errseq_t *eseq, errseq_t *since);
#endif
diff --git a/lib/errseq.c b/lib/errseq.c
index 81f9e33aa7e7..8ded0920eed3 100644
--- a/lib/errseq.c
+++ b/lib/errseq.c
@@ -108,7 +108,7 @@ errseq_t errseq_set(errseq_t *eseq, int err)
EXPORT_SYMBOL(errseq_set);
/**
- * errseq_sample() - Grab current errseq_t value.
+ * errseq_sample() - Grab current errseq_t value (or 0 if it hasn't been seen)
* @eseq: Pointer to errseq_t to be sampled.
*
* This function allows callers to initialise their errseq_t variable.
@@ -117,7 +117,7 @@ EXPORT_SYMBOL(errseq_set);
* see it the next time it checks for an error.
*
* Context: Any context.
- * Return: The current errseq value.
+ * Return: The current errseq value or 0 if it wasn't previously seen
*/
errseq_t errseq_sample(errseq_t *eseq)
{
@@ -130,6 +130,35 @@ errseq_t errseq_sample(errseq_t *eseq)
}
EXPORT_SYMBOL(errseq_sample);
+/**
+ * errseq_scrape() - Grab current errseq_t value
+ * @eseq: Pointer to errseq_t to be sampled.
+ *
+ * This function allows callers to scrape the current value of an errseq_t.
+ * Unlike errseq_sample, this will always return the current value with
+ * the SEEN flag unset, even when the value has not yet been seen.
+ *
+ * Context: Any context.
+ * Return: The current errseq value with ERRSEQ_SEEN masked off
+ */
+errseq_t errseq_scrape(errseq_t *eseq)
+{
+ errseq_t old = READ_ONCE(*eseq);
+
+ /*
+ * For the common case of no errors ever having been set, we can skip
+ * marking the SEEN bit. Once an error has been set, the value will
+ * never go back to zero.
+ */
+ if (old != 0) {
+ errseq_t new = old | ERRSEQ_SEEN;
+ if (old != new)
+ cmpxchg(eseq, old, new);
+ }
+ return old & ~ERRSEQ_SEEN;
+}
+EXPORT_SYMBOL(errseq_scrape);
+
/**
* errseq_check() - Has an error occurred since a particular sample point?
* @eseq: Pointer to errseq_t value to be checked.
--
2.26.2
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [fsinfo PATCH v2 2/3] vfs: allow fsinfo to fetch the current state of s_wb_err
2020-06-26 15:04 [fsinfo PATCH v2 0/3] fsinfo: add error state information to fsinfo Jeff Layton
2020-06-26 15:04 ` [fsinfo PATCH v2 1/3] errseq: add a new errseq_scrape function Jeff Layton
@ 2020-06-26 15:04 ` Jeff Layton
2020-06-26 15:05 ` [fsinfo PATCH v2 3/3] samples: add error state information to test-fsinfo.c Jeff Layton
2 siblings, 0 replies; 4+ messages in thread
From: Jeff Layton @ 2020-06-26 15:04 UTC (permalink / raw)
To: dhowells; +Cc: linux-fsdevel, andres
From: Jeff Layton <jlayton@redhat.com>
Add a new "error_state" struct to fsinfo, and teach the kernel to fill
that out from sb->s_wb_err. There are two fields:
wb_error_last: the most recently recorded errno for the filesystem
wb_error_cookie: this value will change vs. the previously fetched
value if a new error was recorded since it was last
checked. Callers should treat this as an opaque value
that can be compared to earlier fetched values.
Signed-off-by: Jeff Layton <jlayton@redhat.com>
---
fs/fsinfo.c | 11 +++++++++++
include/uapi/linux/fsinfo.h | 13 +++++++++++++
2 files changed, 24 insertions(+)
diff --git a/fs/fsinfo.c b/fs/fsinfo.c
index 18b533b79cea..2934e05328ed 100644
--- a/fs/fsinfo.c
+++ b/fs/fsinfo.c
@@ -274,6 +274,16 @@ static int fsinfo_generic_seq_read(struct path *path, struct fsinfo_context *ctx
return m.count + 1;
}
+static int fsinfo_generic_error_state(struct path *path,
+ struct fsinfo_context *ctx)
+{
+ struct fsinfo_error_state *es = ctx->buffer;
+
+ es->wb_error_cookie = errseq_scrape(&path->dentry->d_sb->s_wb_err);
+ es->wb_error_last = es->wb_error_cookie & MAX_ERRNO;
+ return sizeof(*es);
+}
+
static const struct fsinfo_attribute fsinfo_common_attributes[] = {
FSINFO_VSTRUCT (FSINFO_ATTR_STATFS, fsinfo_generic_statfs),
FSINFO_VSTRUCT (FSINFO_ATTR_IDS, fsinfo_generic_ids),
@@ -286,6 +296,7 @@ static const struct fsinfo_attribute fsinfo_common_attributes[] = {
FSINFO_STRING (FSINFO_ATTR_SOURCE, fsinfo_generic_mount_source),
FSINFO_STRING (FSINFO_ATTR_CONFIGURATION, fsinfo_generic_seq_read),
FSINFO_STRING (FSINFO_ATTR_FS_STATISTICS, fsinfo_generic_seq_read),
+ FSINFO_VSTRUCT (FSINFO_ATTR_ERROR_STATE, fsinfo_generic_error_state),
FSINFO_LIST (FSINFO_ATTR_FSINFO_ATTRIBUTES, (void *)123UL),
FSINFO_VSTRUCT_N(FSINFO_ATTR_FSINFO_ATTRIBUTE_INFO, (void *)123UL),
diff --git a/include/uapi/linux/fsinfo.h b/include/uapi/linux/fsinfo.h
index af681b2e0e7e..72b0e7207a8a 100644
--- a/include/uapi/linux/fsinfo.h
+++ b/include/uapi/linux/fsinfo.h
@@ -27,6 +27,7 @@
#define FSINFO_ATTR_SOURCE 0x09 /* Superblock source/device name (string) */
#define FSINFO_ATTR_CONFIGURATION 0x0a /* Superblock configuration/options (string) */
#define FSINFO_ATTR_FS_STATISTICS 0x0b /* Superblock filesystem statistics (string) */
+#define FSINFO_ATTR_ERROR_STATE 0x0c /* Superblock writeback error state */
#define FSINFO_ATTR_FSINFO_ATTRIBUTE_INFO 0x100 /* Information about attr N (for path) */
#define FSINFO_ATTR_FSINFO_ATTRIBUTES 0x101 /* List of supported attrs (for path) */
@@ -332,4 +333,16 @@ struct fsinfo_afs_server_address {
#define FSINFO_ATTR_AFS_SERVER_ADDRESSES__STRUCT struct fsinfo_afs_server_address
+/*
+ * Information struct for fsinfo(FSINFO_ATTR_ERROR_STATE).
+ *
+ * Retrieve the error state for a filesystem.
+ */
+struct fsinfo_error_state {
+ __u32 wb_error_cookie; /* writeback error cookie */
+ __u32 wb_error_last; /* latest writeback error */
+};
+
+#define FSINFO_ATTR_ERROR_STATE__STRUCT struct fsinfo_error_state
+
#endif /* _UAPI_LINUX_FSINFO_H */
--
2.26.2
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [fsinfo PATCH v2 3/3] samples: add error state information to test-fsinfo.c
2020-06-26 15:04 [fsinfo PATCH v2 0/3] fsinfo: add error state information to fsinfo Jeff Layton
2020-06-26 15:04 ` [fsinfo PATCH v2 1/3] errseq: add a new errseq_scrape function Jeff Layton
2020-06-26 15:04 ` [fsinfo PATCH v2 2/3] vfs: allow fsinfo to fetch the current state of s_wb_err Jeff Layton
@ 2020-06-26 15:05 ` Jeff Layton
2 siblings, 0 replies; 4+ messages in thread
From: Jeff Layton @ 2020-06-26 15:05 UTC (permalink / raw)
To: dhowells; +Cc: linux-fsdevel, andres
Signed-off-by: Jeff Layton <jlayton@kernel.org>
---
samples/vfs/test-fsinfo.c | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/samples/vfs/test-fsinfo.c b/samples/vfs/test-fsinfo.c
index 26bf23121c9a..7f43320174d2 100644
--- a/samples/vfs/test-fsinfo.c
+++ b/samples/vfs/test-fsinfo.c
@@ -411,6 +411,15 @@ static void dump_afs_fsinfo_server_address(void *reply, unsigned int size)
printf("family=%u\n", ss->ss_family);
}
+static void dump_fsinfo_generic_error_state(void *reply, unsigned int size)
+{
+ struct fsinfo_error_state *es = reply;
+
+ printf("\n");
+ printf("\tlatest error : %d (%s)\n", es->wb_error_last, strerror(es->wb_error_last));
+ printf("\tcookie : 0x%x\n", es->wb_error_cookie);
+}
+
static void dump_string(void *reply, unsigned int size)
{
char *s = reply, *p;
@@ -499,6 +508,7 @@ static const struct fsinfo_attribute fsinfo_attributes[] = {
FSINFO_STRING (FSINFO_ATTR_AFS_CELL_NAME, string),
FSINFO_STRING (FSINFO_ATTR_AFS_SERVER_NAME, string),
FSINFO_LIST_N (FSINFO_ATTR_AFS_SERVER_ADDRESSES, afs_fsinfo_server_address),
+ FSINFO_VSTRUCT (FSINFO_ATTR_ERROR_STATE, fsinfo_generic_error_state),
{}
};
--
2.26.2
^ permalink raw reply related [flat|nested] 4+ messages in thread
end of thread, other threads:[~2020-06-26 15:05 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-06-26 15:04 [fsinfo PATCH v2 0/3] fsinfo: add error state information to fsinfo Jeff Layton
2020-06-26 15:04 ` [fsinfo PATCH v2 1/3] errseq: add a new errseq_scrape function Jeff Layton
2020-06-26 15:04 ` [fsinfo PATCH v2 2/3] vfs: allow fsinfo to fetch the current state of s_wb_err Jeff Layton
2020-06-26 15:05 ` [fsinfo PATCH v2 3/3] samples: add error state information to test-fsinfo.c Jeff Layton
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.