Merge tag 'amd-drm-fixes-6.7-2023-12-13' of https://gitlab.freedesktop.org/agd5f...
[linux-2.6-microblaze.git] / scripts / gdb / linux / vfs.py
1 #
2 # gdb helper commands and functions for Linux kernel debugging
3 #
4 #  VFS tools
5 #
6 # Copyright (c) 2023 Glenn Washburn
7 # Copyright (c) 2016 Linaro Ltd
8 #
9 # Authors:
10 #  Glenn Washburn <development@efficientek.com>
11 #  Kieran Bingham <kieran.bingham@linaro.org>
12 #
13 # This work is licensed under the terms of the GNU GPL version 2.
14 #
15
16 import gdb
17 from linux import utils
18
19
20 def dentry_name(d):
21     parent = d['d_parent']
22     if parent == d or parent == 0:
23         return ""
24     p = dentry_name(d['d_parent']) + "/"
25     return p + d['d_iname'].string()
26
27 class DentryName(gdb.Function):
28     """Return string of the full path of a dentry.
29
30 $lx_dentry_name(PTR): Given PTR to a dentry struct, return a string
31 of the full path of the dentry."""
32
33     def __init__(self):
34         super(DentryName, self).__init__("lx_dentry_name")
35
36     def invoke(self, dentry_ptr):
37         return dentry_name(dentry_ptr)
38
39 DentryName()
40
41
42 dentry_type = utils.CachedType("struct dentry")
43
44 class InodeDentry(gdb.Function):
45     """Return dentry pointer for inode.
46
47 $lx_i_dentry(PTR): Given PTR to an inode struct, return a pointer to
48 the associated dentry struct, if there is one."""
49
50     def __init__(self):
51         super(InodeDentry, self).__init__("lx_i_dentry")
52
53     def invoke(self, inode_ptr):
54         d_u = inode_ptr["i_dentry"]["first"]
55         if d_u == 0:
56             return ""
57         return utils.container_of(d_u, dentry_type.get_type().pointer(), "d_u")
58
59 InodeDentry()