parted/avoid-unnecessary-open-close.patch
OBS User autobuild eca291a9ed Accepting request 26270 from Base:System
Copy from Base:System/parted based on submit request 26270 from user puzel

OBS-URL: https://build.opensuse.org/request/show/26270
OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/parted?expand=0&rev=44
2009-12-16 08:45:27 +00:00

62 lines
1.9 KiB
Diff

From ad25892bb995f61b0ddf801ed1f74e0b1e7390ce Mon Sep 17 00:00:00 2001
From: Hans de Goede <hdegoede@redhat.com>
Date: Thu, 27 Aug 2009 20:16:09 +0200
Subject: [PATCH] parted: avoid unnecessary open/close on commit, and thus udev activity
* libparted/disk.c (ped_disk_commit): Open/close the underlying file
descriptor in this function, so that callees, ped_disk_commit_to_dev
and ped_disk_commit_to_os do not each perform open/close syscalls.
This saves an open/close pair, and thus avoids unneeded udev
activity on Linux.
Before this change, when calling commit() on a ped_disk, the
following would happen:
open /dev/sda
write partition table
close /dev/sda
open /dev/sda
ioctl (BLKRRPART)
close /dev/sda
This is rather inefficient, and causes 2 udev change events to be fired
for /dev/sda (+ the change events from the BLKRRPART), causing all kind
of scanning (blkid & friends) twice.
This patch fixes things to only open the device once.
---
libparted/disk.c | 20 ++++++++++++++++++--
1 files changed, 18 insertions(+), 2 deletions(-)
Index: parted-1.9.0/libparted/disk.c
===================================================================
--- parted-1.9.0.orig/libparted/disk.c 2009-12-03 15:09:44.000000000 +0100
+++ parted-1.9.0/libparted/disk.c 2009-12-03 15:10:13.000000000 +0100
@@ -489,9 +489,25 @@ error:
int
ped_disk_commit (PedDisk* disk)
{
+ /* Open the device here, so that the underlying fd is not closed
+ between commit_to_dev and commit_to_os (closing causes unwanted
+ udev events to be sent under Linux). */
+ if (!ped_device_open (disk->dev))
+ goto error;
+
if (!ped_disk_commit_to_dev (disk))
+ goto error_close_dev;
+
+ if (!ped_disk_commit_to_os (disk))
+ goto error_close_dev;
+
+ ped_device_close (disk->dev);
+ return 1;
+
+error_close_dev:
+ ped_device_close (disk->dev);
+error:
return 0;
- return ped_disk_commit_to_os (disk);
}
/**