packages: mdadm/mdadm-read-only-dev.patch (NEW) - allow dev_open() to work ...

pluto pluto at pld-linux.org
Mon Aug 30 09:49:59 CEST 2010


Author: pluto                        Date: Mon Aug 30 07:49:59 2010 GMT
Module: packages                      Tag: HEAD
---- Log message:
- allow dev_open() to work on read-only /dev.

---- Files affected:
packages/mdadm:
   mdadm-read-only-dev.patch (NONE -> 1.1)  (NEW)

---- Diffs:

================================================================
Index: packages/mdadm/mdadm-read-only-dev.patch
diff -u /dev/null packages/mdadm/mdadm-read-only-dev.patch:1.1
--- /dev/null	Mon Aug 30 09:49:59 2010
+++ packages/mdadm/mdadm-read-only-dev.patch	Mon Aug 30 09:49:54 2010
@@ -0,0 +1,58 @@
+commit 161ecfdf3f2dfbe00b96507a18107f7ac8019039
+Author: NeilBrown <neilb at suse.de>
+Date:   Mon Aug 30 08:48:48 2010 +1000
+
+    Allow dev_open to work on read-only /dev
+    
+    /dev could be read-only in which case we cannot make devices
+    there.
+    So dev_open should first try to use an existing device name,
+    and if that doesn't work try creating a node in /dev or /tmp.
+    
+    Reported-by:  Pawe=C5=82 Sikora <pluto at agmk.net>
+    Signed-off-by: NeilBrown <neilb at suse.de>
+
+diff --git a/util.c b/util.c
+index 0b9949a..7a1cab2 100644
+--- a/util.c
++++ b/util.c
+@@ -959,19 +959,33 @@ int dev_open(char *dev, int flags)
+ 	int minor;
+ 
+ 	if (!dev) return -1;
++	flags |= O_DIRECT;
+ 
+ 	major = strtoul(dev, &e, 0);
+ 	if (e > dev && *e == ':' && e[1] &&
+ 	    (minor = strtoul(e+1, &e, 0)) >= 0 &&
+ 	    *e == 0) {
+-		snprintf(devname, sizeof(devname), "/dev/.tmp.md.%d:%d:%d",
+-			 (int)getpid(), major, minor);
+-		if (mknod(devname, S_IFBLK|0600, makedev(major, minor))==0) {
+-			fd = open(devname, flags|O_DIRECT);
+-			unlink(devname);
++		char *path = map_dev(major, minor, 0);
++		if (path)
++			fd = open(devname, flags);
++		if (fd < 0) {
++			snprintf(devname, sizeof(devname), "/dev/.tmp.md.%d:%d:%d",
++				 (int)getpid(), major, minor);
++			if (mknod(devname, S_IFBLK|0600, makedev(major, minor))==0) {
++				fd = open(devname, flags);
++				unlink(devname);
++			}
++		}
++		if (fd < 0) {
++			snprintf(devname, sizeof(devname), "/tmp/.tmp.md.%d:%d:%d",
++				 (int)getpid(), major, minor);
++			if (mknod(devname, S_IFBLK|0600, makedev(major, minor))==0) {
++				fd = open(devname, flags);
++				unlink(devname);
++			}
+ 		}
+ 	} else
+-		fd = open(dev, flags|O_DIRECT);
++		fd = open(dev, flags);
+ 	return fd;
+ }
+ 
================================================================


More information about the pld-cvs-commit mailing list