[Crash-utility] [PATCH] Fix "dev -d" option on Linux 5.11-rc1 and later kernels

lijiang lijiang at redhat.com
Mon Jan 25 07:48:32 UTC 2021


Hi, Kazu
Thanks for the fix.
在 2021年01月19日 17:43, crash-utility-request at redhat.com 写道:
> Date: Tue, 19 Jan 2021 06:03:39 +0000
> From: HAGIO KAZUHITO(?????) 	<k-hagio-ab at nec.com>
> To: "crash-utility at redhat.com" <crash-utility at redhat.com>
> Subject: [Crash-utility] [PATCH] Fix "dev -d" option on Linux 5.11-rc1
> 	and	later kernels
> Message-ID:
> 	<OSBPR01MB19917F02662F0F017A3E7062DDA30 at OSBPR01MB1991.jpnprd01.prod.outlook.com>
> 	
> Content-Type: text/plain; charset="iso-2022-jp"
> 
> Fix the "dev -d" option on Linux 5.11-rc1 and later kernels that
> contains commit 0d02129e76edf91cf04fabf1efbc3a9a1f1d729a
> ("block: merge struct block_device and struct hd_struct").
> Without the patch, the option fails with the error message
> "dev: invalid structure member offset: hd_struct_dev".
> 

This change looks good. Acked-by: Lianbo Jiang <lijiang at redhat.com>

> Signed-off-by: Kazuhito Hagio <k-hagio-ab at nec.com>
> ---
>  defs.h    |  2 ++
>  dev.c     | 29 +++++++++++++++++++++++++----
>  symbols.c |  4 ++++
>  3 files changed, 31 insertions(+), 4 deletions(-)
> 
> diff --git a/defs.h b/defs.h
> index e468b1d99fcf..ffbe73bfb508 100644
> --- a/defs.h
> +++ b/defs.h
> @@ -2128,6 +2128,8 @@ struct offset_table {                    /* stash of commonly-used offsets */
>  	long prb_data_ring_size_bits;
>  	long prb_data_ring_data;
>  	long atomic_long_t_counter;
> +	long block_device_bd_device;
> +	long block_device_bd_stats;
>  };
>  
>  struct size_table {         /* stash of commonly-used sizes */
> diff --git a/dev.c b/dev.c
> index 56e84ab9007c..effe789f38d8 100644
> --- a/dev.c
> +++ b/dev.c
> @@ -4067,13 +4067,22 @@ get_gendisk_5(unsigned long entry)
>  {
>  	unsigned long device_address;
>  	unsigned long device_private_address;
> +	unsigned long gendisk;
>  
>  	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);
> +	if (VALID_MEMBER(hd_struct_dev))
> +		return device_address - OFFSET(hd_struct_dev) - OFFSET(gendisk_part0);
> +
> +	/* kernel version >= 5.11 */
> +	readmem(device_address - OFFSET(block_device_bd_device) +
> +		OFFSET(block_device_bd_disk), KVADDR, &gendisk,
> +		sizeof(ulong), "block_device.bd_disk", FAULT_ON_ERROR);
> +
> +	return gendisk;
>  }
>  
>  /* 2.6.24 < kernel version <= 2.6.27 */
> @@ -4290,9 +4299,19 @@ get_diskio_1(unsigned long rq, unsigned long gendisk, struct diskio *io)
>  			io->read = count[0];
>  			io->write = count[1];
>  		} else {
> -			readmem(gendisk + OFFSET(gendisk_part0) +
> -				OFFSET(hd_struct_dkstats), KVADDR, &dkstats,
> -				sizeof(ulong), "gendisk.part0.dkstats", FAULT_ON_ERROR);
> +			if (VALID_MEMBER(hd_struct_dkstats))
> +				readmem(gendisk + OFFSET(gendisk_part0) +
> +					OFFSET(hd_struct_dkstats), KVADDR, &dkstats,
> +					sizeof(ulong), "gendisk.part0.dkstats", FAULT_ON_ERROR);
> +			else { /* kernel version >= 5.11 */
> +				ulong block_device;
> +				readmem(gendisk + OFFSET(gendisk_part0), KVADDR, &block_device,
> +					sizeof(ulong), "gendisk.part0", FAULT_ON_ERROR);
> +				readmem(block_device + OFFSET(block_device_bd_stats), KVADDR,
> +					&dkstats, sizeof(ulong), "block_device.bd_stats",
> +					FAULT_ON_ERROR);
> +			}
> +
>  			get_one_diskio_from_dkstats(dkstats, io_counts);
>  
>  			io->read = io_counts[0];
> @@ -4549,6 +4568,8 @@ void diskio_init(void)
>  	MEMBER_OFFSET_INIT(gendisk_queue, "gendisk", "queue");
>  	MEMBER_OFFSET_INIT(hd_struct_dev, "hd_struct", "__dev");
>  	MEMBER_OFFSET_INIT(hd_struct_dkstats, "hd_struct", "dkstats");
> +	MEMBER_OFFSET_INIT(block_device_bd_device, "block_device", "bd_device");
> +	MEMBER_OFFSET_INIT(block_device_bd_stats, "block_device", "bd_stats");
>  	MEMBER_OFFSET_INIT(klist_k_list, "klist", "k_list");
>  	MEMBER_OFFSET_INIT(klist_node_n_klist, "klist_node", "n_klist");
>  	MEMBER_OFFSET_INIT(klist_node_n_node, "klist_node", "n_node");
> diff --git a/symbols.c b/symbols.c
> index a51078d58e6b..ed5f731fa1b3 100644
> --- a/symbols.c
> +++ b/symbols.c
> @@ -9291,6 +9291,10 @@ dump_offset_table(char *spec, ulong makestruct)
>  		OFFSET(block_device_bd_list));
>  	fprintf(fp, "          block_device_bd_disk: %ld\n",
>  		OFFSET(block_device_bd_disk));
> +	fprintf(fp, "        block_device_bd_device: %ld\n",
> +		OFFSET(block_device_bd_device));
> +	fprintf(fp, "         block_device_bd_stats: %ld\n",
> +		OFFSET(block_device_bd_stats));
>  	fprintf(fp, "         address_space_nrpages: %ld\n",
>  		OFFSET(address_space_nrpages));
>  	fprintf(fp, "       address_space_page_tree: %ld\n",
> -- 2.18.4




More information about the Crash-utility mailing list