Skip to content

<feature>[storage]: ZSV-12577 support backup encryption change extension#4367

Open
zstack-robot-2 wants to merge 2 commits into
feature-zsv-5.1.0-encryptionfrom
sync/zstackio/dev/encrypted-volume-backup-linked-encryption@@4
Open

<feature>[storage]: ZSV-12577 support backup encryption change extension#4367
zstack-robot-2 wants to merge 2 commits into
feature-zsv-5.1.0-encryptionfrom
sync/zstackio/dev/encrypted-volume-backup-linked-encryption@@4

Conversation

@zstack-robot-2

Copy link
Copy Markdown
Collaborator

Summary

Update volume backup encryption when a volume encryption attribute changes.

Changes

 .../VolumeAfterChangeEncryptionExtensionPoint.java |  7 ++++
 .../java/org/zstack/storage/volume/VolumeBase.java | 40 ++++++++++++++++++++++
 2 files changed, 47 insertions(+)

Testing

  • default env: VMBK-LINKED-ENCRYPTION matrix 12/12 PASS (LocalStorage/NFS/SharedBlock/RBD x full/top/incremental); verified VolumeBackupVO.encrypted, EncryptedResourceKeyRefVO, qemu/LUKS physical state, backing parent retention, and cleanup residuals.

Resolves: ZSV-12577

sync from gitlab !10328

@coderabbitai

coderabbitai Bot commented Jun 30, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

You’ve reached a temporary PR review limit under our Fair Usage Limits Policy.

Your recent review volume is higher than typical usage, so adaptive limits are currently applied.

Next review available in: 33 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 3206e0e2-5857-4a8d-b625-9793e4f48641

📥 Commits

Reviewing files that changed from the base of the PR and between 1539449 and f6e5ab8.

