diff options
author | NeilBrown <neilb@suse.de> | 2011-03-24 14:21:58 +1100 |
---|---|---|
committer | NeilBrown <neilb@suse.de> | 2011-03-24 14:21:58 +1100 |
commit | 7187750e8dfa7a93135a145e10c88569d4e7d767 (patch) | |
tree | 243555a308b934cf40b68dab62f10f50b7e63f5a | |
parent | 972728bb1b9e28afe8dd8a0d6bd89fb3f7b65f2b (diff) | |
download | mdadm-7187750e8dfa7a93135a145e10c88569d4e7d767.tar.gz |
open_dev_excl: allow device to be read-only.devel-3.2
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>
-rw-r--r-- | util.c | 7 |
1 files changed, 6 insertions, 1 deletions
@@ -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); |