mirror_zfs/module/os/linux/zfs
Christian Schwarz 93e3658035
zvol: call zil_replaying() during replay
zil_replaying(zil, tx) has the side-effect of informing the ZIL that an
entry has been replayed in the (still open) tx.  The ZIL uses that
information to record the replay progress in the ZIL header when that
tx's txg syncs.

ZPL log entries are not idempotent and logically dependent and thus
calling zil_replaying() is necessary for correctness.

For ZVOLs the question of correctness is more nuanced: ZVOL logs only
TX_WRITE and TX_TRUNCATE, both of which are idempotent. Logical
dependencies between two records exist only if the write or discard
request had sync semantics or if the ranges affected by the records
overlap.

Thus, at a first glance, it would be correct to restart replay from
the beginning if we crash before replay completes. But this does not
address the following scenario:
Assume one log record per LWB.
The chain on disk is

    HDR -> 1:W(1, "A") -> 2:W(1, "B") -> 3:W(2, "X") -> 4:W(3, "Z")

where N:W(O, C) represents log entry number N which is a TX_WRITE of C
to offset A.
We replay 1, 2 and 3 in one txg, sync that txg, then crash.
Bit flips corrupt 2, 3, and 4.
We come up again and restart replay from the beginning because
we did not call zil_replaying() during replay.
We replay 1 again, then interpret 2's invalid checksum as the end
of the ZIL chain and call replay done.
The replayed zvol content is "AX".

If we had called zil_replaying() the HDR would have pointed to 3
and our resumed replay would not have replayed anything because
3 was corrupted, resulting in zvol content "BX".

If 3 logically depends on 2 then the replay corrupted the ZVOL_OBJ's
contents.

This patch adds the zil_replaying() calls to the replay functions.
Since the callbacks in the replay function need the zilog_t* pointer
so that they can call zil_replaying() we open the ZIL while
replaying in zvol_create_minor(). We also verify that replay has
been done when on-demand-opening the ZIL on the first modifying
bio.

Reviewed-by: Matthew Ahrens <mahrens@delphix.com>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Christian Schwarz <me@cschwarz.com>
Closes #11667
2021-03-07 09:49:58 -08:00
..
abd_os.c fix abd_nr_pages_off for gang abd 2021-01-28 09:28:20 -08:00
arc_os.c Implement memory and CPU hotplug 2020-12-10 14:09:23 -08:00
Makefile.in Restore FreeBSD resource usage accounting 2021-02-19 22:34:33 -08:00
mmp_os.c Add zfs_multihost_interval tunable handler for FreeBSD 2020-06-23 13:32:42 -07:00
policy.c Share zfs_fsync, zfs_read, zfs_write, et al between Linux and FreeBSD 2020-10-21 14:08:06 -07:00
qat_compress.c Fix QAT allocation failure return value 2020-01-06 11:17:53 -08:00
qat_crypt.c QAT related bug fixes 2019-09-12 13:33:44 -07:00
qat.c QAT related bug fixes 2019-09-12 13:33:44 -07:00
spa_misc_os.c Make spa_history_zone platform-dependent in kernel 2020-03-02 09:43:30 -08:00
trace.c Enable use of DTRACE_PROBE* macros in "spl" module 2019-11-01 13:13:43 -07:00
vdev_disk.c Linux 5.12 compat: bio->bi_disk member moved 2021-02-24 10:04:34 -08:00
vdev_file.c Distributed Spare (dRAID) Feature 2020-11-13 13:51:51 -08:00
zfs_acl.c Intentionally allow ZFS_READONLY in zfs_write 2021-03-07 09:31:52 -08:00
zfs_ctldir.c G/C struct znode -> z_moved 2020-11-10 12:42:47 -08:00
zfs_debug.c FreeBSD: Add support for procfs_list 2020-09-23 16:43:51 -07:00
zfs_dir.c Throw const on some strings 2020-10-02 17:44:10 -07:00
zfs_file_os.c Re-share zfsdev_getminor and zfs_onexit_fd_hold 2020-02-28 14:50:32 -08:00
zfs_ioctl_os.c Linux: increase max nvlist_src size 2021-02-24 09:57:18 -08:00
zfs_racct.c Restore FreeBSD resource usage accounting 2021-02-19 22:34:33 -08:00
zfs_sysfs.c Persistent L2ARC 2020-04-10 10:33:35 -07:00
zfs_uio.c Linux 5.10 compat: restore custom uio_prefaultpages() 2021-01-21 10:43:39 -08:00
zfs_vfsops.c Rename zfs_inode_update to zfs_znode_update_vfs 2021-02-09 11:17:29 -08:00
zfs_vnops_os.c Rename zfs_inode_update to zfs_znode_update_vfs 2021-02-09 11:17:29 -08:00
zfs_znode.c Rename zfs_inode_update to zfs_znode_update_vfs 2021-02-09 11:17:29 -08:00
zio_crypt.c Initialize ZIL buffers 2021-03-05 14:45:13 -08:00
zpl_ctldir.c Linux: Fix ZFS_ENTER/ZFS_EXIT/ZFS_VERFY_ZP usage 2020-11-14 10:19:00 -08:00
zpl_export.c Eliminate Linux specific inode usage from common code 2019-12-11 11:53:57 -08:00
zpl_file.c Extending FreeBSD UIO Struct 2021-01-20 21:27:30 -08:00
zpl_inode.c Extending FreeBSD UIO Struct 2021-01-20 21:27:30 -08:00
zpl_super.c Linux: Fix ZFS_ENTER/ZFS_EXIT/ZFS_VERFY_ZP usage 2020-11-14 10:19:00 -08:00
zpl_xattr.c Extending FreeBSD UIO Struct 2021-01-20 21:27:30 -08:00
zvol_os.c zvol: call zil_replaying() during replay 2021-03-07 09:49:58 -08:00