⛔ Files ignored due to path filters (1)
  • conf/springConfigXml/VolumeManager.xml is excluded by !**/*.xml
📒 Files selected for processing (8)
  • header/src/main/java/org/zstack/header/volume/VolumeBackupEncryptionConversionContext.java
  • header/src/main/java/org/zstack/header/volume/VolumeBackupEncryptionConversionExtensionPoint.java
  • plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java
  • plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageBase.java
  • plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorageKVMBackend.java
  • storage/src/main/java/org/zstack/storage/encrypt/VolumeBackupEncryptionConversionExtensionHelper.java
  • storage/src/main/java/org/zstack/storage/encrypt/VolumeEncryptionConversionHostLeaseHelper.java
  • storage/src/main/java/org/zstack/storage/volume/VolumeBase.java

Walkthrough

新增卷备份加密转换扩展点接口,Ceph/Local/NFS 三种主存储的加密转换消息处理改为基于消息携带的 hostUuid 解析并校验目标宿主,Ceph 命令新增 volumeUuid 字段。VolumeBase 引入新的 VolumeEncryptionConversionHostLeaseHelper 实现宿主互斥租约的预留/释放,并在转换流程中新增后置备份加密扩展点调用。

Changes

卷加密转换宿主选择与租约

Layer / File(s) Summary
新增卷备份加密转换扩展点接口
header/.../VolumeBackupEncryptionConversionExtensionPoint.java
声明 convertVolumeBackupEncryption 回调方法接口。
Ceph 宿主解析与命令字段
plugin/ceph/.../CephPrimaryStorageBase.java
KVMHostLuksConvertCmd 新增 volumeUuid;加密转换改为通过 resolveHostForCephLuks(hostUuid) 校验目标宿主连接与关系状态。
本地存储宿主解析校验
plugin/localstorage/.../LocalStorageBase.java
新增 resolveHostForConvertVolumeEncryption,要求 hostUuid 非空并校验其与资源引用及主机状态一致,移除原自动推导逻辑。
NFS 主存储宿主解析与校验
plugin/nfsPrimaryStorage/.../NfsPrimaryStorageKVMBackend.java
新增 resolveHostForConvertVolumeEncryption,校验主机连接、启用、集群归属及关联状态,替代直接取第一个已连接主机。
宿主互斥租约核心实现
storage/.../VolumeEncryptionConversionHostLeaseHelper.java
新增 reserve/release 租约机制(基于 JsonLabelVO 与 GLock)及卷到宿主 uuid 的多策略解析链路。
VolumeBase 接入租约与后置扩展
storage/.../VolumeBase.java
注入租约 helper,changeVolumeEncryption 新增预留宿主、绑定 hostUuid、执行备份加密扩展点、释放租约的完整流程。

Estimated code review effort: 4 (Complex) | ~60 minutes

Sequence Diagram(s)

sequenceDiagram
  participant VolumeBase
  participant VolumeEncryptionConversionHostLeaseHelper
  participant PrimaryStorage
  participant VolumeBackupEncryptionConversionExtensionPoint

  VolumeBase->>VolumeEncryptionConversionHostLeaseHelper: reserve(volume)
  VolumeEncryptionConversionHostLeaseHelper-->>VolumeBase: hostLease
  VolumeBase->>PrimaryStorage: ConvertVolumeEncryptionOnPrimaryStorageMsg(hostUuid)
  PrimaryStorage->>PrimaryStorage: resolveHostForConvertVolumeEncryption/resolveHostForCephLuks
  PrimaryStorage-->>VolumeBase: 转换结果
  VolumeBase->>VolumeBackupEncryptionConversionExtensionPoint: convertVolumeBackupEncryption(volume, encrypted)
  VolumeBase->>VolumeEncryptionConversionHostLeaseHelper: release(hostLease)
  VolumeBase-->>VolumeBase: completion.success/fail
Loading

Poem

小兔子在锁上蹦蹦跳,
一台宿主一次租约保安好。
hostUuid 传得清清楚楚,
加密转换稳稳当当不迷路。
🐇🔐 租约释放,任务收工!

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed 标题与本次变更相关,概括了卷备份加密变更扩展这一核心方向。
Description check ✅ Passed 描述与实际变更总体相关,说明了卷加密属性变更后同步更新备份加密状态。
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch sync/zstackio/dev/encrypted-volume-backup-linked-encryption@@4

Comment @coderabbitai help to get the list of available commands.

@MatheMatrix MatheMatrix force-pushed the sync/zstackio/dev/encrypted-volume-backup-linked-encryption@@4 branch 2 times, most recently from 8fed9b5 to 3d4a11f Compare July 1, 2026 12:46

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Nitpick comments (1)
header/src/main/java/org/zstack/header/volume/VolumeAfterChangeEncryptionExtensionPoint.java (1)

6-6: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

接口方法缺少 Javadoc 注释。

新增的公开扩展点方法未提供 Javadoc,且 encrypted 布尔参数语义(表示变更后的目标加密状态)不够直观,建议补充说明。As per path instructions(“接口方法不应有多余的修饰符(例如 public),且必须配有有效的 Javadoc 注释。”)。

📝 建议补充 Javadoc
 public interface VolumeAfterChangeEncryptionExtensionPoint {
-    void volumeAfterChangeEncryption(VolumeInventory volume, boolean encrypted, Completion completion);
+    /**
+     * 卷加密状态变更完成后的回调扩展点。
+     *
+     * `@param` volume     发生加密状态变更的卷
+     * `@param` encrypted  变更后的目标加密状态:{`@code` true} 表示已加密,{`@code` false} 表示未加密
+     * `@param` completion 异步完成回调
+     */
+    void volumeAfterChangeEncryption(VolumeInventory volume, boolean encrypted, Completion completion);
 }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@header/src/main/java/org/zstack/header/volume/VolumeAfterChangeEncryptionExtensionPoint.java`
at line 6, 新增的扩展点方法 volumeAfterChangeEncryption 缺少必要的 Javadoc,且 encrypted
参数语义需要明确说明。请在该接口方法上补充有效的 Javadoc,说明它在 Volume 加密状态变更完成后触发,并清楚标注 encrypted
表示变更后的目标加密状态;同时检查该接口方法签名,避免显式 public 等多余修饰符。

Source: Path instructions

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@storage/src/main/java/org/zstack/storage/volume/VolumeBase.java`:
- Around line 3670-3683: The host lease created in
createVolumeEncryptionConversionHostLease() is persisted via JsonLabelVO but
only removed on normal release paths, so crashes can leave a permanent stale
lease. Add an expiration/recovery mechanism to the lease model (for example
include a TTL or creation timestamp in labelValue or a dedicated field) and make
reserve()/lease acquisition prune expired leases before blocking. Also update
releaseVolumeEncryptionConversionHost() and any lease lookup logic to treat
expired or unreachable leases as reclaimable so later conversions on the same
host do not stall indefinitely.
- Around line 3629-3667: The reserveVolumeEncryptionConversionHost() loop blocks
the flow worker thread with repeated sleep while waiting for the host lease,
which can exhaust the SimpleFlowChain/_syncpool workers. Refactor this wait path
to avoid synchronous polling inside the flow: move the retry to an async
scheduled retry/requeue, or use a non-blocking backoff with a much shorter
maximum wait. Keep the lease checks and ownership validation in
reserveVolumeEncryptionConversionHost(), but ensure the thread is released
between attempts instead of holding it in the while(true) loop.

