New version

- Prevent issues between libparted and udev (vpodzime)
This commit is contained in:
Vratislav Podzimek 2016-10-24 12:20:55 +02:00
parent f35c182957
commit 9463583b61
2 changed files with 82 additions and 1 deletions

View File

@ -1,6 +1,6 @@
Name: libblockdev
Version: 1.9
Release: 5%{?dist}
Release: 6%{?dist}
Summary: A library for low-level manipulation with block devices
License: LGPLv2+
URL: https://github.com/rhinstaller/libblockdev
@ -13,6 +13,7 @@ Patch3: mdadm_examine_export.patch
Patch4: mdadm_examine_uuid.patch
Patch5: mdadm_fw_raid_device.patch
Patch6: obj_path_signatures.patch
Patch7: parted_udev_issues.patch
BuildRequires: glib2-devel
BuildRequires: gobject-introspection-devel
@ -390,6 +391,7 @@ A meta-package that pulls all the libblockdev plugins as dependencies.
%patch4 -p1
%patch5 -p1
%patch6 -p1
%patch7 -p1
%build
%configure
@ -587,6 +589,9 @@ find %{buildroot} -type f -name "*.la" | xargs %{__rm}
%files plugins-all
%changelog
* Mon Oct 24 2016 Vratislav Podzimek <vpodzime@redhat.com> - 1.9-6
- Prevent issues between libparted and udev (vpodzime)
* Mon Oct 10 2016 Vratislav Podzimek <vpodzime@redhat.com> - 1.9-5
- Make sure all object paths are passed and extracted as such (vpodzime)
Resolves: rhbz#1374973

76
parted_udev_issues.patch Normal file
View File

@ -0,0 +1,76 @@
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