freebsd-nq/cmd
Justin Gottula f24c7c359e Use substantially more robust program exit status logic in zvol_id
Currently, there are several places in zvol_id where the program logic
returns particular errno values, or even particular ioctl return values,
as the program exit status, rather than a straightforward system of
explicit zero on success and explicit nonzero value(s) on failure.

This is problematic for multiple reasons. One particularly interesting
problem that can arise, is that if any of these values happens to have
all 8 least significant bits unset (i.e., it is a positive or negative
multiple of 256), then although the C program sees a nonzero int value
(presumed to be a failure exit status), the actual exit status as seen
by the system is only the bottom 8 bits of that integer: zero.

This can happen in practice, and I have encountered it myself. In a
particularly weird situation, the zvol_open code in the zfs kernel
module was behaving in such a manner that it caused the open() syscall
to fail and for errno to be set to a kernel-private value (ERESTARTSYS,
which happens to be defined as 512). It turns out that 512 is evenly
divisible by 256; or, in other words, its least significant 8 bits are
all-zero. So even though zvol_id believed it was returning a nonzero
(failure) exit status of 512, the system modulo'd that value by 256,
resulting in the actual exit status visible by other programs being 0!
This actually-zero (non-failure) exit status caused problems: udev
believed that the program was operating successfully, when in fact it
was attempting to indicate failure via a nonzero exit status integer.
Combined with another problem, this led to the creation of nonsense
symlinks for zvol dev nodes by udev.

Let's get rid of all this problematic logic, and simply return
EXIT_SUCCESS (0) is everything went fine, and EXIT_FAILURE (1) if
anything went wrong.

Additionally, let's clarify some of the variable names (error is similar
to errno, etc) and clean up the overall program flow a bit.

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: Pavel Zakharov <pavel.zakharov@delphix.com>
Signed-off-by: Justin Gottula <justin@jgottula.com>
Closes #12302
2021-07-02 13:10:36 -07:00
..
arc_summary Added another missed case to arc_summary3 2021-06-01 15:20:50 -06:00
arcstat
dbufstat
fsck_zfs Turn shellcheck into a normal make target. Fix new files it caught 2021-06-01 11:38:49 -07:00
mount_zfs mount.zfs.8: match to reality; zfsprops.8: add missing temporary options 2021-05-26 21:44:56 -07:00
raidz_test raidz_test: use only async-signal-safe functions in signal handler 2021-05-20 16:37:38 -07:00
vdev_id Turn shellcheck into a normal make target. Fix new files it caught 2021-06-01 11:38:49 -07:00
zdb zdb: zdb_decompress_block: don't needlessly set buf 2021-06-07 20:58:23 -07:00
zed ZED: Match added disk by pool/vdev GUID if found (#12217) 2021-06-30 07:37:20 -07:00
zfs Added error for writing to /dev/ on Linux 2021-06-09 18:57:57 -06:00
zfs_ids_to_path zfs_ids_to_path: print correct wrong values 2021-04-11 11:58:16 -07:00
zgenhostid zgenhostid: use argument path directly 2021-05-20 08:55:31 -07:00
zhack libzfs: convert to -fvisibility=hidden 2021-06-03 13:17:55 -07:00
zinject
zpool Move properties, parameters, events, and concepts around manual sections 2021-06-09 14:35:30 -07:00
zpool_influxdb Move properties, parameters, events, and concepts around manual sections 2021-06-09 14:35:30 -07:00
zstream zstream: force-install zstreamdump link 2021-05-29 20:37:05 -07:00
ztest Annotated dprintf as printf-like 2021-06-22 21:53:45 -07:00
zvol_id Use substantially more robust program exit status logic in zvol_id 2021-07-02 13:10:36 -07:00
zvol_wait Turn shellcheck into a normal make target. Fix new files it caught 2021-06-01 11:38:49 -07:00
Makefile.am Turn shellcheck into a normal make target. Fix new files it caught 2021-06-01 11:38:49 -07:00