---

Nitpick comments:
In
`@header/src/main/java/org/zstack/header/volume/VolumeAfterChangeEncryptionExtensionPoint.java`:
- Line 6: 新增的扩展点方法 volumeAfterChangeEncryption 缺少必要的 Javadoc,且 encrypted
参数语义需要明确说明。请在该接口方法上补充有效的 Javadoc,说明它在 Volume 加密状态变更完成后触发,并清楚标注 encrypted
表示变更后的目标加密状态;同时检查该接口方法签名,避免显式 public 等多余修饰符。
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: d6040e8c-07cf-4689-a6f7-af3e68b9b779

📥 Commits

Reviewing files that changed from the base of the PR and between 45e799e and 3d4a11f.

📒 Files selected for processing (6)
  • header/src/main/java/org/zstack/header/volume/VolumeAfterChangeEncryptionExtensionPoint.java
  • plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java
  • plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageKvmBackend.java
  • plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorageKVMBackend.java
  • plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorageKVMBackendCommands.java
  • storage/src/main/java/org/zstack/storage/volume/VolumeBase.java

Comment thread storage/src/main/java/org/zstack/storage/volume/VolumeBase.java Outdated
Comment thread storage/src/main/java/org/zstack/storage/volume/VolumeBase.java Outdated
@MatheMatrix MatheMatrix force-pushed the sync/zstackio/dev/encrypted-volume-backup-linked-encryption@@4 branch 7 times, most recently from 1d5be06 to 1539449 Compare July 1, 2026 15:01

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

♻️ Duplicate comments (2)
storage/src/main/java/org/zstack/storage/volume/VolumeBase.java (1)

3353-3358: 🩺 Stability & Availability | 🟠 Major | 🏗️ Heavy lift

避免在 Flow 线程中同步等待宿主租约。

