From: NeilBrown Date: Thu, 24 Mar 2011 03:21:58 +0000 (+1100) Subject: open_dev_excl: allow device to be read-only. X-Git-Tag: mdadm-3.2.1~6 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=refs%2Fheads%2Fdevel-3.2;p=thirdparty%2Fmdadm.git open_dev_excl: allow device to be read-only. 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 --- diff --git a/util.c b/util.c index ef4406a1..e0671eb6 100644 --- 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);