From e895a8d9aacde76d8cabfa4991092320b67f5c9d Mon Sep 17 00:00:00 2001 From: themylogin Date: Thu, 16 May 2024 18:14:27 +0200 Subject: [PATCH] Do not crash `zfs.dataset.unlocked_zvols_fast` when `volmode=full` is set (cherry picked from commit 0e79f37c6e74150bb008ec9e014f967107a49161) --- src/middlewared/middlewared/plugins/zfs_/utils.py | 5 +++++ tests/api2/test_zfs_dataset_list.py | 12 ++++++++++++ 2 files changed, 17 insertions(+) create mode 100644 tests/api2/test_zfs_dataset_list.py diff --git a/src/middlewared/middlewared/plugins/zfs_/utils.py b/src/middlewared/middlewared/plugins/zfs_/utils.py index fdc70e46b918e..f55f069c6df33 100644 --- a/src/middlewared/middlewared/plugins/zfs_/utils.py +++ b/src/middlewared/middlewared/plugins/zfs_/utils.py @@ -2,6 +2,7 @@ import enum import logging import os +import re from middlewared.service_exception import MatchNotFound @@ -11,6 +12,7 @@ LEGACY_USERPROP_PREFIX = 'org.freenas' USERPROP_PREFIX = 'org.truenas' +ZD_PARTITION = re.compile(r'zd[0-9]+p[0-9]+$') class TNUserProp(enum.Enum): @@ -133,6 +135,9 @@ def get_zvols(info_level, data): # skip this file continue + if ZD_PARTITION.match(dev_name): + continue + out.update({ zvol_name: { 'path': path, diff --git a/tests/api2/test_zfs_dataset_list.py b/tests/api2/test_zfs_dataset_list.py new file mode 100644 index 0000000000000..b9bab27ca8ca7 --- /dev/null +++ b/tests/api2/test_zfs_dataset_list.py @@ -0,0 +1,12 @@ +from middlewared.test.integration.assets.pool import dataset +from middlewared.test.integration.utils import call, ssh + + +def test__unlocked_zvols_fast__volmode(): + with dataset("container") as container: + ssh(f"zfs set volmode=full {container}") + + with dataset("container/zvol", {"type": "VOLUME", "volsize": 100 * 1024 * 1024}) as zvol: + ssh(f"sgdisk -n 1:1MiB:2MiB /dev/zvol/{zvol}") + + call("zfs.dataset.unlocked_zvols_fast", [["name", "=", zvol]], {}, ["SIZE", "RO", "DEVID", "ATTACHMENT"])