bug-parted
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH] Fall back to not using O_DIRECT


From: Soren Hansen
Subject: [PATCH] Fall back to not using O_DIRECT
Date: Tue, 5 Aug 2008 18:00:48 +0200
User-agent: Mutt/1.5.18 (2008-05-17)

I used to use parted 1.7.7 as this was what was shipped by Ubuntu and
Debian up until very recently. I used parted to add a partition table to
disk images that I'd be using for virtual machines.  
When parted was updated to 1.8.8, this stopped working, since parted had
started to pass O_DIRECT to open(2) when opening disks; tmpfs (on which
I usually place these disk images) does not support O_DIRECT, and thus
open(2) returns -1 and sets errno to EINVAL.

I've tried to ask around, but have not been able to get a clear
explanation of the rationale for adding O_DIRECT to begin with, such as
reference to a specific problems it's meant to fix. Thus, I'm not sure
if I'm reintroducing said bug by introducing this patch.

The patch itself simply retries the open(2) call without O_DIRECT iff
errno is EINVAL, which according to the open(2) man page only ever
happens in the case where you're opening a file on a file system that
does not support it. 

Signed-off-by: Soren Hansen <address@hidden>

diff -urNad parted-1.8.8.git.2008.03.24~/libparted/arch/linux.c 
parted-1.8.8.git.2008.03.24/libparted/arch/linux.c
--- parted-1.8.8.git.2008.03.24~/libparted/arch/linux.c 2008-08-05 
17:02:18.151661314 +0200
+++ parted-1.8.8.git.2008.03.24/libparted/arch/linux.c  2008-08-05 
17:02:47.096662006 +0200
@@ -1301,11 +1301,24 @@
 retry:
         arch_specific->fd = open (dev->path, RW_MODE);
 
+#if defined(O_DIRECT)
+        if (arch_specific->fd == -1 && errno == EINVAL && RW_MODE & O_DIRECT) {
+                int rw_mode = RW_MODE;
+                arch_specific->fd = open (dev->path, rw_mode & ~O_DIRECT);
+        }
+#endif
+       
         if (arch_specific->fd == -1) {
                 char*   rw_error_msg = strerror (errno);
 
                 arch_specific->fd = open (dev->path, RD_MODE);
 
+#if defined(O_DIRECT)
+                if (arch_specific->fd == -1 && errno == EINVAL && RD_MODE & 
O_DIRECT) {
+                        int rd_mode = RD_MODE;
+                        arch_specific->fd = open (dev->path, rd_mode & 
~O_DIRECT);
+                }
+#endif
                 if (arch_specific->fd == -1) {
                         if (ped_exception_throw (
                                 PED_EXCEPTION_ERROR,


-- 
Soren Hansen               | 
Virtualisation specialist  | Ubuntu Server Team
Canonical Ltd.             | http://www.ubuntu.com/

Attachment: signature.asc
Description: Digital signature


reply via email to

[Prev in Thread] Current Thread [Next in Thread]