forked from pool/parted
Copy from home:puzel:branches:Base:System/parted via accept of submit request 30480 revision 2. Request was accepted with message: OBS-URL: https://build.opensuse.org/request/show/30480 OBS-URL: https://build.opensuse.org/package/show/Base:System/parted?expand=0&rev=14
62 lines
1.9 KiB
Diff
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);
|
|
}
|
|
|
|
/**
|