]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
open_dev_excl: allow device to be read-only. devel-3.2
authorNeilBrown <neilb@suse.de>
Thu, 24 Mar 2011 03:21:58 +0000 (14:21 +1100)
committerNeilBrown <neilb@suse.de>
Thu, 24 Mar 2011 03:21:58 +0000 (14:21 +1100)
For many operations we don't need a writable device.  So if
opening O_RDWR fails in open_dev_excl, then try again O_RDONLY.

If we really needed write, a subsequent operation will failed.  But
if we didn't, we succeed when otherwise we wouldn't have.

Signed-off-by: NeilBrown <neilb@suse.de>
util.c

diff --git a/util.c b/util.c
index ef4406a13304cc3d08ca077b87f3a16a9bfe62ec..e0671eb6cbbe28944dd495564f2fa244151edc92 100644 (file)
--- a/util.c
+++ b/util.c
@@ -1015,12 +1015,17 @@ int open_dev_excl(int devnum)
 {
        char buf[20];
        int i;
+       int flags = O_RDWR;
 
        sprintf(buf, "%d:%d", dev2major(devnum), dev2minor(devnum));
        for (i=0 ; i<25 ; i++) {
-               int fd = dev_open(buf, O_RDWR|O_EXCL);
+               int fd = dev_open(buf, flags|O_EXCL);
                if (fd >= 0)
                        return fd;
+               if (errno == EACCES && flags == O_RDWR) {
+                       flags = O_RDONLY;
+                       continue;
+               }
                if (errno != EBUSY)
                        return fd;
                usleep(200000);