diff options
author | NeilBrown <neilb@suse.de> | 2012-10-10 18:27:32 +1100 |
---|---|---|
committer | NeilBrown <neilb@suse.de> | 2012-10-10 18:27:32 +1100 |
commit | 0431869cec4c673309d9aa30a2df4b778bc0bd24 (patch) | |
tree | bb6f9ec234f34c8680adcca88b3e438f28fe6a23 /Incremental.c | |
parent | e0ab37a3aedc285525cc8fdf14a64c4d586cf106 (diff) | |
download | mdadm-0431869cec4c673309d9aa30a2df4b778bc0bd24.tar.gz |
Fix up interactions between --assemble and --incremental
If --incremental has partly assembled an array and
--assemble is asked to assemble it, the just finds remaining
devices and makes a new array. Not good.
So:
1/ modify locking policy so that assemble can be sure that
no --incremental is running once it locks the map file
2/ Assemble() checks the map file for a duplicate and adds to
that array instead of creating a new one.
Signed-off-by: NeilBrown <neilb@suse.de>
Diffstat (limited to 'Incremental.c')
-rw-r--r-- | Incremental.c | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/Incremental.c b/Incremental.c index 1615c4d..9b5ac27 100644 --- a/Incremental.c +++ b/Incremental.c @@ -116,7 +116,7 @@ int Incremental(char *devname, struct context *c, devname); return rv; } - dfd = dev_open(devname, O_RDONLY|O_EXCL); + dfd = dev_open(devname, O_RDONLY); if (dfd < 0) { if (c->verbose >= 0) pr_err("cannot open %s: %s.\n", @@ -270,6 +270,22 @@ int Incremental(char *devname, struct context *c, if (map_lock(&map)) pr_err("failed to get exclusive lock on " "mapfile\n"); + /* Now check we can get O_EXCL. If not, probably "mdadm -A" has + * taken over + */ + dfd = dev_open(devname, O_RDONLY|O_EXCL); + if (dfd < 0) { + if (c->verbose >= 0) + pr_err("cannot reopen %s: %s.\n", + devname, strerror(errno)); + goto out_unlock; + } + /* Cannot hold it open while we add the device to the array, + * so we must release the O_EXCL and depend on the map_lock() + */ + close(dfd); + dfd = -1; + mp = map_by_uuid(&map, info.uuid); if (mp) mdfd = open_dev(mp->devnum); |