mirror_zfs/module/os/linux/zfs
Jitendra Patidar 361a7e8211
log xattr=sa create/remove/update to ZIL
As such, there are no specific synchronous semantics defined for
the xattrs. But for xattr=on, it does log to ZIL and zil_commit() is
done, if sync=always is set on dataset. This provides sync semantics
for xattr=on with sync=always set on dataset.

For the xattr=sa implementation, it doesn't log to ZIL, so, even with
sync=always, xattrs are not guaranteed to be synced before xattr call
returns to caller. So, xattr can be lost if system crash happens, before
txg carrying xattr transaction is synced.

This change adds xattr=sa logging to ZIL on xattr create/remove/update
and xattrs are synced to ZIL (zil_commit() done) for sync=always.
This makes xattr=sa behavior similar to xattr=on.

Implementation notes:
The actual logging is fairly straight-forward and does not warrant
additional explanation.
However, it has been 14 years since we last added new TX types
to the ZIL [1], hence this is the first time we do it after the
introduction of zpool features. Therefore, here is an overview of the
feature activation and deactivation workflow:

1. The feature must be enabled. Otherwise, we don't log the new
    record type. This ensures compatibility with older software.
2. The feature is activated per-dataset, since the ZIL is per-dataset.
3. If the feature is enabled and dataset is not for zvol, any append to
    the ZIL chain will activate the feature for the dataset. Likewise
    for starting a new ZIL chain.
4. A dataset that doesn't have a ZIL chain has the feature deactivated.

We ensure (3) by activating on the first zil_commit() after the feature
was enabled. Since activating the features requires waiting for txg
sync, the first zil_commit() after enabling the feature will be slower
than usual. The downside is that this is really a conservative
approximation: even if we never append a 'TX_SETSAXATTR' to the ZIL
chain, we pay the penalty for feature activation. The upside is that the
user is in control of when we pay the penalty, i.e., upon enabling the
feature.

We ensure (4) by hooking into zil_sync(), where ZIL destroy actually
happens.

One more piece on feature activation, since it's spread across
multiple functions:

zil_commit()
  zil_process_commit_list()
    if lwb == NULL // first zil_commit since zil_open
      zil_create()
        if no log block pointer in ZIL header:
          if feature enabled and not active:
	    // CASE 1
            enable, COALESCE txg wait with dmu_tx that allocated the
	    log block
         else // log block was allocated earlier than this zil_open
          if feature enabled and not active:
	    // CASE 2
            enable, EXPLICIT txg wait
    else // already have an in-DRAM LWB
      if feature enabled and not active:
        // this happens when we enable the feature after zil_create
	// CASE 3
        enable, EXPLICIT txg wait

[1] da6c28aaf6

Reviewed-by: Matthew Ahrens <mahrens@delphix.com>
Reviewed-by: Christian Schwarz <christian.schwarz@nutanix.com>
Reviewed-by: Ahelenia Ziemiańska <nabijaczleweli@nabijaczleweli.xyz>
Reviewed-by: Ryan Moeller <freqlabs@FreeBSD.org>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Jitendra Patidar <jitendra.patidar@nutanix.com>
Closes #8768 
Closes #9078
2022-02-22 13:06:43 -08:00
..
abd_os.c module/*.ko: prune .data, global .rodata 2022-01-14 15:37:55 -08:00
arc_os.c Clean up CSTYLEDs 2022-01-26 11:38:52 -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 Linux 5.12 compat: idmapped mounts 2021-03-19 21:00:59 -07:00
qat_compress.c Modify checksum obtain method of QAT 2021-08-03 11:46:33 -06: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 Add spa _os() hooks 2022-02-15 15:54:25 -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 <4.8 compat: submit_bio() rw arg 2022-01-25 13:12:49 -08:00
vdev_file.c module/*.ko: prune .data, global .rodata 2022-01-14 15:37:55 -08:00
zfs_acl.c module: mark arguments used 2022-02-18 09:34:03 -08:00
zfs_ctldir.c module/*.ko: prune .data, global .rodata 2022-01-14 15:37:55 -08:00
zfs_debug.c module/*.ko: prune .data, global .rodata 2022-01-14 15:37:55 -08:00
zfs_dir.c Clean up use of zfs_log_create in zfs_dir 2021-05-07 15:13:10 -07:00
zfs_file_os.c file reference counts can get corrupted 2021-07-10 19:00:37 -06:00
zfs_ioctl_os.c libzfs: On FreeBSD, use MNT_NOWAIT with getfsstat 2021-06-08 07:36:43 -06:00
zfs_racct.c module: zfs: fix unused, remove argsused 2021-12-23 09:42:47 -08:00
zfs_sysfs.c Vdev Properties Feature 2021-11-30 07:46:25 -07:00
zfs_uio.c Removing old code for k(un)map_atomic 2021-03-19 22:38:44 -07:00
zfs_vfsops.c module: mark arguments used 2022-02-18 09:34:03 -08:00
zfs_vnops_os.c module: mark arguments used 2022-02-18 09:34:03 -08:00
zfs_znode.c module: mark arguments used 2022-02-18 09:34:03 -08:00
zio_crypt.c module: icp: rip out insane crypto_req_handle_t mechanism, inline KM_SLEEP 2022-02-15 16:25:37 -08:00
zpl_ctldir.c module: mark arguments used 2022-02-18 09:34:03 -08:00
zpl_export.c Return required size when encode_fh size too small 2021-05-07 15:08:16 -07:00
zpl_file.c Clean up CSTYLEDs 2022-01-26 11:38:52 -08:00
zpl_inode.c Linux 4.11 compat: statx support 2021-08-17 10:25:58 -07: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 log xattr=sa create/remove/update to ZIL 2022-02-22 13:06:43 -08:00
zvol_os.c zvol: make calls to platform ops static 2022-02-07 10:24:38 -08:00