New version
- Do not require an exclusive lock on the device to commit part stuff (vpodzime) - Prevent failure if there are no btrfs subvolumes (vpodzime) - Fix the test for getting version of a failing utility (vpodzime) - Also run the utils tests (vpodzime) - Bump the version of the pkgconfig module (vpodzime) - Include utils.h in plugins that need it (vpodzime) - Fix dependency check in fs plugin (vtrefny) - Add support for setting part id (part type) on msdos part tables (vtrefny) - Trim the extra info for MD RAID's name (vpodzime) - Add xfsprogs and dosfstools as dependencies of the fs plugin (vpodzime) - Fix md_name_from_node to work with the "/dev/" prefix (vpodzime) - New upstream major version
This commit is contained in:
parent
f5e2c15206
commit
07ec7ae0f4
1
.gitignore
vendored
1
.gitignore
vendored
@ -21,3 +21,4 @@
|
|||||||
/libblockdev-1.7.tar.gz
|
/libblockdev-1.7.tar.gz
|
||||||
/libblockdev-1.8.tar.gz
|
/libblockdev-1.8.tar.gz
|
||||||
/libblockdev-1.9.tar.gz
|
/libblockdev-1.9.tar.gz
|
||||||
|
/libblockdev-2.1.tar.gz
|
||||||
|
@ -1,87 +0,0 @@
|
|||||||
From 5e4095722244d989a6a594a933c314a633c4bfd2 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Vratislav Podzimek <vpodzime@redhat.com>
|
|
||||||
Date: Thu, 25 Aug 2016 16:26:28 +0200
|
|
||||||
Subject: [PATCH] Explicitly cast number constants for GVariants
|
|
||||||
|
|
||||||
Otherwise they may become really weird numbers.
|
|
||||||
|
|
||||||
(cherry-picked from commit 4222a693a1b709aa8a243b6eeda376eb9d79d56a)
|
|
||||||
|
|
||||||
Signed-off-by: Vratislav Podzimek <vpodzime@redhat.com>
|
|
||||||
---
|
|
||||||
src/plugins/lvm-dbus.c | 16 ++++++++--------
|
|
||||||
1 file changed, 8 insertions(+), 8 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/src/plugins/lvm-dbus.c b/src/plugins/lvm-dbus.c
|
|
||||||
index 8303fe1..844e36e 100644
|
|
||||||
--- a/src/plugins/lvm-dbus.c
|
|
||||||
+++ b/src/plugins/lvm-dbus.c
|
|
||||||
@@ -1156,9 +1156,9 @@ gboolean bd_lvm_pvmove (gchar *src, gchar *dest, GError **error) {
|
|
||||||
|
|
||||||
g_variant_builder_init (&builder, G_VARIANT_TYPE_TUPLE);
|
|
||||||
g_variant_builder_add_value (&builder, g_variant_new ("s", src_path));
|
|
||||||
- g_variant_builder_add_value (&builder, g_variant_new ("(tt)", 0, 0));
|
|
||||||
+ g_variant_builder_add_value (&builder, g_variant_new ("(tt)", (guint64) 0, (guint64) 0));
|
|
||||||
if (dest) {
|
|
||||||
- dest_var = g_variant_new ("(ott)", dest_path, 0, 0);
|
|
||||||
+ dest_var = g_variant_new ("(ott)", dest_path, (guint64) 0, (guint64) 0);
|
|
||||||
g_variant_builder_add_value (&builder, g_variant_new_array (NULL, &dest_var, 1));
|
|
||||||
} else {
|
|
||||||
type = g_variant_type_new ("a(ott)");
|
|
||||||
@@ -1372,7 +1372,7 @@ gboolean bd_lvm_vgrename (gchar *old_vg_name, gchar *new_vg_name, GError **error
|
|
||||||
* Returns: whether the VG was successfully activated or not
|
|
||||||
*/
|
|
||||||
gboolean bd_lvm_vgactivate (gchar *vg_name, GError **error) {
|
|
||||||
- GVariant *params = g_variant_new ("(t)", 0);
|
|
||||||
+ GVariant *params = g_variant_new ("(t)", (guint64) 0);
|
|
||||||
call_lvm_obj_method_sync (vg_name, VG_INTF, "Activate", params, NULL, error);
|
|
||||||
return ((*error) == NULL);
|
|
||||||
}
|
|
||||||
@@ -1385,7 +1385,7 @@ gboolean bd_lvm_vgactivate (gchar *vg_name, GError **error) {
|
|
||||||
* Returns: whether the VG was successfully deactivated or not
|
|
||||||
*/
|
|
||||||
gboolean bd_lvm_vgdeactivate (gchar *vg_name, GError **error) {
|
|
||||||
- GVariant *params = g_variant_new ("(t)", 0);
|
|
||||||
+ GVariant *params = g_variant_new ("(t)", (guint64) 0);
|
|
||||||
call_lvm_obj_method_sync (vg_name, VG_INTF, "Deactivate", params, NULL, error);
|
|
||||||
return ((*error) == NULL);
|
|
||||||
}
|
|
||||||
@@ -1609,7 +1609,7 @@ gboolean bd_lvm_lvcreate (gchar *vg_name, gchar *lv_name, guint64 size, gchar *t
|
|
||||||
g_variant_builder_clear (&builder);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
- g_variant_builder_add_value (&builder, g_variant_new ("(ott)", path, 0, 0));
|
|
||||||
+ g_variant_builder_add_value (&builder, g_variant_new ("(ott)", path, (guint64) 0, (guint64) 0));
|
|
||||||
}
|
|
||||||
pvs = g_variant_builder_end (&builder);
|
|
||||||
g_variant_builder_clear (&builder);
|
|
||||||
@@ -1723,7 +1723,7 @@ gboolean bd_lvm_lvresize (gchar *vg_name, gchar *lv_name, guint64 size, GError *
|
|
||||||
* Returns: whether the @vg_name/@lv_name LV was successfully activated or not
|
|
||||||
*/
|
|
||||||
gboolean bd_lvm_lvactivate (gchar *vg_name, gchar *lv_name, gboolean ignore_skip, GError **error) {
|
|
||||||
- GVariant *params = g_variant_new ("(t)", 0);
|
|
||||||
+ GVariant *params = g_variant_new ("(t)", (guint64) 0);
|
|
||||||
GVariantBuilder builder;
|
|
||||||
GVariant *extra = NULL;
|
|
||||||
|
|
||||||
@@ -1747,7 +1747,7 @@ gboolean bd_lvm_lvactivate (gchar *vg_name, gchar *lv_name, gboolean ignore_skip
|
|
||||||
* Returns: whether the @vg_name/@lv_name LV was successfully deactivated or not
|
|
||||||
*/
|
|
||||||
gboolean bd_lvm_lvdeactivate (gchar *vg_name, gchar *lv_name, GError **error) {
|
|
||||||
- GVariant *params = g_variant_new ("(t)", 0);
|
|
||||||
+ GVariant *params = g_variant_new ("(t)", (guint64) 0);
|
|
||||||
call_lv_method_sync (vg_name, lv_name, "Deactivate", params, NULL, error);
|
|
||||||
return (*error == NULL);
|
|
||||||
}
|
|
||||||
@@ -2109,7 +2109,7 @@ gboolean bd_lvm_thsnapshotcreate (gchar *vg_name, gchar *origin_name, gchar *sna
|
|
||||||
|
|
||||||
g_variant_builder_init (&builder, G_VARIANT_TYPE_TUPLE);
|
|
||||||
g_variant_builder_add_value (&builder, g_variant_new ("s", snapshot_name));
|
|
||||||
- g_variant_builder_add_value (&builder, g_variant_new ("t", 0));
|
|
||||||
+ g_variant_builder_add_value (&builder, g_variant_new ("t", (guint64) 0));
|
|
||||||
params = g_variant_builder_end (&builder);
|
|
||||||
g_variant_builder_clear (&builder);
|
|
||||||
|
|
||||||
--
|
|
||||||
2.7.4
|
|
||||||
|
|
@ -1,30 +0,0 @@
|
|||||||
From ad4679efb8ae455d984aa78bb7e264af9646ea29 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Vratislav Podzimek <vpodzime@redhat.com>
|
|
||||||
Date: Fri, 30 Sep 2016 12:18:01 +0200
|
|
||||||
Subject: [PATCH 1/2] Fix the number passed to LVM DBus as a job-creation
|
|
||||||
timeout
|
|
||||||
|
|
||||||
It's in seconds not milliseconds like the DBus method call timeout.
|
|
||||||
|
|
||||||
Resolves: rhbz#1378970
|
|
||||||
Signed-off-by: Vratislav Podzimek <vpodzime@redhat.com>
|
|
||||||
---
|
|
||||||
src/plugins/lvm-dbus.c | 2 +-
|
|
||||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/src/plugins/lvm-dbus.c b/src/plugins/lvm-dbus.c
|
|
||||||
index 844e36e..9500dcb 100644
|
|
||||||
--- a/src/plugins/lvm-dbus.c
|
|
||||||
+++ b/src/plugins/lvm-dbus.c
|
|
||||||
@@ -58,7 +58,7 @@ static gchar *global_config_str = NULL;
|
|
||||||
#define DBUS_PROPS_IFACE "org.freedesktop.DBus.Properties"
|
|
||||||
#define DBUS_INTRO_IFACE "org.freedesktop.DBus.Introspectable"
|
|
||||||
#define DBUS_LONG_CALL_TIMEOUT 10000 /* msecs */
|
|
||||||
-#define METHOD_CALL_TIMEOUT (DBUS_LONG_CALL_TIMEOUT / 2)
|
|
||||||
+#define METHOD_CALL_TIMEOUT (DBUS_LONG_CALL_TIMEOUT / 2) / 1000 /* secs */
|
|
||||||
|
|
||||||
static GDBusConnection *bus = NULL;
|
|
||||||
|
|
||||||
--
|
|
||||||
2.7.4
|
|
||||||
|
|
@ -1,20 +1,11 @@
|
|||||||
Name: libblockdev
|
Name: libblockdev
|
||||||
Version: 1.9
|
Version: 2.1
|
||||||
Release: 8%{?dist}
|
Release: 1%{?dist}
|
||||||
Summary: A library for low-level manipulation with block devices
|
Summary: A library for low-level manipulation with block devices
|
||||||
License: LGPLv2+
|
License: LGPLv2+
|
||||||
URL: https://github.com/rhinstaller/libblockdev
|
URL: https://github.com/rhinstaller/libblockdev
|
||||||
Source0: https://github.com/rhinstaller/libblockdev/archive/%{name}-%{version}.tar.gz
|
Source0: https://github.com/rhinstaller/libblockdev/archive/%{name}-%{version}.tar.gz
|
||||||
|
|
||||||
Patch0: cast_numbers.patch
|
|
||||||
Patch1: dbus_job_creation_timeout.patch
|
|
||||||
Patch2: mdadm_raid_level_quirk.patch
|
|
||||||
Patch3: mdadm_examine_export.patch
|
|
||||||
Patch4: mdadm_examine_uuid.patch
|
|
||||||
Patch5: mdadm_fw_raid_device.patch
|
|
||||||
Patch6: obj_path_signatures.patch
|
|
||||||
Patch7: md_examine_migrated.patch
|
|
||||||
|
|
||||||
BuildRequires: glib2-devel
|
BuildRequires: glib2-devel
|
||||||
BuildRequires: gobject-introspection-devel
|
BuildRequires: gobject-introspection-devel
|
||||||
BuildRequires: cryptsetup-devel
|
BuildRequires: cryptsetup-devel
|
||||||
@ -174,6 +165,8 @@ Summary: Development files for the libblockdev-fs plugin/library
|
|||||||
Requires: %{name}-fs%{?_isa} = %{version}-%{release}
|
Requires: %{name}-fs%{?_isa} = %{version}-%{release}
|
||||||
Requires: %{name}-utils-devel%{?_isa}
|
Requires: %{name}-utils-devel%{?_isa}
|
||||||
Requires: glib2-devel
|
Requires: glib2-devel
|
||||||
|
Requires: xfsprogs
|
||||||
|
Requires: dosfstools
|
||||||
|
|
||||||
%description fs-devel
|
%description fs-devel
|
||||||
This package contains header files and pkg-config files needed for development
|
This package contains header files and pkg-config files needed for development
|
||||||
@ -305,6 +298,7 @@ Summary: The partitioning plugin for the libblockdev library
|
|||||||
Requires: %{name}-utils%{?_isa} >= 0.11
|
Requires: %{name}-utils%{?_isa} >= 0.11
|
||||||
Requires: device-mapper-multipath
|
Requires: device-mapper-multipath
|
||||||
Requires: gdisk
|
Requires: gdisk
|
||||||
|
Requires: util-linux
|
||||||
|
|
||||||
%description part
|
%description part
|
||||||
The libblockdev library plugin (and in the same time a standalone library)
|
The libblockdev library plugin (and in the same time a standalone library)
|
||||||
@ -384,14 +378,6 @@ A meta-package that pulls all the libblockdev plugins as dependencies.
|
|||||||
|
|
||||||
%prep
|
%prep
|
||||||
%setup -q -n %{name}-%{version}
|
%setup -q -n %{name}-%{version}
|
||||||
%patch0 -p1
|
|
||||||
%patch1 -p1
|
|
||||||
%patch2 -p1
|
|
||||||
%patch3 -p1
|
|
||||||
%patch4 -p1
|
|
||||||
%patch5 -p1
|
|
||||||
%patch6 -p1
|
|
||||||
%patch7 -p1
|
|
||||||
|
|
||||||
%build
|
%build
|
||||||
%configure
|
%configure
|
||||||
@ -460,13 +446,16 @@ find %{buildroot} -type f -name "*.la" | xargs %{__rm}
|
|||||||
|
|
||||||
%files utils
|
%files utils
|
||||||
%{_libdir}/libbd_utils.so.*
|
%{_libdir}/libbd_utils.so.*
|
||||||
|
%{_libdir}/libbd_part_err.so.*
|
||||||
|
|
||||||
%files utils-devel
|
%files utils-devel
|
||||||
%{_libdir}/libbd_utils.so
|
%{_libdir}/libbd_utils.so
|
||||||
|
%{_libdir}/libbd_part_err.so
|
||||||
%dir %{_includedir}/blockdev
|
%dir %{_includedir}/blockdev
|
||||||
%{_includedir}/blockdev/utils.h
|
%{_includedir}/blockdev/utils.h
|
||||||
%{_includedir}/blockdev/sizes.h
|
%{_includedir}/blockdev/sizes.h
|
||||||
%{_includedir}/blockdev/exec.h
|
%{_includedir}/blockdev/exec.h
|
||||||
|
%{_includedir}/blockdev/extra_arg.h
|
||||||
|
|
||||||
|
|
||||||
%files btrfs
|
%files btrfs
|
||||||
@ -589,6 +578,22 @@ find %{buildroot} -type f -name "*.la" | xargs %{__rm}
|
|||||||
%files plugins-all
|
%files plugins-all
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Thu Nov 10 2016 Vratislav Podzimek <vpodzime@redhat.com> - 2.1-1
|
||||||
|
- Do not require an exclusive lock on the device to commit part stuff (vpodzime)
|
||||||
|
- Prevent failure if there are no btrfs subvolumes (vpodzime)
|
||||||
|
- Fix the test for getting version of a failing utility (vpodzime)
|
||||||
|
- Also run the utils tests (vpodzime)
|
||||||
|
- Bump the version of the pkgconfig module (vpodzime)
|
||||||
|
- Include utils.h in plugins that need it (vpodzime)
|
||||||
|
- Fix dependency check in fs plugin (vtrefny)
|
||||||
|
- Add support for setting part id (part type) on msdos part tables (vtrefny)
|
||||||
|
- Trim the extra info for MD RAID's name (vpodzime)
|
||||||
|
- Add xfsprogs and dosfstools as dependencies of the fs plugin (vpodzime)
|
||||||
|
- Fix md_name_from_node to work with the "/dev/" prefix (vpodzime)
|
||||||
|
|
||||||
|
* Wed Nov 2 2016 Vratislav Podzimek <vpodzime@redhat.com> - 2.0-1
|
||||||
|
- New major upstream release
|
||||||
|
|
||||||
* Wed Nov 9 2016 Vratislav Podzimek <vpodzime@redhat.com> - 1.9-8
|
* Wed Nov 9 2016 Vratislav Podzimek <vpodzime@redhat.com> - 1.9-8
|
||||||
- Revert "Prevent issues between libparted and udev" (vpodzime)
|
- Revert "Prevent issues between libparted and udev" (vpodzime)
|
||||||
- Revert "Open the device file as RDWR when committing parts" (vpodzime)
|
- Revert "Open the device file as RDWR when committing parts" (vpodzime)
|
||||||
|
@ -1,160 +0,0 @@
|
|||||||
From 673422da37ce9f96b44a182addd1aa922a9b047f Mon Sep 17 00:00:00 2001
|
|
||||||
From: Adam Williamson <awilliam@redhat.com>
|
|
||||||
Date: Mon, 24 Oct 2016 14:41:47 -0700
|
|
||||||
Subject: [PATCH] Handle mdadm --examine output during migration
|
|
||||||
|
|
||||||
If a RAID set is undergoing any operation considered to be a
|
|
||||||
'migration' - which includes initialization of a new set at any
|
|
||||||
RAID level that includes redundancy - mdadm --examine will have
|
|
||||||
lines like this:
|
|
||||||
|
|
||||||
RAID Level : 5 <-- 5
|
|
||||||
Members : 3 <-- 3
|
|
||||||
Map State : normal <-- uninitialized
|
|
||||||
|
|
||||||
At present we don't understand this at all. This is a fairly
|
|
||||||
minimal fix which just has parse_mdadm_vars notice such lines,
|
|
||||||
split the 'value' on "<--", and stuff the first value (the one
|
|
||||||
being migrated *to*, which is usually what we care about, I
|
|
||||||
think) into the table. We could do something more elaborate
|
|
||||||
like store both values and make `get_examine_data_from_table`
|
|
||||||
understand that, but it's more complicated and this should be
|
|
||||||
all we truly need for now.
|
|
||||||
|
|
||||||
(cherry picked from commit 07aec87385e2fdbe3f0855d697facf04b9ea6521)
|
|
||||||
Signed-off-by: Vratislav Podzimek <vpodzime@redhat.com>
|
|
||||||
---
|
|
||||||
src/plugins/mdraid.c | 13 +++++-
|
|
||||||
tests/md_test.py | 8 ++++
|
|
||||||
tests/mdadm_fw_RAID_examine_migrate/mdadm | 69 +++++++++++++++++++++++++++++++
|
|
||||||
3 files changed, 88 insertions(+), 2 deletions(-)
|
|
||||||
create mode 100755 tests/mdadm_fw_RAID_examine_migrate/mdadm
|
|
||||||
|
|
||||||
diff --git a/src/plugins/mdraid.c b/src/plugins/mdraid.c
|
|
||||||
index 9cb0cc7..c4780eb 100644
|
|
||||||
--- a/src/plugins/mdraid.c
|
|
||||||
+++ b/src/plugins/mdraid.c
|
|
||||||
@@ -155,6 +155,7 @@ static GHashTable* parse_mdadm_vars (gchar *str, gchar *item_sep, gchar *key_val
|
|
||||||
gchar **items = NULL;
|
|
||||||
gchar **item_p = NULL;
|
|
||||||
gchar **key_val = NULL;
|
|
||||||
+ gchar **vals = NULL;
|
|
||||||
|
|
||||||
table = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
|
|
||||||
*num_items = 0;
|
|
||||||
@@ -165,8 +166,16 @@ static GHashTable* parse_mdadm_vars (gchar *str, gchar *item_sep, gchar *key_val
|
|
||||||
if (g_strv_length (key_val) == 2) {
|
|
||||||
/* we only want to process valid lines (with the separator) */
|
|
||||||
/* only use the first value for the given key */
|
|
||||||
- if (!g_hash_table_contains (table, g_strstrip (key_val[0])))
|
|
||||||
- g_hash_table_insert (table, g_strstrip (key_val[0]), g_strstrip (key_val[1]));
|
|
||||||
+ if (!g_hash_table_contains (table, g_strstrip (key_val[0]))) {
|
|
||||||
+ if (strstr (key_val[1], "<--")) {
|
|
||||||
+ /* mdadm --examine output for a set being migrated */
|
|
||||||
+ vals = g_strsplit (key_val[1], "<--", 2);
|
|
||||||
+ g_hash_table_insert (table, g_strstrip (key_val[0]), g_strstrip (vals[0]));
|
|
||||||
+ g_free (vals[1]);
|
|
||||||
+ } else {
|
|
||||||
+ g_hash_table_insert (table, g_strstrip (key_val[0]), g_strstrip (key_val[1]));
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
(*num_items)++;
|
|
||||||
} else
|
|
||||||
/* invalid line, just free key_val */
|
|
||||||
diff --git a/tests/md_test.py b/tests/md_test.py
|
|
||||||
index d7e007a..926d0c5 100644
|
|
||||||
--- a/tests/md_test.py
|
|
||||||
+++ b/tests/md_test.py
|
|
||||||
@@ -415,6 +415,14 @@ class FakeMDADMutilTest(unittest.TestCase):
|
|
||||||
|
|
||||||
self.assertIs(ex_data.metadata, None)
|
|
||||||
|
|
||||||
+ def test_fw_raid_migrating(self):
|
|
||||||
+ """Verify that md_examine works when array is migrating ("foo <-- bar" values in output) """
|
|
||||||
+
|
|
||||||
+ with fake_utils("tests/mdadm_fw_RAID_examine_migrate"):
|
|
||||||
+ ex_data = BlockDev.md_examine("fake_dev")
|
|
||||||
+
|
|
||||||
+ self.assertEqual(ex_data.chunk_size, 128 * 1024)
|
|
||||||
+
|
|
||||||
|
|
||||||
class MDUnloadTest(unittest.TestCase):
|
|
||||||
def setUp(self):
|
|
||||||
diff --git a/tests/mdadm_fw_RAID_examine_migrate/mdadm b/tests/mdadm_fw_RAID_examine_migrate/mdadm
|
|
||||||
new file mode 100755
|
|
||||||
index 0000000..36ab0ca
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/tests/mdadm_fw_RAID_examine_migrate/mdadm
|
|
||||||
@@ -0,0 +1,69 @@
|
|
||||||
+#!/bin/bash
|
|
||||||
+
|
|
||||||
+echo "$@"|grep -- "--brief" &>/dev/null
|
|
||||||
+is_brief=$?
|
|
||||||
+
|
|
||||||
+echo "$@"|grep -- "--export" &>/dev/null
|
|
||||||
+is_export=$?
|
|
||||||
+
|
|
||||||
+if [ $is_brief -eq 0 ]; then
|
|
||||||
+ cat <<EOF
|
|
||||||
+ARRAY metadata=imsm UUID=83c77249:90fb26a2:882bfb52:87f71b59
|
|
||||||
+ARRAY /dev/md/Volume0 container=83c77249:90fb26a2:882bfb52:87f71b59 member=0 UUID=76508998:aea211a0:b4fa4eda:78e41fbb
|
|
||||||
+EOF
|
|
||||||
+elif [ $is_export -eq 0 ]; then
|
|
||||||
+ cat <<EOF
|
|
||||||
+MD_METADATA=imsm
|
|
||||||
+MD_LEVEL=container
|
|
||||||
+MD_UUID=83c77249:90fb26a2:882bfb52:87f71b59
|
|
||||||
+MD_DEVICES=3
|
|
||||||
+EOF
|
|
||||||
+else
|
|
||||||
+ cat <<EOF
|
|
||||||
+/dev/sda:
|
|
||||||
+ Magic : Intel Raid ISM Cfg Sig.
|
|
||||||
+ Version : 1.2.02
|
|
||||||
+ Orig Family : 56330de5
|
|
||||||
+ Family : 56330de5
|
|
||||||
+ Generation : 00000005
|
|
||||||
+ Attributes : All supported
|
|
||||||
+ UUID : 83c77249:90fb26a2:882bfb52:87f71b59
|
|
||||||
+ Checksum : 359f2642 correct
|
|
||||||
+ MPB Sectors : 2
|
|
||||||
+ Disks : 3
|
|
||||||
+ RAID Devices : 1
|
|
||||||
+
|
|
||||||
+ Disk00 Serial : 50026B723702E422
|
|
||||||
+ State : active
|
|
||||||
+ Id : 00000000
|
|
||||||
+ Usable Size : 234436872 (111.79 GiB 120.03 GB)
|
|
||||||
+
|
|
||||||
+[Volume0]:
|
|
||||||
+ UUID : 76508998:aea211a0:b4fa4eda:78e41fbb
|
|
||||||
+ RAID Level : 5 <-- 5
|
|
||||||
+ Members : 3 <-- 3
|
|
||||||
+ Slots : [UUU] <-- [UUU]
|
|
||||||
+ Failed disk : none
|
|
||||||
+ This Slot : 0
|
|
||||||
+ Array Size : 468873216 (223.58 GiB 240.06 GB)
|
|
||||||
+ Per Dev Size : 234436872 (111.79 GiB 120.03 GB)
|
|
||||||
+ Sector Offset : 0
|
|
||||||
+ Num Stripes : 915768
|
|
||||||
+ Chunk Size : 128 KiB <-- 128 KiB
|
|
||||||
+ Reserved : 0
|
|
||||||
+ Migrate State : initialize
|
|
||||||
+ Map State : normal <-- uninitialized
|
|
||||||
+ Checkpoint : 0 (768)
|
|
||||||
+ Dirty State : clean
|
|
||||||
+
|
|
||||||
+ Disk01 Serial : 2327B37FS
|
|
||||||
+ State : active
|
|
||||||
+ Id : 00000002
|
|
||||||
+ Usable Size : 976768392 (465.76 GiB 500.11 GB)
|
|
||||||
+
|
|
||||||
+ Disk02 Serial : 232K7DDFS
|
|
||||||
+ State : active
|
|
||||||
+ Id : 00000003
|
|
||||||
+ Usable Size : 976768392 (465.76 GiB 500.11 GB)
|
|
||||||
+EOF
|
|
||||||
+fi
|
|
||||||
--
|
|
||||||
2.7.4
|
|
||||||
|
|
@ -1,92 +0,0 @@
|
|||||||
From 0773e654b2eb446518692535bb349f8abcd17af0 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Vratislav Podzimek <vpodzime@redhat.com>
|
|
||||||
Date: Tue, 4 Oct 2016 19:08:06 +0200
|
|
||||||
Subject: [PATCH 1/3] Use 'mdadm --examine --export' to get MD RAID level
|
|
||||||
|
|
||||||
It may not be reported properly in the 'mdadm --examine' output (e.g. for IMSM
|
|
||||||
FW RAID).
|
|
||||||
|
|
||||||
Related: rhbz#1379865
|
|
||||||
|
|
||||||
(cherry-picked from commit 075c21c6a474674c1370472b2cf74f93dff28c38)
|
|
||||||
|
|
||||||
Signed-off-by: Vratislav Podzimek <vpodzime@redhat.com>
|
|
||||||
---
|
|
||||||
src/plugins/mdraid.c | 20 ++++++++++++++++++++
|
|
||||||
tests/md_test.py | 2 +-
|
|
||||||
tests/mdadm_fw_RAID_examine/mdadm | 10 ++++++++++
|
|
||||||
3 files changed, 31 insertions(+), 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/src/plugins/mdraid.c b/src/plugins/mdraid.c
|
|
||||||
index 723b756..7e6b2da 100644
|
|
||||||
--- a/src/plugins/mdraid.c
|
|
||||||
+++ b/src/plugins/mdraid.c
|
|
||||||
@@ -798,6 +798,26 @@ BDMDExamineData* bd_md_examine (gchar *device, GError **error) {
|
|
||||||
g_free (orig_data);
|
|
||||||
}
|
|
||||||
|
|
||||||
+ argv[2] = "--export";
|
|
||||||
+ success = bd_utils_exec_and_capture_output (argv, &output, error);
|
|
||||||
+ if (!success)
|
|
||||||
+ /* error is already populated */
|
|
||||||
+ return FALSE;
|
|
||||||
+
|
|
||||||
+ /* try to get a better information about RAID level because it may be
|
|
||||||
+ misleading in the output without --export */
|
|
||||||
+ output_fields = g_strsplit (output, "\n", 0);
|
|
||||||
+ g_free (output);
|
|
||||||
+ output = NULL;
|
|
||||||
+ for (i=0; (i < g_strv_length (output_fields) - 1); i++)
|
|
||||||
+ if (g_str_has_prefix (output_fields[i], "MD_LEVEL=")) {
|
|
||||||
+ value = strchr (output_fields[i], '=');
|
|
||||||
+ value++;
|
|
||||||
+ g_free (ret->level);
|
|
||||||
+ ret->level = g_strdup (value);
|
|
||||||
+ }
|
|
||||||
+ g_strfreev (output_fields);
|
|
||||||
+
|
|
||||||
argv[2] = "--brief";
|
|
||||||
success = bd_utils_exec_and_capture_output (argv, &output, error);
|
|
||||||
if (!success)
|
|
||||||
diff --git a/tests/md_test.py b/tests/md_test.py
|
|
||||||
index df90582..4b4d898 100644
|
|
||||||
--- a/tests/md_test.py
|
|
||||||
+++ b/tests/md_test.py
|
|
||||||
@@ -410,7 +410,7 @@ class FakeMDADMutilTest(unittest.TestCase):
|
|
||||||
with fake_utils("tests/mdadm_fw_RAID_examine"):
|
|
||||||
ex_data = BlockDev.md_examine("fake_dev")
|
|
||||||
|
|
||||||
- self.assertEqual(ex_data.level, "0")
|
|
||||||
+ self.assertEqual(ex_data.level, "container")
|
|
||||||
self.assertEqual(ex_data.num_devices, 1)
|
|
||||||
|
|
||||||
def test_no_metadata_examine(self):
|
|
||||||
diff --git a/tests/mdadm_fw_RAID_examine/mdadm b/tests/mdadm_fw_RAID_examine/mdadm
|
|
||||||
index c939860..6fe7f64 100755
|
|
||||||
--- a/tests/mdadm_fw_RAID_examine/mdadm
|
|
||||||
+++ b/tests/mdadm_fw_RAID_examine/mdadm
|
|
||||||
@@ -3,11 +3,21 @@
|
|
||||||
echo "$@"|grep -- "--brief" &>/dev/null
|
|
||||||
is_brief=$?
|
|
||||||
|
|
||||||
+echo "$@"|grep -- "--export" &>/dev/null
|
|
||||||
+is_export=$?
|
|
||||||
+
|
|
||||||
if [ $is_brief -eq 0 ]; then
|
|
||||||
cat <<EOF
|
|
||||||
ARRAY metadata=imsm UUID=b42756a2:37e43e47:674bd1dd:6e822145
|
|
||||||
ARRAY /dev/md/Volume0 container=b42756a2:37e43e47:674bd1dd:6e822145 member=0 UUID=8f0b5240:06168ed1:bbafeaf5:2a7b04fc
|
|
||||||
EOF
|
|
||||||
+elif [ $is_export -eq 0 ]; then
|
|
||||||
+ cat <<EOF
|
|
||||||
+MD_METADATA=imsm
|
|
||||||
+MD_LEVEL=container
|
|
||||||
+MD_UUID=b42756a2:37e43e47:674bd1dd:6e822145
|
|
||||||
+MD_DEVICES=2
|
|
||||||
+EOF
|
|
||||||
else
|
|
||||||
cat <<EOF
|
|
||||||
/dev/sda:
|
|
||||||
--
|
|
||||||
2.7.4
|
|
||||||
|
|
@ -1,59 +0,0 @@
|
|||||||
From 15d5cb5679d69bb016edd8659362bb4c23b3573d Mon Sep 17 00:00:00 2001
|
|
||||||
From: Vratislav Podzimek <vpodzime@redhat.com>
|
|
||||||
Date: Tue, 4 Oct 2016 21:12:06 +0200
|
|
||||||
Subject: [PATCH 2/3] Search for just "UUID" in mdadm --examine output
|
|
||||||
|
|
||||||
IMSM raid arrays don't have the "Array UUID" key reported, it's just "UUID". And
|
|
||||||
as a bonus, the volume UUID is reported as well as the container's UUID (we care
|
|
||||||
about), both using just "UUID".
|
|
||||||
|
|
||||||
Related: rhbz#1379865
|
|
||||||
|
|
||||||
(cherry-picked from commit 0fb4e778b8a30200ed6e4272e9427d109f993eb2)
|
|
||||||
|
|
||||||
Signed-off-by: Vratislav Podzimek <vpodzime@redhat.com>
|
|
||||||
---
|
|
||||||
src/plugins/mdraid.c | 7 ++++++-
|
|
||||||
tests/md_test.py | 1 +
|
|
||||||
2 files changed, 7 insertions(+), 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/src/plugins/mdraid.c b/src/plugins/mdraid.c
|
|
||||||
index 7e6b2da..5bfbfb8 100644
|
|
||||||
--- a/src/plugins/mdraid.c
|
|
||||||
+++ b/src/plugins/mdraid.c
|
|
||||||
@@ -164,7 +164,9 @@ static GHashTable* parse_mdadm_vars (gchar *str, gchar *item_sep, gchar *key_val
|
|
||||||
key_val = g_strsplit (*item_p, key_val_sep, 2);
|
|
||||||
if (g_strv_length (key_val) == 2) {
|
|
||||||
/* we only want to process valid lines (with the separator) */
|
|
||||||
- g_hash_table_insert (table, g_strstrip (key_val[0]), g_strstrip (key_val[1]));
|
|
||||||
+ /* only use the first value for the given key */
|
|
||||||
+ if (!g_hash_table_contains (table, g_strstrip (key_val[0])))
|
|
||||||
+ g_hash_table_insert (table, g_strstrip (key_val[0]), g_strstrip (key_val[1]));
|
|
||||||
(*num_items)++;
|
|
||||||
} else
|
|
||||||
/* invalid line, just free key_val */
|
|
||||||
@@ -211,6 +213,9 @@ static BDMDExamineData* get_examine_data_from_table (GHashTable *table, gboolean
|
|
||||||
data->size = 0;
|
|
||||||
|
|
||||||
data->uuid = g_strdup ((gchar*) g_hash_table_lookup (table, "Array UUID"));
|
|
||||||
+ if (!data->uuid)
|
|
||||||
+ /* also try just "UUID" which may be reported e.g for IMSM FW RAID */
|
|
||||||
+ data->uuid = g_strdup ((gchar*) g_hash_table_lookup (table, "UUID"));
|
|
||||||
|
|
||||||
value = (gchar*) g_hash_table_lookup (table, "Update Time");
|
|
||||||
if (value) {
|
|
||||||
diff --git a/tests/md_test.py b/tests/md_test.py
|
|
||||||
index 4b4d898..2fab378 100644
|
|
||||||
--- a/tests/md_test.py
|
|
||||||
+++ b/tests/md_test.py
|
|
||||||
@@ -412,6 +412,7 @@ class FakeMDADMutilTest(unittest.TestCase):
|
|
||||||
|
|
||||||
self.assertEqual(ex_data.level, "container")
|
|
||||||
self.assertEqual(ex_data.num_devices, 1)
|
|
||||||
+ self.assertEqual(ex_data.uuid, "b42756a2-37e4-3e47-674b-d1dd6e822145")
|
|
||||||
|
|
||||||
def test_no_metadata_examine(self):
|
|
||||||
"""Verify that md_examine works as expected with no metadata spec"""
|
|
||||||
--
|
|
||||||
2.7.4
|
|
||||||
|
|
@ -1,112 +0,0 @@
|
|||||||
From 8123db9319a26c59996d4c42e84100ebe5822b82 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Vratislav Podzimek <vpodzime@redhat.com>
|
|
||||||
Date: Tue, 4 Oct 2016 21:19:22 +0200
|
|
||||||
Subject: [PATCH 3/3] Do not report volume name for FW RAID container device
|
|
||||||
|
|
||||||
This may be confusing for tools/libraries using our API because they need info
|
|
||||||
about the immediate descendant device which is the container.
|
|
||||||
|
|
||||||
Related: rhbz#1379865
|
|
||||||
|
|
||||||
(cherry-picked from commit ad6eb3d47c57171cea7abbae0f5d0c1f5ee2c357)
|
|
||||||
|
|
||||||
Signed-off-by: Vratislav Podzimek <vpodzime@redhat.com>
|
|
||||||
---
|
|
||||||
src/plugins/mdraid.c | 13 ++++++++-----
|
|
||||||
tests/md_test.py | 12 ++----------
|
|
||||||
tests/mdadm_fw_raid_examine/mdadm | 18 ------------------
|
|
||||||
3 files changed, 10 insertions(+), 33 deletions(-)
|
|
||||||
delete mode 100755 tests/mdadm_fw_raid_examine/mdadm
|
|
||||||
|
|
||||||
diff --git a/src/plugins/mdraid.c b/src/plugins/mdraid.c
|
|
||||||
index 5bfbfb8..9cb0cc7 100644
|
|
||||||
--- a/src/plugins/mdraid.c
|
|
||||||
+++ b/src/plugins/mdraid.c
|
|
||||||
@@ -768,7 +768,7 @@ BDMDExamineData* bd_md_examine (gchar *device, GError **error) {
|
|
||||||
gchar **output_fields = NULL;
|
|
||||||
gchar *orig_data = NULL;
|
|
||||||
guint i = 0;
|
|
||||||
- gboolean found_dev_name = FALSE;
|
|
||||||
+ gboolean found_array_line = FALSE;
|
|
||||||
|
|
||||||
success = bd_utils_exec_and_capture_output (argv, &output, error);
|
|
||||||
if (!success)
|
|
||||||
@@ -831,13 +831,16 @@ BDMDExamineData* bd_md_examine (gchar *device, GError **error) {
|
|
||||||
|
|
||||||
/* try to find the "ARRAY /dev/md/something" pair in the output */
|
|
||||||
output_fields = g_strsplit_set (output, " \n", 0);
|
|
||||||
- for (i=0; !found_dev_name && (i < g_strv_length (output_fields) - 1); i++)
|
|
||||||
- if (g_strcmp0 (output_fields[i], "ARRAY") == 0)
|
|
||||||
+ for (i=0; !found_array_line && (i < g_strv_length (output_fields) - 1); i++)
|
|
||||||
+ if (g_strcmp0 (output_fields[i], "ARRAY") == 0) {
|
|
||||||
+ found_array_line = TRUE;
|
|
||||||
if (g_str_has_prefix (output_fields[i+1], "/dev/md/")) {
|
|
||||||
ret->device = g_strdup (output_fields[i+1]);
|
|
||||||
- found_dev_name = TRUE;
|
|
||||||
+ } else {
|
|
||||||
+ ret->device = NULL;
|
|
||||||
}
|
|
||||||
- if (!found_dev_name)
|
|
||||||
+ }
|
|
||||||
+ if (!found_array_line)
|
|
||||||
ret->device = NULL;
|
|
||||||
g_strfreev (output_fields);
|
|
||||||
|
|
||||||
diff --git a/tests/md_test.py b/tests/md_test.py
|
|
||||||
index 2fab378..d7e007a 100644
|
|
||||||
--- a/tests/md_test.py
|
|
||||||
+++ b/tests/md_test.py
|
|
||||||
@@ -395,17 +395,8 @@ class MDTestNameNodeBijection(MDTestCase):
|
|
||||||
|
|
||||||
class FakeMDADMutilTest(unittest.TestCase):
|
|
||||||
# no setUp nor tearDown needed, we are gonna use fake utils
|
|
||||||
-
|
|
||||||
- def test_fw_raid_examine(self):
|
|
||||||
- """Verify that md_examine works as expected on FW RAID data"""
|
|
||||||
-
|
|
||||||
- with fake_utils("tests/mdadm_fw_raid_examine"):
|
|
||||||
- ex_data = BlockDev.md_examine("fake_dev")
|
|
||||||
-
|
|
||||||
- self.assertEqual(ex_data.device, "/dev/md/Volume0")
|
|
||||||
-
|
|
||||||
def test_fw_raid_uppercase_examine(self):
|
|
||||||
- """Verify that md_examine works with output using "RAID" instead of "Raid" """
|
|
||||||
+ """Verify that md_examine works with output using "RAID" instead of "Raid" and other quirks """
|
|
||||||
|
|
||||||
with fake_utils("tests/mdadm_fw_RAID_examine"):
|
|
||||||
ex_data = BlockDev.md_examine("fake_dev")
|
|
||||||
@@ -413,6 +404,7 @@ class FakeMDADMutilTest(unittest.TestCase):
|
|
||||||
self.assertEqual(ex_data.level, "container")
|
|
||||||
self.assertEqual(ex_data.num_devices, 1)
|
|
||||||
self.assertEqual(ex_data.uuid, "b42756a2-37e4-3e47-674b-d1dd6e822145")
|
|
||||||
+ self.assertEqual(ex_data.device, None)
|
|
||||||
|
|
||||||
def test_no_metadata_examine(self):
|
|
||||||
"""Verify that md_examine works as expected with no metadata spec"""
|
|
||||||
diff --git a/tests/mdadm_fw_raid_examine/mdadm b/tests/mdadm_fw_raid_examine/mdadm
|
|
||||||
deleted file mode 100755
|
|
||||||
index 54ec4ed..0000000
|
|
||||||
--- a/tests/mdadm_fw_raid_examine/mdadm
|
|
||||||
+++ /dev/null
|
|
||||||
@@ -1,18 +0,0 @@
|
|
||||||
-#!/bin/bash
|
|
||||||
-
|
|
||||||
-echo "$@"|grep -- "--brief" &>/dev/null
|
|
||||||
-is_brief=$?
|
|
||||||
-
|
|
||||||
-if [ $is_brief -eq 0 ]; then
|
|
||||||
- cat <<EOF
|
|
||||||
-ARRAY metadata=imsm UUID=e0fb362e:9865d1c0:cdb0f5e3:27c9a085
|
|
||||||
-ARRAY /dev/md/Volume0 container=e0fb362e:9865d1c0:cdb0f5e3:27c9a085 member=0 UUID=1d1335e9:79d4be6a:e16b7fa7:fe8c41f6
|
|
||||||
-EOF
|
|
||||||
-else
|
|
||||||
- cat <<EOF
|
|
||||||
-MD_METADATA=imsm
|
|
||||||
-MD_LEVEL=container
|
|
||||||
-MD_UUID=e0fb362e:9865d1c0:cdb0f5e3:27c9a085
|
|
||||||
-MD_DEVICES=2
|
|
||||||
-EOF
|
|
||||||
-fi
|
|
||||||
--
|
|
||||||
2.7.4
|
|
||||||
|
|
@ -1,121 +0,0 @@
|
|||||||
From dc98c0d0eaf06af42c6f9eb3ee5ade9e237c5f40 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Vratislav Podzimek <vpodzime@redhat.com>
|
|
||||||
Date: Fri, 30 Sep 2016 13:47:24 +0200
|
|
||||||
Subject: [PATCH 2/2] Try to search for "RAID Level" in mdadm's output
|
|
||||||
(#1379865)
|
|
||||||
|
|
||||||
mdadm's API (CLI) is ambiguous and may provide the RAID level as either the
|
|
||||||
"RAID Level" or "Raid Level" item. Since we store these items in a hashtable,
|
|
||||||
let's try to lookup both if the first one fails. Another approach would be to
|
|
||||||
cannonicalize all the items keys when creating the hash table, but that seems
|
|
||||||
like an overkill for one weird quirk.
|
|
||||||
|
|
||||||
Signed-off-by: Vratislav Podzimek <vpodzime@redhat.com>
|
|
||||||
---
|
|
||||||
src/plugins/mdraid.c | 6 +++++
|
|
||||||
tests/md_test.py | 9 +++++++
|
|
||||||
tests/mdadm_fw_RAID_examine/mdadm | 53 +++++++++++++++++++++++++++++++++++++++
|
|
||||||
3 files changed, 68 insertions(+)
|
|
||||||
create mode 100755 tests/mdadm_fw_RAID_examine/mdadm
|
|
||||||
|
|
||||||
diff --git a/src/plugins/mdraid.c b/src/plugins/mdraid.c
|
|
||||||
index abd97da..723b756 100644
|
|
||||||
--- a/src/plugins/mdraid.c
|
|
||||||
+++ b/src/plugins/mdraid.c
|
|
||||||
@@ -184,8 +184,14 @@ static BDMDExamineData* get_examine_data_from_table (GHashTable *table, gboolean
|
|
||||||
char time_str[20];
|
|
||||||
|
|
||||||
data->level = g_strdup ((gchar*) g_hash_table_lookup (table, "Raid Level"));
|
|
||||||
+ if (!(data->level))
|
|
||||||
+ /* BUG: mdadm outputs "RAID Level" for some metadata formats (rhbz#1380034) */
|
|
||||||
+ data->level = g_strdup ((gchar*) g_hash_table_lookup (table, "RAID Level"));
|
|
||||||
|
|
||||||
value = (gchar*) g_hash_table_lookup (table, "Raid Devices");
|
|
||||||
+ if (!value)
|
|
||||||
+ /* BUG: mdadm outputs "RAID Devices" for some metadata formats (rhbz#1380034) */
|
|
||||||
+ value = (gchar*) g_hash_table_lookup (table, "RAID Devices");
|
|
||||||
if (value)
|
|
||||||
data->num_devices = g_ascii_strtoull (value, NULL, 0);
|
|
||||||
else
|
|
||||||
diff --git a/tests/md_test.py b/tests/md_test.py
|
|
||||||
index 6664e44..df90582 100644
|
|
||||||
--- a/tests/md_test.py
|
|
||||||
+++ b/tests/md_test.py
|
|
||||||
@@ -404,6 +404,15 @@ class FakeMDADMutilTest(unittest.TestCase):
|
|
||||||
|
|
||||||
self.assertEqual(ex_data.device, "/dev/md/Volume0")
|
|
||||||
|
|
||||||
+ def test_fw_raid_uppercase_examine(self):
|
|
||||||
+ """Verify that md_examine works with output using "RAID" instead of "Raid" """
|
|
||||||
+
|
|
||||||
+ with fake_utils("tests/mdadm_fw_RAID_examine"):
|
|
||||||
+ ex_data = BlockDev.md_examine("fake_dev")
|
|
||||||
+
|
|
||||||
+ self.assertEqual(ex_data.level, "0")
|
|
||||||
+ self.assertEqual(ex_data.num_devices, 1)
|
|
||||||
+
|
|
||||||
def test_no_metadata_examine(self):
|
|
||||||
"""Verify that md_examine works as expected with no metadata spec"""
|
|
||||||
|
|
||||||
diff --git a/tests/mdadm_fw_RAID_examine/mdadm b/tests/mdadm_fw_RAID_examine/mdadm
|
|
||||||
new file mode 100755
|
|
||||||
index 0000000..c939860
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/tests/mdadm_fw_RAID_examine/mdadm
|
|
||||||
@@ -0,0 +1,53 @@
|
|
||||||
+#!/bin/bash
|
|
||||||
+
|
|
||||||
+echo "$@"|grep -- "--brief" &>/dev/null
|
|
||||||
+is_brief=$?
|
|
||||||
+
|
|
||||||
+if [ $is_brief -eq 0 ]; then
|
|
||||||
+ cat <<EOF
|
|
||||||
+ARRAY metadata=imsm UUID=b42756a2:37e43e47:674bd1dd:6e822145
|
|
||||||
+ARRAY /dev/md/Volume0 container=b42756a2:37e43e47:674bd1dd:6e822145 member=0 UUID=8f0b5240:06168ed1:bbafeaf5:2a7b04fc
|
|
||||||
+EOF
|
|
||||||
+else
|
|
||||||
+ cat <<EOF
|
|
||||||
+/dev/sda:
|
|
||||||
+ Magic : Intel Raid ISM Cfg Sig.
|
|
||||||
+ Version : 1.0.00
|
|
||||||
+ Orig Family : e56dd6e1
|
|
||||||
+ Family : e56dd6e1
|
|
||||||
+ Generation : 0000000c
|
|
||||||
+ Attributes : All supported
|
|
||||||
+ UUID : b42756a2:37e43e47:674bd1dd:6e822145
|
|
||||||
+ Checksum : d4553058 correct
|
|
||||||
+ MPB Sectors : 1
|
|
||||||
+ Disks : 2
|
|
||||||
+ RAID Devices : 1
|
|
||||||
+
|
|
||||||
+ Disk00 Serial : 5QM2XY4V
|
|
||||||
+ State : active
|
|
||||||
+ Id : 00000000
|
|
||||||
+ Usable Size : 976768264 (465.76 GiB 500.11 GB)
|
|
||||||
+
|
|
||||||
+[Volume0]:
|
|
||||||
+ UUID : 8f0b5240:06168ed1:bbafeaf5:2a7b04fc
|
|
||||||
+ RAID Level : 0
|
|
||||||
+ Members : 2
|
|
||||||
+ Slots : [UU]
|
|
||||||
+ Failed disk : none
|
|
||||||
+ This Slot : 0
|
|
||||||
+ Array Size : 1953536000 (931.52 GiB 1000.21 GB)
|
|
||||||
+ Per Dev Size : 976768264 (465.76 GiB 500.11 GB)
|
|
||||||
+ Sector Offset : 0
|
|
||||||
+ Num Stripes : 3815500
|
|
||||||
+ Chunk Size : 128 KiB
|
|
||||||
+ Reserved : 0
|
|
||||||
+ Migrate State : idle
|
|
||||||
+ Map State : normal
|
|
||||||
+ Dirty State : clean
|
|
||||||
+
|
|
||||||
+ Disk01 Serial : 9VM1BT6B
|
|
||||||
+ State : active
|
|
||||||
+ Id : 00010000
|
|
||||||
+ Usable Size : 976768264 (465.76 GiB 500.11 GB)
|
|
||||||
+EOF
|
|
||||||
+fi
|
|
||||||
--
|
|
||||||
2.7.4
|
|
||||||
|
|
@ -1,80 +0,0 @@
|
|||||||
From df13becf4eaaa541ba56f0a30dd31a54d7b00e9c Mon Sep 17 00:00:00 2001
|
|
||||||
From: Vratislav Podzimek <vpodzime@redhat.com>
|
|
||||||
Date: Thu, 15 Sep 2016 14:56:10 +0200
|
|
||||||
Subject: [PATCH] Make sure all object paths are passed and extracted as such
|
|
||||||
|
|
||||||
The type signature for a DBus object path is "o". Now that the LVM DBus API
|
|
||||||
properly sets types of its accepted and returned values, we can finally safely
|
|
||||||
use the signature in all expected places.
|
|
||||||
|
|
||||||
(cherry picked from commit e8117786aad76773d96b9a8d977e53077535b9bc)
|
|
||||||
Signed-off-by: Vratislav Podzimek <vpodzime@redhat.com>
|
|
||||||
---
|
|
||||||
src/plugins/lvm-dbus.c | 14 +++++++-------
|
|
||||||
1 file changed, 7 insertions(+), 7 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/src/plugins/lvm-dbus.c b/src/plugins/lvm-dbus.c
|
|
||||||
index 9500dcb..1276548 100644
|
|
||||||
--- a/src/plugins/lvm-dbus.c
|
|
||||||
+++ b/src/plugins/lvm-dbus.c
|
|
||||||
@@ -711,7 +711,7 @@ static BDLVMPVdata* get_pv_data_from_props (GVariant *props, GError **error) {
|
|
||||||
g_variant_dict_lookup (&dict, "PeStart", "t", &(data->pe_start));
|
|
||||||
|
|
||||||
/* returns an object path for the VG */
|
|
||||||
- g_variant_dict_lookup (&dict, "Vg", "s", &value);
|
|
||||||
+ g_variant_dict_lookup (&dict, "Vg", "o", &value);
|
|
||||||
if (g_strcmp0 (value, "/") == 0) {
|
|
||||||
/* no VG, the PV is not part of any VG */
|
|
||||||
g_variant_dict_clear (&dict);
|
|
||||||
@@ -1152,10 +1152,10 @@ gboolean bd_lvm_pvmove (gchar *src, gchar *dest, GError **error) {
|
|
||||||
g_free (src_path);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
- g_variant_get (prop, "s", &vg_obj_path);
|
|
||||||
+ g_variant_get (prop, "o", &vg_obj_path);
|
|
||||||
|
|
||||||
g_variant_builder_init (&builder, G_VARIANT_TYPE_TUPLE);
|
|
||||||
- g_variant_builder_add_value (&builder, g_variant_new ("s", src_path));
|
|
||||||
+ g_variant_builder_add_value (&builder, g_variant_new ("o", src_path));
|
|
||||||
g_variant_builder_add_value (&builder, g_variant_new ("(tt)", (guint64) 0, (guint64) 0));
|
|
||||||
if (dest) {
|
|
||||||
dest_var = g_variant_new ("(ott)", dest_path, (guint64) 0, (guint64) 0);
|
|
||||||
@@ -2367,7 +2367,7 @@ gboolean bd_lvm_cache_attach (gchar *vg_name, gchar *data_lv, gchar *cache_pool_
|
|
||||||
if (!lv_obj_path)
|
|
||||||
return FALSE;
|
|
||||||
g_variant_builder_init (&builder, G_VARIANT_TYPE_TUPLE);
|
|
||||||
- g_variant_builder_add_value (&builder, g_variant_new ("s", lv_obj_path));
|
|
||||||
+ g_variant_builder_add_value (&builder, g_variant_new ("o", lv_obj_path));
|
|
||||||
params = g_variant_builder_end (&builder);
|
|
||||||
g_variant_builder_clear (&builder);
|
|
||||||
|
|
||||||
@@ -2476,7 +2476,7 @@ gchar* bd_lvm_cache_pool_name (gchar *vg_name, gchar *cached_lv, GError **error)
|
|
||||||
g_free (lv_spec);
|
|
||||||
if (!prop)
|
|
||||||
return NULL;
|
|
||||||
- g_variant_get (prop, "s", &pool_obj_path);
|
|
||||||
+ g_variant_get (prop, "o", &pool_obj_path);
|
|
||||||
prop = get_object_property (pool_obj_path, LV_CMN_INTF, "Name", error);
|
|
||||||
g_free (pool_obj_path);
|
|
||||||
if (!prop)
|
|
||||||
@@ -2650,7 +2650,7 @@ gchar* bd_lvm_data_lv_name (gchar *vg_name, gchar *lv_name, GError **error) {
|
|
||||||
g_clear_error (error);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
- g_variant_get (prop, "s", &obj_path);
|
|
||||||
+ g_variant_get (prop, "o", &obj_path);
|
|
||||||
g_variant_unref (prop);
|
|
||||||
|
|
||||||
if (g_strcmp0 (obj_path, "/") == 0) {
|
|
||||||
@@ -2699,7 +2699,7 @@ gchar* bd_lvm_metadata_lv_name (gchar *vg_name, gchar *lv_name, GError **error)
|
|
||||||
g_clear_error (error);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
- g_variant_get (prop, "s", &obj_path);
|
|
||||||
+ g_variant_get (prop, "o", &obj_path);
|
|
||||||
g_variant_unref (prop);
|
|
||||||
|
|
||||||
if (g_strcmp0 (obj_path, "/") == 0) {
|
|
||||||
--
|
|
||||||
2.7.4
|
|
||||||
|
|
@ -1,86 +0,0 @@
|
|||||||
From 1edbfcdb4a973120048b5c04e0eb92b05ad3cbd2 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Vratislav Podzimek <vpodzime@redhat.com>
|
|
||||||
Date: Wed, 26 Oct 2016 16:13:58 +0200
|
|
||||||
Subject: [PATCH] Open the device file as RDWR when committing parts
|
|
||||||
|
|
||||||
We block udev from generating events for the device while we are between
|
|
||||||
committing changes to disk and informing kernel about the changes. If we close
|
|
||||||
the file descriptor later, no udev changes are generated either unless we open
|
|
||||||
is as RDWR. Here's the difference:
|
|
||||||
|
|
||||||
RDONLY:
|
|
||||||
# udevadm monitor
|
|
||||||
monitor will print the received events for:
|
|
||||||
UDEV - the event which udev sends out after rule processing
|
|
||||||
KERNEL - the kernel uevent
|
|
||||||
|
|
||||||
KERNEL[68221.911864] change /devices/virtual/block/loop0 (block)
|
|
||||||
KERNEL[68221.913442] change /devices/virtual/block/loop0 (block)
|
|
||||||
KERNEL[68221.913794] add /devices/virtual/block/loop0/loop0p1 (block)
|
|
||||||
KERNEL[68221.915019] change /devices/virtual/block/loop0 (block)
|
|
||||||
KERNEL[68221.915217] change /devices/virtual/block/loop0/loop0p1 (block)
|
|
||||||
UDEV [68221.941293] change /devices/virtual/block/loop0 (block)
|
|
||||||
UDEV [68221.954214] change /devices/virtual/block/loop0/loop0p1 (block)
|
|
||||||
|
|
||||||
RDWR:
|
|
||||||
# udevadm monitor
|
|
||||||
monitor will print the received events for:
|
|
||||||
UDEV - the event which udev sends out after rule processing
|
|
||||||
KERNEL - the kernel uevent
|
|
||||||
|
|
||||||
KERNEL[68161.533114] change /devices/virtual/block/loop0 (block)
|
|
||||||
KERNEL[68161.533165] change /devices/virtual/block/loop0 (block)
|
|
||||||
UDEV [68161.533219] change /devices/virtual/block/loop0 (block)
|
|
||||||
KERNEL[68161.533262] add /devices/virtual/block/loop0/loop0p1 (block)
|
|
||||||
KERNEL[68161.533292] change /devices/virtual/block/loop0 (block)
|
|
||||||
KERNEL[68161.533326] change /devices/virtual/block/loop0/loop0p1 (block)
|
|
||||||
UDEV [68161.539255] add /devices/virtual/block/loop0/loop0p1 (block)
|
|
||||||
UDEV [68161.560215] change /devices/virtual/block/loop0 (block)
|
|
||||||
UDEV [68161.572345] change /devices/virtual/block/loop0/loop0p1 (block)
|
|
||||||
|
|
||||||
As seen above, there's no 'add' udev event in case we open the device file as
|
|
||||||
RDONLY.
|
|
||||||
|
|
||||||
(cherry picked from commit 44fdb3953eb05ff4f43a576f15d508928dca3eb7)
|
|
||||||
Signed-off-by: Vratislav Podzimek <vpodzime@redhat.com>
|
|
||||||
---
|
|
||||||
src/plugins/part.c | 5 ++++-
|
|
||||||
1 file changed, 4 insertions(+), 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/src/plugins/part.c b/src/plugins/part.c
|
|
||||||
index d5239e3..0f8e678 100644
|
|
||||||
--- a/src/plugins/part.c
|
|
||||||
+++ b/src/plugins/part.c
|
|
||||||
@@ -157,7 +157,7 @@ static gboolean disk_commit (PedDisk *disk, gchar *path, GError **error) {
|
|
||||||
/* XXX: try to grab an exclusive lock for the device so that udev doesn't
|
|
||||||
trigger events for it in between the two operations we need to perform
|
|
||||||
(see below) */
|
|
||||||
- dev_fd = open (disk->dev->path, O_RDONLY|O_CLOEXEC);
|
|
||||||
+ dev_fd = open (disk->dev->path, O_RDWR|O_CLOEXEC);
|
|
||||||
if (dev_fd >= 0)
|
|
||||||
/* if this fails, we can do no better anyway, so just ignore the return
|
|
||||||
value */
|
|
||||||
@@ -167,6 +167,7 @@ static gboolean disk_commit (PedDisk *disk, gchar *path, GError **error) {
|
|
||||||
if (ret == 0) {
|
|
||||||
set_parted_error (error, BD_PART_ERROR_FAIL);
|
|
||||||
g_prefix_error (error, "Failed to commit changes to device '%s'", path);
|
|
||||||
+ flock (dev_fd, LOCK_UN);
|
|
||||||
close (dev_fd);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
@@ -175,10 +176,12 @@ static gboolean disk_commit (PedDisk *disk, gchar *path, GError **error) {
|
|
||||||
if (ret == 0) {
|
|
||||||
set_parted_error (error, BD_PART_ERROR_FAIL);
|
|
||||||
g_prefix_error (error, "Failed to inform OS about changes on the '%s' device", path);
|
|
||||||
+ flock (dev_fd, LOCK_UN);
|
|
||||||
close (dev_fd);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
+ flock (dev_fd, LOCK_UN);
|
|
||||||
close (dev_fd);
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
--
|
|
||||||
2.7.4
|
|
||||||
|
|
@ -1,76 +0,0 @@
|
|||||||
From 66ceb82b6d51707a74174dfb7a74b943ea571a43 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Vratislav Podzimek <vpodzime@redhat.com>
|
|
||||||
Date: Thu, 20 Oct 2016 15:43:23 +0200
|
|
||||||
Subject: [PATCH] Prevent issues between libparted and udev
|
|
||||||
|
|
||||||
libparted does committing of a new partition table to disk in two steps:
|
|
||||||
|
|
||||||
1. committing (writing and flushing) to disk and
|
|
||||||
2. telling OS about the partitions.
|
|
||||||
|
|
||||||
However, that means that if things go wrong, udev may step in between the above
|
|
||||||
steps and trigger events when the block device file is closed (from being opened
|
|
||||||
RW) that could lead to a failure of the second step because some other process
|
|
||||||
may open the block device file in the reaction to the event.
|
|
||||||
|
|
||||||
In order to prevent such issues we need to acquire an exclusive lock on the
|
|
||||||
block device file, which prevents udev from triggering events, for the time we
|
|
||||||
let libparted perform the two operations above.
|
|
||||||
|
|
||||||
(cherry picked from commit 0a65466154994759cbec15ce984b751b073a891f)
|
|
||||||
Signed-off-by: Vratislav Podzimek <vpodzime@redhat.com>
|
|
||||||
---
|
|
||||||
src/plugins/part.c | 15 +++++++++++++++
|
|
||||||
1 file changed, 15 insertions(+)
|
|
||||||
|
|
||||||
diff --git a/src/plugins/part.c b/src/plugins/part.c
|
|
||||||
index 4634ef8..d5239e3 100644
|
|
||||||
--- a/src/plugins/part.c
|
|
||||||
+++ b/src/plugins/part.c
|
|
||||||
@@ -23,6 +23,8 @@
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <math.h>
|
|
||||||
#include <inttypes.h>
|
|
||||||
+#include <unistd.h>
|
|
||||||
+#include <sys/file.h>
|
|
||||||
#include <utils.h>
|
|
||||||
|
|
||||||
#include "part.h"
|
|
||||||
@@ -150,11 +152,22 @@ static const gchar *table_type_str[BD_PART_TABLE_UNDEF] = {"msdos", "gpt"};
|
|
||||||
|
|
||||||
static gboolean disk_commit (PedDisk *disk, gchar *path, GError **error) {
|
|
||||||
gint ret = 0;
|
|
||||||
+ gint dev_fd = 0;
|
|
||||||
+
|
|
||||||
+ /* XXX: try to grab an exclusive lock for the device so that udev doesn't
|
|
||||||
+ trigger events for it in between the two operations we need to perform
|
|
||||||
+ (see below) */
|
|
||||||
+ dev_fd = open (disk->dev->path, O_RDONLY|O_CLOEXEC);
|
|
||||||
+ if (dev_fd >= 0)
|
|
||||||
+ /* if this fails, we can do no better anyway, so just ignore the return
|
|
||||||
+ value */
|
|
||||||
+ flock (dev_fd, LOCK_EX);
|
|
||||||
|
|
||||||
ret = ped_disk_commit_to_dev (disk);
|
|
||||||
if (ret == 0) {
|
|
||||||
set_parted_error (error, BD_PART_ERROR_FAIL);
|
|
||||||
g_prefix_error (error, "Failed to commit changes to device '%s'", path);
|
|
||||||
+ close (dev_fd);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -162,9 +175,11 @@ static gboolean disk_commit (PedDisk *disk, gchar *path, GError **error) {
|
|
||||||
if (ret == 0) {
|
|
||||||
set_parted_error (error, BD_PART_ERROR_FAIL);
|
|
||||||
g_prefix_error (error, "Failed to inform OS about changes on the '%s' device", path);
|
|
||||||
+ close (dev_fd);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
+ close (dev_fd);
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
--
|
|
||||||
2.7.4
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user