reserve(self) 内部会按 3 秒间隔阻塞等待,最长 2 小时;这里在 Flow.run() 中同步调用,会长期占用卷操作链路线程。建议改为异步重试/调度,或让 helper 暴露非阻塞 reserve 尝试接口。

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@storage/src/main/java/org/zstack/storage/volume/VolumeBase.java` around lines
3353 - 3358, The Flow.run() implementation in VolumeBase is synchronously
calling volumeEncryptionConversionHostLeaseHelper.reserve(self), which can block
a Flow thread for a long time. Change this step to avoid blocking by using an
asynchronous retry/scheduling approach, or add a non-blocking try-reserve API on
VolumeEncryptionConversionHostLeaseHelper and have the flow continue or
reschedule based on that result. Keep the host lease handling around
hostLease.set(...) and trigger.next() in the updated async/non-blocking path.
storage/src/main/java/org/zstack/storage/encrypt/VolumeEncryptionConversionHostLeaseHelper.java (1)

76-91: 🩺 Stability & Availability | 🟠 Major | 🏗️ Heavy lift

为持久化租约增加过期/回收机制。

当前 labelValue 只保存 vmUuid::volumeUuid,且只有正常 release() 才删除;管理节点在持有租约期间异常退出后,同宿主其他 VM 会持续失败,同 VM 会反复等到超时。建议写入过期时间/心跳并在 reserve() 时回收过期租约。

Also applies to: 151-157

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@storage/src/main/java/org/zstack/storage/encrypt/VolumeEncryptionConversionHostLeaseHelper.java`
around lines 76 - 91, The lease stored by
VolumeEncryptionConversionHostLeaseHelper has no expiration or reclaim path, so
stale JsonLabelVO entries can block other VMs after a manager crash. Update the
reservation flow in reserve()/createLease() to persist an expiry or heartbeat in
the labelValue, and in reserve() detect and reclaim expired leases before
deciding ownership; also ensure release() still clears the label normally. Use
the existing leaseKey(), leaseVmUuid(), and createLease()/release() paths to
keep the ownership check consistent.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorageKVMBackend.java`:
- Around line 2414-2423: The NfsPrimaryStorageKVMBackend host-state check only
rejects PrimaryStorageHostStatus.Disconnected, so null and Connecting can still
pass; update the validation around the PrimaryStorageHostRefVO lookup to
explicitly require PrimaryStorageHostStatus.Connected. Use the status check in
NfsPrimaryStorageKVMBackend where inv.getUuid() and hostUuid are used, and throw
OperationFailureException for any non-Connected result with a message that
clearly states the host must be connected to the NFS primary storage.

In `@storage/src/main/java/org/zstack/storage/volume/VolumeBase.java`:
- Around line 3434-3473: The current NoRollbackFlow in
VolumeBase.convert-volume-backup-encryption updates backup encryption before the
volume DB change and has no rollback, so partial extension success or later
failure can leave state inconsistent. Refactor this step to use a compensable or
idempotent recovery path: either move the encryption conversion to a
post-DB-success task with explicit retry handling, or add a matching
rollback/revert mechanism around VolumeBackupEncryptionConversionExtensionPoint
so failures can restore prior backup encryption state cleanly.

---

Duplicate comments:
In
`@storage/src/main/java/org/zstack/storage/encrypt/VolumeEncryptionConversionHostLeaseHelper.java`:
- Around line 76-91: The lease stored by
VolumeEncryptionConversionHostLeaseHelper has no expiration or reclaim path, so
stale JsonLabelVO entries can block other VMs after a manager crash. Update the
reservation flow in reserve()/createLease() to persist an expiry or heartbeat in
the labelValue, and in reserve() detect and reclaim expired leases before
deciding ownership; also ensure release() still clears the label normally. Use
the existing leaseKey(), leaseVmUuid(), and createLease()/release() paths to
keep the ownership check consistent.

In `@storage/src/main/java/org/zstack/storage/volume/VolumeBase.java`:
- Around line 3353-3358: The Flow.run() implementation in VolumeBase is
synchronously calling volumeEncryptionConversionHostLeaseHelper.reserve(self),
which can block a Flow thread for a long time. Change this step to avoid
blocking by using an asynchronous retry/scheduling approach, or add a
non-blocking try-reserve API on VolumeEncryptionConversionHostLeaseHelper and
have the flow continue or reschedule based on that result. Keep the host lease
handling around hostLease.set(...) and trigger.next() in the updated
async/non-blocking path.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: e13d3414-f565-4052-a202-b9d77b36b307

📥 Commits

Reviewing files that changed from the base of the PR and between 3d4a11f and 1539449.

⛔ Files ignored due to path filters (1)
  • conf/springConfigXml/VolumeManager.xml is excluded by !**/*.xml
📒 Files selected for processing (6)
  • header/src/main/java/org/zstack/header/volume/VolumeBackupEncryptionConversionExtensionPoint.java
  • plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageBase.java
  • plugin/localstorage/src/main/java/org/zstack/storage/primary/local/LocalStorageBase.java
  • plugin/nfsPrimaryStorage/src/main/java/org/zstack/storage/primary/nfs/NfsPrimaryStorageKVMBackend.java
  • storage/src/main/java/org/zstack/storage/encrypt/VolumeEncryptionConversionHostLeaseHelper.java
  • storage/src/main/java/org/zstack/storage/volume/VolumeBase.java
✅ Files skipped from review due to trivial changes (1)
  • header/src/main/java/org/zstack/header/volume/VolumeBackupEncryptionConversionExtensionPoint.java

Comment thread storage/src/main/java/org/zstack/storage/volume/VolumeBase.java Outdated
@MatheMatrix MatheMatrix force-pushed the sync/zstackio/dev/encrypted-volume-backup-linked-encryption@@4 branch 5 times, most recently from 6a9f0a0 to c97b5e7 Compare July 1, 2026 17:20
@MatheMatrix

Copy link
Copy Markdown
Owner

Comment from yaohua.wu:

Review: MR !10328 — ZSV-12577

Background

  • Jira: ZSV-12577 — 【虚拟机加密】备份创建虚拟机未按创建弹窗加密开关加密
  • Bug summary: 本组 MR 让卷加密属性变化时同步转换关联 Volume Backup 的物理 bits、DB encrypted 状态和 key ref,避免后续基于备份创建 VM 时加密状态不一致。
  • Intent & scope: zstack 提供扩展点、host lease 和主存储 hostUuid 透传;premium 执行 backup chain 转换和 DB/key ref 更新;utility/zstore 执行实际 zstore pull/convert/upload。
  • Round 1 initial findings: 1 × Critical,位于 premium 的 backup chain leaf 选择逻辑,会影响四仓联合功能。
  • Suggested fix direction: 转换任一祖先 backup 时必须以整条 chain 的最新 leaf 作为转换边界,并同步更新所有被重写 backup 的 ref/key metadata。

关联 MR

MR 关系
zstackio/premium !14473 实现 VolumeBackupEncryptionConversionExtension,构造 backup chain 转换命令并更新 backup refs/key refs。
zstackio/zstack-utility !7378 新增 KVM agent /vm/volumes/backup/convertencryption,负责 pull、convert、upload backup chain。
zstackio/zstack-store !1126 为 zstore pull/rebase 增加 encrypted qcow2 chain 支持。

本仓结论

Severity File:Line Issue Fix
🟢 Suggestion storage/src/main/java/org/zstack/storage/volume/VolumeBase.java:3454 zstack 侧扩展点调用、host lease、ConvertVolumeEncryptionOnPrimaryStorageMsg.hostUuid 与其它仓接口对齐;本仓未发现独立 blocker。 无需本仓改动,需等待 premium 侧 chain 完整性问题修复后联合验证。

跨仓阻塞

Severity File:Line Issue Fix
🔴 Critical crypto/src/main/java/org/zstack/crypto/volumebackup/VolumeBackupEncryptionConversionExtension.java:281 premium 侧用 findLeafRecord(candidateChainRecords) 只选“需要改变 encrypted 状态”的最新 backup 作为 leaf。若同一 zstore chain 已有混合状态,例如 A/B 为 plain、后代 C 已 encrypted,再把 volume 切到 encrypted 时只会转换并删除 A/B 的旧 bits,C 的 manifest/ref 仍指向旧 B,后续从 C 恢复会断链。 在 premium 中按 allRecordsByChain 的最新 leaf 构造转换范围;只要转换了任一祖先,就重写到最新后代,并对所有被重写的 backup ref/key metadata 做一致更新;补一个 mixed-state chain 集成测试。

Coverage

  • Upstream freshness: 四个 MR 的 target branch 相对 head 未发现新增提交;merge_status=can_be_merged
  • Generated-file filter: 0 skipped。
  • 本地测试: 未运行;本轮基于 GitLab metadata + local worktree diff + 跨仓静态链路验证。

Verdict: REVISION_REQUIRED

跨仓 backup chain 完整性问题修复前,本组 MR 不建议合入。


🤖 Robot Reviewer

@MatheMatrix MatheMatrix force-pushed the sync/zstackio/dev/encrypted-volume-backup-linked-encryption@@4 branch from c97b5e7 to 05c0e65 Compare July 2, 2026 05:28
@ZStack-Robot

Copy link
Copy Markdown
Collaborator

Comment from 周众:

kvmagent/kvmagent/plugins/vm_plugin.py:9709

source secret 和 target secret肯定是同一个。

@MatheMatrix MatheMatrix force-pushed the sync/zstackio/dev/encrypted-volume-backup-linked-encryption@@4 branch from 05c0e65 to 6172697 Compare July 4, 2026 09:22
zhong.zhou added 2 commits July 4, 2026 17:42
Resolves: ZSV-12469

Change-Id: I5ed4f9f00e700e4818a5c440b6dc5b04edee9c79
Resolves: ZSV-12577

Change-Id: I224e974f90f555267e06174179023c449eae1cd3
@MatheMatrix MatheMatrix force-pushed the sync/zstackio/dev/encrypted-volume-backup-linked-encryption@@4 branch from 6172697 to f6e5ab8 Compare July 5, 2026 05:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants