[Crash-utility] [PATCH] Fix for the "dev -[dD]" options on Linux 5.1-rc1 and later
Dave Anderson
anderson at redhat.com
Mon Apr 15 19:51:36 UTC 2019
----- Original Message -----
> Fix for the "dev -[dD]" options on Linux 5.1-rc1 and later kernels
> that contain commit 570d0200123fb4f809aa2f6226e93a458d664d70,
> titled "driver core: move device->knode_class to device_private".
> Without the patch, the commands fail with the following error message:
>
> dev: invalid structure member offset: device_knode_class
> FILE: dev.c LINE: 4046 FUNCTION: match_klist()
>
> Signed-off-by: Kazuhito Hagio <k-hagio at ab.jp.nec.com>
Thanks Kazu, the patch is queued for crash-7.2.6:
https://github.com/crash-utility/crash/commit/dc70e6a5e0f6f9823070d647b545a8a9282c388e
Dave
> ---
> defs.h | 1 +
> dev.c | 34 ++++++++++++++++++++++++++++++++--
> symbols.c | 2 ++
> 3 files changed, 35 insertions(+), 2 deletions(-)
>
> diff --git a/defs.h b/defs.h
> index 2466681..db192f3 100644
> --- a/defs.h
> +++ b/defs.h
> @@ -2068,6 +2068,7 @@ struct offset_table { /* stash of
> commonly-used offsets */
> long disk_stats_in_flight;
> long cpu_context_save_r7;
> long dentry_d_sb;
> + long device_private_knode_class;
> };
>
> struct size_table { /* stash of commonly-used sizes */
> diff --git a/dev.c b/dev.c
> index 24efea2..91b81f3 100644
> --- a/dev.c
> +++ b/dev.c
> @@ -4020,6 +4020,21 @@ get_gendisk_4(unsigned long entry)
> OFFSET(gendisk_part0);
> }
>
> +/* kernel version >= 5.1 */
> +static unsigned long
> +get_gendisk_5(unsigned long entry)
> +{
> + unsigned long device_address;
> + unsigned long device_private_address;
> +
> + device_private_address = entry - OFFSET(device_private_knode_class);
> + readmem(device_private_address + OFFSET(device_private_device),
> + KVADDR, &device_address, sizeof(device_address),
> + "device_private.device", FAULT_ON_ERROR);
> +
> + return device_address - OFFSET(hd_struct_dev) - OFFSET(gendisk_part0);
> +}
> +
> /* 2.6.24 < kernel version <= 2.6.27 */
> static int
> match_list(struct iter *i, unsigned long entry)
> @@ -4042,8 +4057,18 @@ match_klist(struct iter *i, unsigned long entry)
> {
> unsigned long device_address;
> unsigned long device_type;
> + unsigned long device_private_address;
>
> - device_address = entry - OFFSET(device_knode_class);
> + if (VALID_MEMBER(device_knode_class))
> + device_address = entry - OFFSET(device_knode_class);
> + else {
> + /* kernel version >= 5.1 */
> + device_private_address = entry -
> + OFFSET(device_private_knode_class);
> + readmem(device_private_address + OFFSET(device_private_device),
> + KVADDR, &device_address, sizeof(device_address),
> + "device_private.device", FAULT_ON_ERROR);
> + }
> readmem(device_address + OFFSET(device_type), KVADDR, &device_type,
> sizeof(device_type), "device.type", FAULT_ON_ERROR);
> if (device_type != i->type_address)
> @@ -4348,8 +4373,10 @@ init_iter(struct iter *i)
> i->match = match_klist;
> if (VALID_MEMBER(gendisk_dev))
> i->get_gendisk = get_gendisk_3;
> - else
> + else if (VALID_MEMBER(device_knode_class))
> i->get_gendisk = get_gendisk_4;
> + else
> + i->get_gendisk = get_gendisk_5;
> }
> } else {
> option_not_supported('d');
> @@ -4470,6 +4497,9 @@ void diskio_init(void)
> MEMBER_OFFSET_INIT(device_knode_class, "device", "knode_class");
> MEMBER_OFFSET_INIT(device_node, "device", "node");
> MEMBER_OFFSET_INIT(device_type, "device", "type");
> + MEMBER_OFFSET_INIT(device_private_device, "device_private", "device");
> + MEMBER_OFFSET_INIT(device_private_knode_class, "device_private",
> + "knode_class");
> MEMBER_OFFSET_INIT(gendisk_dev, "gendisk", "dev");
> if (INVALID_MEMBER(gendisk_dev))
> MEMBER_OFFSET_INIT(gendisk_dev, "gendisk", "__dev");
> diff --git a/symbols.c b/symbols.c
> index 1ed75fe..da68eda 100644
> --- a/symbols.c
> +++ b/symbols.c
> @@ -10113,6 +10113,8 @@ dump_offset_table(char *spec, ulong makestruct)
> OFFSET(device_private_device));
> fprintf(fp, " device_private_knode_bus: %ld\n",
> OFFSET(device_private_knode_bus));
> + fprintf(fp, " device_private_knode_class: %ld\n",
> + OFFSET(device_private_knode_class));
> fprintf(fp, " gendisk_dev: %ld\n",
> OFFSET(gendisk_dev));
> fprintf(fp, " gendisk_kobj: %ld\n",
> --
> 2.18.1
>
> --
> Crash-utility mailing list
> Crash-utility at redhat.com
> https://www.redhat.com/mailman/listinfo/crash-utility
>
More information about the Crash-utility
mailing list