1
0
mirror of https://git.FreeBSD.org/src.git synced 2024-12-01 08:27:59 +00:00
freebsd/tools/diag/prtblknos
Jessica Clarke 5b13fa7987 ufs: Rework shortlink handling to avoid subobject overflows
Shortlinks occupy the space of both di_db and di_ib when used. However,
everywhere that wants to read or write a shortlink takes a pointer do
di_db and promptly runs off the end of it into di_ib. This is fine on
most architectures, if a little dodgy. However, on CHERI, the compiler
can optionally restrict the bounds on pointers to subobjects to just
that subobject, in order to mitigate intra-object buffer overflows, and
this is enabled in CheriBSD's pure-capability kernels.

Instead, clean this up by inserting a union such that a new di_shortlink
can be added with the right size and element type, avoiding the need to
cast and allowing the use of the DIP macro to access the field. This
also mirrors how the ext2fs code implements extents support, with the
exact same structure other than having a uint32_t i_data[] instead of a
char di_shortlink[].

Reviewed by:	mckusick, jhb
Differential Revision:	https://reviews.freebsd.org/D33650
2022-01-02 20:55:36 +00:00
..
main.c
Makefile
prtblknos.c ufs: Rework shortlink handling to avoid subobject overflows 2022-01-02 20:55:36 +00:00
README

# $FreeBSD$

This is a little C-program that can be used to print out the list
of blocks used by a requested list of inodes.

For example, to list the blocks referenced by your kernel:

guest_12 % df /
Filesystem      1K-blocks     Used   Avail Capacity  Mounted on
/dev/gpt/rootfs  20307196 10707336 7975288    57%    /

guest_12 % ls -i /boot/kernel/kernel
160603 /boot/kernel/kernel

guest_12 % ./prtblknos /dev/gpt/rootfs 160603
160603:	lbn 0-7 blkno 3217584-3217647
	lbn 8-11 blkno 3217864-3217895 distance 216
First-level indirect, blkno 3217896-3217903 distance 0
	lbn 12-19 blkno 3217904-3217967 distance 8
	lbn 20-75 blkno 3251816-3252263 distance 33848
	lbn 76-83 blkno 3252368-3252431 distance 104
	lbn 84-91 blkno 3252464-3252527 distance 32
	lbn 92-852 blkno 3252896-3258983 distance 368

Each contiguous range of blocks is printed on a line.
The distance metric is the size of the gap from the end of the
previous set of blocks to the beginning of the next set of blocks.
Short distances are desirable.

The logical block numbers (lbn above) describe filesystem-block
size blocks which by today's default is 32Kb.

The physical block numbers (blkno above) describe the smallest piece
of disk space that an inode can reference which is a filesystem
fragment. Since the default size for fragments today is 4Kb, the
physical block numbers reference 4Kb blocks. The distances listed
above are also in physical block size units. Thus a distance of 8
means a separation of just one 32Kb block. For example lbn 11, ends
at 3217895, the 32Kb first level indirect immediately follows it at
3217896-3217903, and lbn 12 starts distance 8 after lbn 11 immediately
after the indirect block at 3217904.

If you were to create a filesystem with the fragment size equal to
half the block size (say 32Kb blocks with 16Kb fragments) then the
physical block numbers listed would be 16Kb in size.

	Marshall Kirk McKusick
	January 19, 2018