]> git.proxmox.com Git - mirror_zfs.git/commitdiff
ZIL: Remove TX_CLONE_RANGE replay for ZVOLs.
authorAlexander Motin <mav@FreeBSD.org>
Fri, 1 Dec 2023 23:23:20 +0000 (18:23 -0500)
committerGitHub <noreply@github.com>
Fri, 1 Dec 2023 23:23:20 +0000 (15:23 -0800)
zil_claim_clone_range() takes references on cloned blocks before ZIL
replay.  Later zil_free_clone_range() drops them after replay or on
dataset destroy.  The total balance is neutral.  It means we do not
need to do anything (drop the references) for not implemented yet
TX_CLONE_RANGE replay for ZVOLs.

This is a logical follow up to #15603.

Reviewed-by: Kay Pedersen <mail@mkwg.de>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Alexander Motin <mav@FreeBSD.org>
Sponsored by: iXsystems, Inc.
Closes #15612

module/zfs/zvol.c

index ce5b75462349dcab20f949fb1088a3aa11dd951b..5b6a3f5cb410d76e9b4137d5600f88ae4d28e33b 100644 (file)
@@ -515,64 +515,6 @@ zvol_replay_write(void *arg1, void *arg2, boolean_t byteswap)
        return (error);
 }
 
-/*
- * Replay a TX_CLONE_RANGE ZIL transaction that didn't get committed
- * after a system failure.
- *
- * TODO: For now we drop block cloning transations for ZVOLs as they are
- *       unsupported, but we still need to inform BRT about that as we
- *       claimed them during pool import.
- *       This situation can occur when we try to import a pool from a ZFS
- *       version supporting block cloning for ZVOLs into a system that
- *       has this ZFS version, that doesn't support block cloning for ZVOLs.
- */
-static int
-zvol_replay_clone_range(void *arg1, void *arg2, boolean_t byteswap)
-{
-       char name[ZFS_MAX_DATASET_NAME_LEN];
-       zvol_state_t *zv = arg1;
-       objset_t *os = zv->zv_objset;
-       lr_clone_range_t *lr = arg2;
-       blkptr_t *bp;
-       dmu_tx_t *tx;
-       spa_t *spa;
-       uint_t ii;
-       int error;
-
-       ASSERT3U(lr->lr_common.lrc_reclen, >=, sizeof (*lr));
-       ASSERT3U(lr->lr_common.lrc_reclen, >=, offsetof(lr_clone_range_t,
-           lr_bps[lr->lr_nbps]));
-
-       dmu_objset_name(os, name);
-       cmn_err(CE_WARN, "ZFS dropping block cloning transaction for %s.",
-           name);
-
-       if (byteswap)
-               byteswap_uint64_array(lr, sizeof (*lr));
-
-       tx = dmu_tx_create(os);
-       error = dmu_tx_assign(tx, TXG_WAIT);
-       if (error) {
-               dmu_tx_abort(tx);
-               return (error);
-       }
-
-       spa = os->os_spa;
-
-       for (ii = 0; ii < lr->lr_nbps; ii++) {
-               bp = &lr->lr_bps[ii];
-
-               if (!BP_IS_HOLE(bp)) {
-                       zio_free(spa, dmu_tx_get_txg(tx), bp);
-               }
-       }
-
-       (void) zil_replaying(zv->zv_zilog, tx);
-       dmu_tx_commit(tx);
-
-       return (0);
-}
-
 static int
 zvol_replay_err(void *arg1, void *arg2, boolean_t byteswap)
 {
@@ -607,7 +549,7 @@ zil_replay_func_t *const zvol_replay_vector[TX_MAX_TYPE] = {
        zvol_replay_err,        /* TX_SETSAXATTR */
        zvol_replay_err,        /* TX_RENAME_EXCHANGE */
        zvol_replay_err,        /* TX_RENAME_WHITEOUT */
-       zvol_replay_clone_range /* TX_CLONE_RANGE */
+       zvol_replay_err,        /* TX_CLONE_RANGE */
 };
 
 /*