From f2a80d889fcc647e00e785280adccc55f3674f6c Mon Sep 17 00:00:00 2001 From: Volker Theile Date: Tue, 24 Dec 2019 16:06:18 +0100 Subject: [PATCH] Issue #543: Fix BTRFS mounting issue. Signed-off-by: Volker Theile --- deb/openmediavault/debian/changelog | 1 + .../system/filesystem/backend/btrfs.inc | 39 ++++++++++++++----- 2 files changed, 31 insertions(+), 9 deletions(-) diff --git a/deb/openmediavault/debian/changelog b/deb/openmediavault/debian/changelog index a34fba7c331..207de4fbfb1 100644 --- a/deb/openmediavault/debian/changelog +++ b/deb/openmediavault/debian/changelog @@ -2,6 +2,7 @@ openmediavault (5.2.1-1) unstable; urgency=low * Issue #542: Add OMV_WATCHDOG_CONF_WATCHDOG_TIMEOUT to customize the watchdog timeout. + * Issue #543: Fix BTRFS mounting issue. -- Volker Theile Sun, 22 Dec 2019 22:18:16 +0100 diff --git a/deb/openmediavault/usr/share/php/openmediavault/system/filesystem/backend/btrfs.inc b/deb/openmediavault/usr/share/php/openmediavault/system/filesystem/backend/btrfs.inc index c4e48323a7d..3342857b622 100644 --- a/deb/openmediavault/usr/share/php/openmediavault/system/filesystem/backend/btrfs.inc +++ b/deb/openmediavault/usr/share/php/openmediavault/system/filesystem/backend/btrfs.inc @@ -35,15 +35,36 @@ class Btrfs extends BackendAbstract { * See parent class definition. */ public function enumerateByBlkid(array $enums) { - // Sort filesystems by device names. - array_sort_key($enums, "devicefile"); - // Filter filesystems with duplicate UUID, e.g. when they are - // used in a RAID. Because of the previous sorting always the - // lower device is used. - // The following example of a RAID1 will return /dev/sdk. - // /dev/sdk: LABEL="TestFS" UUID="b7adba40-b980-4067-b33c-dd5c8ee17044" UUID_SUB="7b19094b-e7df-4a3e-a3db-57e2d4c548b3" TYPE="btrfs" - // /dev/sdl: LABEL="TestFS" UUID="b7adba40-b980-4067-b33c-dd5c8ee17044" UUID_SUB="ba1e2b16-5022-4cbd-ad35-6d609e9560e9" TYPE="btrfs" - return array_unique_key($enums, "uuid"); + $result = []; + // !!! Attention !!! + // We need to keep the following in mind when processing BTRFS + // filesystems: + // * BTRFS will report multiple devices for a RAID. + // * BTRFS seems to randomly use a device file for the canonical + // path from a device of the RAID. + // + // # blkid + // /dev/sdb: LABEL="openmediavaultData" UUID="9b84cea2-3c7b-4f88-b346-f3bc1ee7c804" UUID_SUB="c86b22dd-c08d-47c5-93f3-90bd445931bb" TYPE="btrfs" + // /dev/sda: LABEL="openmediavaultData" UUID="9b84cea2-3c7b-4f88-b346-f3bc1ee7c804" UUID_SUB="04c92e67-4e6e-4cfc-bb71-18f9a109aa35" TYPE="btrfs" + // /dev/sdc: LABEL="openmediavaultData" UUID="9b84cea2-3c7b-4f88-b346-f3bc1ee7c804" UUID_SUB="9756742b-1552-46ce-9631-8e9376e1a918" TYPE="btrfs" + // + // # ls -alh /dev/disk/by-label/openmediavaultData + // lrwxrwxrwx 1 root root 9 Dec 24 14:05 /dev/disk/by-label/openmediavaultData -> ../../sdc + // + // Because of that we need to find out the correct device file + // and return ONLY that device. + // To achieve this, we first filter for unique UUIDs and use + // the /dev/disk/by-uuid/ device file to get the + // canonical one. After that simply get the array element + // related to that device file. + $uniqueEnums = array_unique_key($enums, "uuid"); + foreach ($uniqueEnums as $uniqueEnumk => $uniqueEnumv) { + $canonicalDeviceFile = realpath(sprintf("/dev/disk/by-uuid/%s", + $uniqueEnumv['uuid'])); + $result[] = array_filter_ex($enums, "devicefile", + $canonicalDeviceFile)[0]; + } + return $result; } /**