* [PATCH 1/2] scripts/gdb: Create linux/vfs.py for VFS related GDB helpers
2023-03-01 0:53 [PATCH 0/2] GDB VFS utils Glenn Washburn
@ 2023-03-01 0:53 ` Glenn Washburn
2023-04-12 19:21 ` Andrew Morton
2023-03-01 0:53 ` [PATCH 2/2] scripts/gdb: Add GDB convenience functions $lx_dentry_name() and $lx_i_dentry() Glenn Washburn
2023-04-12 18:02 ` [PATCH 0/2] GDB VFS utils Florian Fainelli
2 siblings, 1 reply; 5+ messages in thread
From: Glenn Washburn @ 2023-03-01 0:53 UTC (permalink / raw)
To: Jan Kiszka, Kieran Bingham
Cc: Glenn Washburn, John Ogness, Petr Mladek, Antonio Borneo,
linux-kernel, Alexander Viro, linux-fsdevel
This will allow for more VFS specific GDB helpers to be collected in
one place. Move utils.dentry_name into the vfs modules. Also a local
variable in proc.py was changed from vfs to mnt to prevent a naming
collision with the new vfs module.
Signed-off-by: Glenn Washburn <development@efficientek.com>
---
scripts/gdb/linux/proc.py | 15 ++++++++-------
scripts/gdb/linux/utils.py | 8 --------
scripts/gdb/linux/vfs.py | 22 ++++++++++++++++++++++
scripts/gdb/vmlinux-gdb.py | 1 +
4 files changed, 31 insertions(+), 15 deletions(-)
create mode 100644 scripts/gdb/linux/vfs.py
diff --git a/scripts/gdb/linux/proc.py b/scripts/gdb/linux/proc.py
index 09cd871925a5..f2c9ba62534b 100644
--- a/scripts/gdb/linux/proc.py
+++ b/scripts/gdb/linux/proc.py
@@ -16,6 +16,7 @@ from linux import constants
from linux import utils
from linux import tasks
from linux import lists
+from linux import vfs
from struct import *
@@ -170,16 +171,16 @@ values of that process namespace"""
gdb.write("{:^18} {:^15} {:>9} {} {} options\n".format(
"mount", "super_block", "devname", "pathname", "fstype"))
- for vfs in lists.list_for_each_entry(namespace['list'],
+ for mnt in lists.list_for_each_entry(namespace['list'],
mount_ptr_type, "mnt_list"):
- devname = vfs['mnt_devname'].string()
+ devname = mnt['mnt_devname'].string()
devname = devname if devname else "none"
pathname = ""
- parent = vfs
+ parent = mnt
while True:
mntpoint = parent['mnt_mountpoint']
- pathname = utils.dentry_name(mntpoint) + pathname
+ pathname = vfs.dentry_name(mntpoint) + pathname
if (parent == parent['mnt_parent']):
break
parent = parent['mnt_parent']
@@ -187,14 +188,14 @@ values of that process namespace"""
if (pathname == ""):
pathname = "/"
- superblock = vfs['mnt']['mnt_sb']
+ superblock = mnt['mnt']['mnt_sb']
fstype = superblock['s_type']['name'].string()
s_flags = int(superblock['s_flags'])
- m_flags = int(vfs['mnt']['mnt_flags'])
+ m_flags = int(mnt['mnt']['mnt_flags'])
rd = "ro" if (s_flags & constants.LX_SB_RDONLY) else "rw"
gdb.write("{} {} {} {} {} {}{}{} 0 0\n".format(
- vfs.format_string(), superblock.format_string(), devname,
+ mnt.format_string(), superblock.format_string(), devname,
pathname, fstype, rd, info_opts(FS_INFO, s_flags),
info_opts(MNT_INFO, m_flags)))
diff --git a/scripts/gdb/linux/utils.py b/scripts/gdb/linux/utils.py
index 1553f68716cc..46233e845be3 100644
--- a/scripts/gdb/linux/utils.py
+++ b/scripts/gdb/linux/utils.py
@@ -193,11 +193,3 @@ def gdb_eval_or_none(expresssion):
return gdb.parse_and_eval(expresssion)
except gdb.error:
return None
-
-
-def dentry_name(d):
- parent = d['d_parent']
- if parent == d or parent == 0:
- return ""
- p = dentry_name(d['d_parent']) + "/"
- return p + d['d_iname'].string()
diff --git a/scripts/gdb/linux/vfs.py b/scripts/gdb/linux/vfs.py
new file mode 100644
index 000000000000..62d4f9ad7d79
--- /dev/null
+++ b/scripts/gdb/linux/vfs.py
@@ -0,0 +1,22 @@
+#
+# gdb helper commands and functions for Linux kernel debugging
+#
+# VFS tools
+#
+# Copyright (c) 2023 Glenn Washburn
+# Copyright (c) 2016 Linaro Ltd
+#
+# Authors:
+# Glenn Washburn <development@efficientek.com>
+# Kieran Bingham <kieran.bingham@linaro.org>
+#
+# This work is licensed under the terms of the GNU GPL version 2.
+#
+
+
+def dentry_name(d):
+ parent = d['d_parent']
+ if parent == d or parent == 0:
+ return ""
+ p = dentry_name(d['d_parent']) + "/"
+ return p + d['d_iname'].string()
diff --git a/scripts/gdb/vmlinux-gdb.py b/scripts/gdb/vmlinux-gdb.py
index 3e8d3669f0ce..b5af64dcf4ed 100644
--- a/scripts/gdb/vmlinux-gdb.py
+++ b/scripts/gdb/vmlinux-gdb.py
@@ -37,3 +37,4 @@ else:
import linux.clk
import linux.genpd
import linux.device
+ import linux.vfs
--
2.30.2
^ permalink raw reply related [flat|nested] 5+ messages in thread* [PATCH 2/2] scripts/gdb: Add GDB convenience functions $lx_dentry_name() and $lx_i_dentry()
2023-03-01 0:53 [PATCH 0/2] GDB VFS utils Glenn Washburn
2023-03-01 0:53 ` [PATCH 1/2] scripts/gdb: Create linux/vfs.py for VFS related GDB helpers Glenn Washburn
@ 2023-03-01 0:53 ` Glenn Washburn
2023-04-12 18:02 ` [PATCH 0/2] GDB VFS utils Florian Fainelli
2 siblings, 0 replies; 5+ messages in thread
From: Glenn Washburn @ 2023-03-01 0:53 UTC (permalink / raw)
To: Jan Kiszka, Kieran Bingham
Cc: Glenn Washburn, John Ogness, Petr Mladek, Antonio Borneo,
linux-kernel, Alexander Viro, linux-fsdevel
$lx_dentry_name() generates a full VFS path from a given dentry pointer,
and $lx_i_dentry() returns the dentry pointer associated with the given
inode pointer, if there is one.
Signed-off-by: Glenn Washburn <development@efficientek.com>
---
scripts/gdb/linux/vfs.py | 37 +++++++++++++++++++++++++++++++++++++
1 file changed, 37 insertions(+)
diff --git a/scripts/gdb/linux/vfs.py b/scripts/gdb/linux/vfs.py
index 62d4f9ad7d79..c77b9ce75f6d 100644
--- a/scripts/gdb/linux/vfs.py
+++ b/scripts/gdb/linux/vfs.py
@@ -13,6 +13,9 @@
# This work is licensed under the terms of the GNU GPL version 2.
#
+import gdb
+from linux import utils
+
def dentry_name(d):
parent = d['d_parent']
@@ -20,3 +23,37 @@ def dentry_name(d):
return ""
p = dentry_name(d['d_parent']) + "/"
return p + d['d_iname'].string()
+
+class DentryName(gdb.Function):
+ """Return string of the full path of a dentry.
+
+$lx_dentry_name(PTR): Given PTR to a dentry struct, return a string
+of the full path of the dentry."""
+
+ def __init__(self):
+ super(DentryName, self).__init__("lx_dentry_name")
+
+ def invoke(self, dentry_ptr):
+ return dentry_name(dentry_ptr)
+
+DentryName()
+
+
+dentry_type = utils.CachedType("struct dentry")
+
+class InodeDentry(gdb.Function):
+ """Return dentry pointer for inode.
+
+$lx_i_dentry(PTR): Given PTR to an inode struct, return a pointer to
+the associated dentry struct, if there is one."""
+
+ def __init__(self):
+ super(InodeDentry, self).__init__("lx_i_dentry")
+
+ def invoke(self, inode_ptr):
+ d_u = inode_ptr["i_dentry"]["first"]
+ if d_u == 0:
+ return ""
+ return utils.container_of(d_u, dentry_type.get_type().pointer(), "d_u")
+
+InodeDentry()
--
2.30.2
^ permalink raw reply related [flat|nested] 5+ messages in thread