Hi Georges,

Thanks for your fix!

On Thu, Sep 18, 2025 at 1:47 AM Aureau, Georges (Kernel Tools ERT)
<[email protected]> wrote:
>
> Fix "mount <address>" and MNT_CURSOR entries:
>
> 1/ "mount <address>" is failing on kernels without "super_block.s_files":
>
> crash> mount ff35d61d80200000
> mount: the super_block.s_files linked list does not exist in this kernel
> mount: -f option not supported or applicable on this architecture or kernel
>
> The MOUNT_PRINT_FILES flags should only be passed when "super_block.s_files"
> is available.
>
> 2/ "mount" is not skipping MNT_CURSOR entries (kernel >= 5.8):
>
You have addressed 2 issues within one patch, I suggest separating
them into 2. See the comments below:

> crash> mount > mount.out
> WARNING: cannot get super_block from vfsmnt: 0xff35d65eb1cc1820
> crash> struct mount.mnt.mnt_sb,mnt.mnt_flags -x 0xff35d65eb1cc1820
>   mnt.mnt_sb = 0x0,
>   mnt.mnt_flags = 0x10000000,
>
> When crashing with running "findmnt" commands, the mount list will
> have entries with mnt.mnt_flags==MNT_CURSOR (and mnt.mnt_sb==NULL).
> Such entries should be skipped without errors.
>
> Signed-off-by: Georges Aureau <[email protected]>
> --
>  defs.h    |  1 +
>  filesys.c | 16 +++++++++++++++-
>  symbols.c |  2 ++
>  3 files changed, 18 insertions(+), 1 deletion(-)
>
> diff --git a/defs.h b/defs.h
> index 156ac02..9e37f26 100644
> --- a/defs.h
> +++ b/defs.h
> @@ -1508,6 +1508,7 @@ struct offset_table {                    /* stash of 
> commonly-used offsets */
>         long vfsmount_mnt_devname;
>         long vfsmount_mnt_dirname;
>         long vfsmount_mnt_sb;
> +       long vfsmount_mnt_flags;

Please append it at the end of offset_table rather than insert it into
the middle, see
https://github.com/crash-utility/crash/wiki#writing-patches

>         long vfsmount_mnt_list;
>         long vfsmount_mnt_mountpoint;
>         long vfsmount_mnt_parent;
> diff --git a/filesys.c b/filesys.c
> index 8d13807..7439c2e 100644
> --- a/filesys.c
> +++ b/filesys.c
> @@ -1296,7 +1296,7 @@ cmd_mount(void)
>          *  through it for each search argument entered.
>          */
>         open_tmpfile();
> -       show_mounts(0, MOUNT_PRINT_FILES |
> +       show_mounts(0, (VALID_MEMBER(super_block_s_files) ? MOUNT_PRINT_FILES 
> : 0) |
>                 (VALID_MEMBER(super_block_s_dirty) ? MOUNT_PRINT_INODES : 0),
>                 namespace_context);
>
> @@ -1371,6 +1371,14 @@ cmd_mount(void)
>   *  Do the work for cmd_mount();
>   */
>
> +/* For kernels >= 5.8, we need to skip MNT_CURSOR entries.
> + * See https://elixir.bootlin.com/linux/v5.8/source/include/linux/mount.h#L73
> + *     https://elixir.bootlin.com/linux/v5.8/source/fs/namespace.c#L661
> + *     https://elixir.bootlin.com/linux/v5.8/source/fs/namespace.c#L690
> + *     https://elixir.bootlin.com/linux/v5.8/source/fs/proc_namespace.c#L283
> + */
> +#define MNT_CURSOR             0x10000000
> +
>  static void
>  show_mounts(ulong one_vfsmount, int flags, struct task_context 
> *namespace_context)
>  {
> @@ -1492,6 +1500,11 @@ show_mounts(ulong one_vfsmount, int flags, struct 
> task_context *namespace_contex
>
>                 sbp = ULONG(vfsmount_buf + OFFSET(vfsmount_mnt_sb));
>                 if (!IS_KVADDR(sbp)) {
> +                       if (sbp == 0 && VALID_MEMBER(vfsmount_mnt_flags)) {
> +                               int mnt_flags = INT(vfsmount_buf + 
> OFFSET(vfsmount_mnt_flags));
> +                               if (mnt_flags == MNT_CURSOR)

This is the case only for 5.8-6.8. For kernel > 6.8, the MNT_CURSOR is
removed and the same value has been used for other purposes, see
kernel commit "101f2bbab5 fs: convert mount flags to enum". I didn't
look into this issue in depth, but it seems drgn patch
https://github.com/osandov/drgn/pull/496/files only checks sbp == 0
for MNT_CURSOR. Is there a way to support both 5.8-6.8 and 6.8+ cases?
Because I'm not sure if only checking sbp == 0 can work out.

> +                                       continue;
> +                       }
>                         error(WARNING, "cannot get super_block from vfsmnt: 
> 0x%lx\n", *vfsmnt);
>                         continue;
>                 }
> @@ -2070,6 +2083,7 @@ vfs_init(void)
>                 MEMBER_OFFSET_INIT(mount_mnt_devname, "mount", "mnt_devname");
>          MEMBER_OFFSET_INIT(vfsmount_mnt_dirname, "vfsmount", "mnt_dirname");
>          MEMBER_OFFSET_INIT(vfsmount_mnt_sb, "vfsmount", "mnt_sb");
> +        MEMBER_OFFSET_INIT(vfsmount_mnt_flags, "vfsmount", "mnt_flags");
>          MEMBER_OFFSET_INIT(vfsmount_mnt_list, "vfsmount", "mnt_list");
>         if (INVALID_MEMBER(vfsmount_mnt_devname))
>                 MEMBER_OFFSET_INIT(mount_mnt_list, "mount", "mnt_list");
> diff --git a/symbols.c b/symbols.c
> index 112bcc6..92098a8 100644
> --- a/symbols.c
> +++ b/symbols.c
> @@ -10685,6 +10685,8 @@ dump_offset_table(char *spec, ulong makestruct)
>                 OFFSET(vfsmount_mnt_dirname));
>          fprintf(fp, "               vfsmount_mnt_sb: %ld\n",
>                 OFFSET(vfsmount_mnt_sb));
> +        fprintf(fp, "            vfsmount_mnt_flags: %ld\n",
> +               OFFSET(vfsmount_mnt_flags));
>          fprintf(fp, "             vfsmount_mnt_list: %ld\n",
>                 OFFSET(vfsmount_mnt_list));
>          fprintf(fp, "       vfsmount_mnt_mountpoint: %ld\n",
> --
> Crash-utility mailing list -- [email protected]
> To unsubscribe send an email to [email protected]
> https://${domain_name}/admin/lists/devel.lists.crash-utility.osci.io/
> Contribution Guidelines: https://github.com/crash-utility/crash/wiki
--
Crash-utility mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://${domain_name}/admin/lists/devel.lists.crash-utility.osci.io/
Contribution Guidelines: https://github.com/crash-utility/crash/wiki

Reply via email to