Hi Dave,
I've written "cacheutils" crash extension module that lists dentry caches
and
dumps page caches associated with a specified file path. I think this module
would be helpful for support folks to find and see config/log files in vmcore.
For example:
$ make extensions
crash> extend cacheutils.so
./cacheutils.so: shared object loaded
crash> extend
SHARED OBJECT COMMANDS
./cacheutils.so ccat cls
crash> cls /var/log
DENTRY INODE I_MAPPING NRPAGES % PATH
ffff9c0c3eabe300 ffff9c0c3e875b78 ffff9c0c3e875ce8 0 0 ./
ffff9c0c16a22900 ffff9c0c16ada2f8 ffff9c0c16ada468 0 0 anaconda/
ffff9c0c37611000 ffff9c0c3759f5b8 ffff9c0c3759f728 0 0 audit/
ffff9c0c375ccc00 ffff9c0c3761c8b8 ffff9c0c3761ca28 1 100 btmp
ffff9c0c28fda240 ffff9c0c22c713f8 ffff9c0c22c71568 6 100 cron
ffff9c0c3eb7f180 ffff9c0bfd402a78 ffff9c0bfd402be8 36 7 dnf.librepo.log
...
crash> ccat /var/log/messages | tail
Nov 28 16:43:57 fedora systemd[27015]: Reached target Basic System.
Nov 28 16:43:57 fedora systemd[27015]: Reached target Default.
Nov 28 16:43:57 fedora systemd[1]: Started User Manager for UID 0.
Nov 28 16:43:57 fedora systemd[27015]: Startup finished in 61ms.
It tested OK from RHEL5 (x86_64) to kernel 5.1, which has XArray,
and a recent x86 Fedora.
I have three questions (requests) related to this, and I would appreciate it
if you would take a look at them after your vacation :)
* Is it possible to export the get_mount_list() and get_dump_level() functions
to extension modules? (The patch at the end exports these two functions.)
Now the get_mount_list() is copied from crash/filesys.c to this module.
And I'd like to call the get_dump_level() to inform users whether the
"ccat"
command is available or not with their vmcore when the module is loaded.
If they are exported, I will remove the "#define NOT_EXPORTED" and #ifdef
sections in it.
* Is the CRASHDEBUG(0) in do_xarray_dump_cb() function on purpose?
This module uses the function and it sometimes prints the following messages
without crash -d option. The similar message for radix tree is suppressed by
CRASHDEBUG(1), but this has CRASHDEBUG(0), so I'm wondering about it.
crash> ccat /var/log/messages
ccat: entry has XARRAY_TAG_MASK bits set: 239ab0024001
ccat: entry has XARRAY_TAG_MASK bits set: 239ae0024001
ccat: entry has XARRAY_TAG_MASK bits set: 239af0024001
static void do_xarray_dump_cb(ulong node, ulong slot, const char *path,
ulong index, void *private)
{
...
if (!cb(slot)) {
if (slot & XARRAY_TAG_MASK) {
if (CRASHDEBUG(0))
error(INFO, "entry has XARRAY_TAG_MASK bits set:
%lx\n", slot);
return;
* Is it possible to add this module to your crash extension modules page?
I'm planning to put it on GitHub, so I'd like you to add the link to the page.
Thanks,
Kazu
Signed-off-by: Kazuhito Hagio <k-hagio(a)ab.jp.nec.com>
---
defs.h | 2 ++
diskdump.c | 3 +--
filesys.c | 3 +--
3 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/defs.h b/defs.h
index 912037fcc762..42e381e6d9c1 100644
--- a/defs.h
+++ b/defs.h
@@ -5298,6 +5298,7 @@ void set_tmpfile2(FILE *);
void close_tmpfile2(void);
void open_files_dump(ulong, int, struct reference *);
void get_pathname(ulong, char *, int, int, ulong);
+ulong *get_mount_list(int *, struct task_context *);
char *vfsmount_devname(ulong, char *, int);
ulong file_to_dentry(ulong);
ulong file_to_vfsmnt(ulong);
@@ -6440,6 +6441,7 @@ int diskdump_phys_base(unsigned long *);
int diskdump_set_phys_base(unsigned long);
ulong *diskdump_flags;
int is_partial_diskdump(void);
+int get_dump_level(void);
int dumpfile_is_split(void);
void show_split_dumpfiles(void);
void x86_process_elf_notes(void *, unsigned long);
diff --git a/diskdump.c b/diskdump.c
index 694339fbb713..e88243e616cc 100644
--- a/diskdump.c
+++ b/diskdump.c
@@ -80,7 +80,6 @@ struct diskdump_data {
static struct diskdump_data diskdump_data = { 0 };
static struct diskdump_data *dd = &diskdump_data;
-static int get_dump_level(void);
ulong *diskdump_flags = &diskdump_data.flags;
@@ -2114,7 +2113,7 @@ get_diskdump_switch_stack(ulong task)
* Version 1 and later compressed kdump dumpfiles contain the dump level
* in an additional field of the sub_header_kdump structure.
*/
-static int
+int
get_dump_level(void)
{
int dump_level;
diff --git a/filesys.c b/filesys.c
index 037704126840..d88ea28ebe7a 100644
--- a/filesys.c
+++ b/filesys.c
@@ -37,7 +37,6 @@ static int mount_point(char *);
static int open_file_reference(struct reference *);
static void memory_source_init(void);
static int get_pathname_component(ulong, ulong, int, char *, char *);
-static ulong *get_mount_list(int *, struct task_context *);
char *inode_type(char *, char *);
static void match_proc_version(void);
static void get_live_memory_source(void);
@@ -1600,7 +1599,7 @@ show_mounts(ulong one_vfsmount, int flags, struct task_context
*namespace_contex
/*
* Allocate and fill a list of the currently-mounted vfsmount pointers.
*/
-static ulong *
+ulong *
get_mount_list(int *cntptr, struct task_context *namespace_context)
{
struct list_data list_data, *ld;
--
2.18.1