* [PATCH] pstore: automatically dump and clean dmesg entries
@ 2019-03-01 14:53 Thomas Renninger
2019-03-01 14:58 ` Thomas Renninger
0 siblings, 1 reply; 2+ messages in thread
From: Thomas Renninger @ 2019-03-01 14:53 UTC (permalink / raw)
To: keescook; +Cc: joel, tony.luck, ccross, anton, duwe, linux-kernel
From: Torsten Duwe <duwe@suse.de>
Dump a previous oops or panic, which has made it to pstore,
to the new syslog after reboot, optionally deleting it.
This can happen automatically, without user land interaction.
Signed-off-by: Torsten Duwe <duwe@suse.de>
CC: Thomas Renninger <trenn@suse.de>
---
fs/pstore/inode.c | 6 +++---
fs/pstore/internal.h | 11 +++++++++--
fs/pstore/platform.c | 33 +++++++++++++++++++++++++++------
3 files changed, 39 insertions(+), 11 deletions(-)
Index: test_pstore/fs/pstore/inode.c
===================================================================
--- test_pstore.orig/fs/pstore/inode.c 2019-03-01 13:55:50.561322896 +0100
+++ test_pstore/fs/pstore/inode.c 2019-03-01 13:56:05.349323693 +0100
@@ -374,7 +374,7 @@ fail:
* when we are re-scanning the backing store looking to add new
* error records.
*/
-void pstore_get_records(int quiet)
+void pstore_get_records(unsigned flags)
{
struct pstore_info *psi = psinfo;
struct dentry *root;
@@ -385,7 +385,7 @@ void pstore_get_records(int quiet)
root = pstore_sb->s_root;
inode_lock(d_inode(root));
- pstore_get_backend_records(psi, root, quiet);
+ pstore_get_backend_records(psi, root, flags);
inode_unlock(d_inode(root));
}
@@ -415,7 +415,7 @@ static int pstore_fill_super(struct supe
if (!sb->s_root)
return -ENOMEM;
- pstore_get_records(0);
+ pstore_get_records(PGR_VERBOSE|PGR_POPULATE);
return 0;
}
Index: test_pstore/fs/pstore/internal.h
===================================================================
--- test_pstore.orig/fs/pstore/internal.h 2019-03-01 13:55:50.565322897 +0100
+++ test_pstore/fs/pstore/internal.h 2019-03-01 13:56:05.349323693 +0100
@@ -28,9 +28,16 @@ static inline void pstore_unregister_pms
extern struct pstore_info *psinfo;
extern void pstore_set_kmsg_bytes(int);
-extern void pstore_get_records(int);
+extern void pstore_get_records(unsigned);
+/* Flags for the pstore iterator pstore_get_records() */
+#define PGR_QUIET 0
+#define PGR_VERBOSE 1
+#define PGR_POPULATE 2
+#define PGR_SYSLOG 4
+#define PGR_CLEAR 8
+
extern void pstore_get_backend_records(struct pstore_info *psi,
- struct dentry *root, int quiet);
+ struct dentry *root, unsigned flags);
extern int pstore_mkfile(struct dentry *root,
struct pstore_record *record);
extern bool pstore_is_mounted(void);
Index: test_pstore/fs/pstore/platform.c
===================================================================
--- test_pstore.orig/fs/pstore/platform.c 2019-03-01 13:55:50.565322897 +0100
+++ test_pstore/fs/pstore/platform.c 2019-03-01 13:59:06.077333431 +0100
@@ -87,6 +87,11 @@ static DECLARE_WORK(pstore_work, pstore_
static DEFINE_SPINLOCK(pstore_lock);
struct pstore_info *psinfo;
+static int auto_action=0;
+module_param(auto_action, int, 0664);
+MODULE_PARM_DESC(auto_action, "action to take on backend "
+ "registration: 0=nothing, 1=print, 2=print+clear");
+
static char *backend;
static char *compress =
#ifdef CONFIG_PSTORE_COMPRESS_DEFAULT
@@ -108,6 +113,8 @@ static size_t big_oops_buf_sz;
/* How much of the console log to snapshot */
unsigned long kmsg_bytes = PSTORE_DEFAULT_KMSG_BYTES;
+module_param(kmsg_bytes, ulong, 0644);
+MODULE_PARM_DESC(kmsg_bytes, "maximum size to save of a crash dump");
void pstore_set_kmsg_bytes(int bytes)
{
@@ -606,7 +613,11 @@ int pstore_register(struct pstore_info *
allocate_buf_for_compression();
if (pstore_is_mounted())
- pstore_get_records(0);
+ pstore_get_records(PGR_VERBOSE|PGR_POPULATE);
+
+ if (auto_action)
+ pstore_get_records(PGR_SYSLOG|
+ ((auto_action>1)?PGR_CLEAR:0));
if (psi->flags & PSTORE_FLAGS_DMESG)
pstore_register_kmsg();
@@ -723,7 +734,7 @@ static void decompress_record(struct pst
* error records.
*/
void pstore_get_backend_records(struct pstore_info *psi,
- struct dentry *root, int quiet)
+ struct dentry *root, unsigned flags)
{
int failed = 0;
unsigned int stop_loop = 65536;
@@ -742,7 +753,7 @@ void pstore_get_backend_records(struct p
*/
for (; stop_loop; stop_loop--) {
struct pstore_record *record;
- int rc;
+ int rc = 0;
record = kzalloc(sizeof(*record), GFP_KERNEL);
if (!record) {
@@ -760,12 +771,23 @@ void pstore_get_backend_records(struct p
}
decompress_record(record);
- rc = pstore_mkfile(root, record);
+ if (flags & PGR_POPULATE)
+ rc = pstore_mkfile(root, record);
+ if (record->type == PSTORE_TYPE_DMESG) {
+ if (flags & PGR_SYSLOG) {
+ pr_notice("---------- pstore: ----------\n");
+ pr_notice("%.*s\n", (int)record->size,
+ record->buf);
+ pr_notice("-----------------------------\n");
+ }
+ if (flags & PGR_CLEAR && psi->erase)
+ psi->erase(record);
+ }
if (rc) {
/* pstore_mkfile() did not take record, so free it. */
kfree(record->buf);
kfree(record);
- if (rc != -EEXIST || !quiet)
+ if (rc != -EEXIST || (flags & PGR_VERBOSE))
failed++;
}
}
@@ -784,7 +806,7 @@ out:
static void pstore_dowork(struct work_struct *work)
{
- pstore_get_records(1);
+ pstore_get_records(PGR_QUIET|PGR_POPULATE);
}
static void pstore_timefunc(struct timer_list *unused)
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [PATCH] pstore: automatically dump and clean dmesg entries
2019-03-01 14:53 [PATCH] pstore: automatically dump and clean dmesg entries Thomas Renninger
@ 2019-03-01 14:58 ` Thomas Renninger
0 siblings, 0 replies; 2+ messages in thread
From: Thomas Renninger @ 2019-03-01 14:58 UTC (permalink / raw)
To: keescook; +Cc: joel, tony.luck, ccross, anton, duwe, linux-kernel
On Friday, March 1, 2019 3:53:25 PM CET Thomas Renninger wrote:
> From: Torsten Duwe <duwe@suse.de>
>
> Dump a previous oops or panic, which has made it to pstore,
> to the new syslog after reboot, optionally deleting it.
> This can happen automatically, without user land interaction.
>
> Signed-off-by: Torsten Duwe <duwe@suse.de>
> CC: Thomas Renninger <trenn@suse.de>
This is a patch which is (was) part of the SUSE kernel for quite a while.
Iirc someone from Fujitsu requested this.
Anyway, it has not been sent upstream yet, but looks useful.
Please consider to merge this one if you like it.
Otherwise it will probably get dropped to Nirvana as we only keep upstream
accepted (not SuSE specific) patches.
I adjusted the patch to latest linux-2.6 git HEAD state and gave it a test
compile.
Thanks,
Thomas
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2019-03-01 14:58 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-03-01 14:53 [PATCH] pstore: automatically dump and clean dmesg entries Thomas Renninger
2019-03-01 14:58 ` Thomas Renninger
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).