summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2011-03-24 14:21:58 +1100
committerNeilBrown <neilb@suse.de>2011-03-24 14:21:58 +1100
commit7187750e8dfa7a93135a145e10c88569d4e7d767 (patch)
tree243555a308b934cf40b68dab62f10f50b7e63f5a
parent972728bb1b9e28afe8dd8a0d6bd89fb3f7b65f2b (diff)
downloadmdadm-devel-3.2.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.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/util.c b/util.c
index ef4406a..e0671eb 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);