zfs/cmd
Rob Norris 0ab4172e4c import: require force when cachefile hostid doesn't match on-disk
Previously, if a cachefile is passed to zpool import, the cached config
is mostly offered as-is to ZFS_IOC_POOL_TRYIMPORT->spa_tryimport(), and
the results are taken as the canonical pool config and handed back to
ZFS_IOC_POOL_IMPORT.

In the course of its operation, spa_load() will inspect the pool and
build a new config from what it finds on disk. However, it then
regenerates a new config ready to import, and so rightly sets the hostid
and hostname for the local host in the config it returns.

Because of this, the "require force" checks always decide the pool is
exported and last touched by the local host, even if this is not true,
which is possible in a HA environment when MMP is not enabled. The pool
may be imported on another head, but the import checks still pass here,
so the pool ends up imported on both.

(This doesn't happen when a cachefile isn't used, because the pool
config is discovered in userspace in zpool_find_import(), and that does
find the on-disk hostid and hostname correctly).

Since the systemd zfs-import-cache.service unit uses cachefile imports,
this can lead to a system returning after a crash with a "valid"
cachefile on disk and automatically, quietly, importing a pool that has
already been taken up by a secondary head.

This commit causes the on-disk hostid and hostname to be included in the
ZPOOL_CONFIG_LOAD_INFO item in the returned config, and then changes the
"force" checks for zpool import to use them if present.

This method should give no change in behaviour for old userspace on new
kernels (they won't know to look for the new config items) and for new
userspace on old kernels (the won't find the new config items).

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Rob Norris <rob.norris@klarasystems.com>
Sponsored-by: Klara, Inc.
Sponsored-by: Wasabi Technology, Inc.
Closes #15290
(cherry picked from commit 54b1b1d893)
2024-04-03 10:23:13 +11:00
..
arc_summary Added another missed case to arc_summary3 2021-06-09 13:05:34 -07:00
arcstat FreeBSD: Update usage of py-sysctl 2020-12-10 15:28:31 -08:00
dbufstat Consider `dnode_t` allocations in dbuf cache size accounting 2024-04-03 09:58:25 +11:00
fsck_zfs Turn shellcheck into a normal make target. Fix new files it caught 2021-06-09 13:05:34 -07:00
mount_zfs `mount.zfs -o zfsutil` leverages `zfs_mount_at()` 2022-02-16 17:58:55 -08:00
raidz_test Removed duplicated includes 2021-03-22 12:34:58 -07:00
vdev_id Remove basename(1). Clean up/shorten some coreutils pipelines 2022-02-16 17:58:55 -08:00
zdb zdb: Fix handling of nul termination in symlink targets 2022-05-27 09:19:37 -07:00
zed zed: support subject as header in zed_notify_email() 2022-05-27 09:19:37 -07:00
zfs Fix -Wformat-truncation warning in upgrade_set_callback() 2023-07-31 15:05:56 +00:00
zfs_ids_to_path zfs_ids_to_path: print correct wrong values 2021-04-14 13:19:50 -07:00
zgenhostid zgenhostid: use argument path directly 2021-06-08 14:47:05 -07:00
zhack cppcheck: integrete cppcheck 2021-01-26 16:12:26 -08:00
zinject cppcheck: integrete cppcheck 2021-01-26 16:12:26 -08:00
zpool import: require force when cachefile hostid doesn't match on-disk 2024-04-03 10:23:13 +11:00
zpool_influxdb Use fallthrough macro 2021-11-02 09:50:30 -07:00
zstream Fix erroneous zstreamdump warning 2022-03-01 09:45:48 -08:00
ztest zpool: Provide GUID to zpool-reguid(8) with -g 2023-07-05 13:27:31 +00:00
zvol_id Use substantially more robust program exit status logic in zvol_id 2021-09-14 12:23:38 -07:00
zvol_wait zvol_wait: Ignore locked zvols 2022-05-20 10:33:24 -07:00
Makefile.am Turn shellcheck into a normal make target. Fix new files it caught 2021-06-09 13:05:34 -07:00