diff options
author | NeilBrown <neilb@suse.de> | 2010-03-03 13:16:24 +1100 |
---|---|---|
committer | NeilBrown <neilb@suse.de> | 2010-03-03 13:16:24 +1100 |
commit | 5a9de8db047646e1e59d90afc478d1820736324d (patch) | |
tree | 3925d5dea8fe206b42d3f613877df973f5e9bbec | |
parent | c132678b18c1aeb3f3eaa2ece4aafebd5e2b47a6 (diff) | |
download | mdadm-5a9de8db047646e1e59d90afc478d1820736324d.tar.gz mdadm-5a9de8db047646e1e59d90afc478d1820736324d.tar.xz mdadm-5a9de8db047646e1e59d90afc478d1820736324d.zip |
Manage: fix regression on removing detached devices.
If /dev is static, a name may remain there after the
device has been detached from the system.
Using 'mdadm' to remove such a device from the array
should still work (even though "mdadm --remove detached"
might be preferred).
So when processing a device for '-r', don't insist on
being able to open the device.
Signed-off-by: NeilBrown <neilb@suse.de>
-rw-r--r-- | Manage.c | 22 |
1 files changed, 15 insertions, 7 deletions
@@ -425,14 +425,22 @@ int Manage_subdevs(char *devname, int fd, j = 0; tfd = dev_open(dv->devname, O_RDONLY); - if (tfd < 0 || fstat(tfd, &stb) != 0) { - fprintf(stderr, Name ": cannot find %s: %s\n", - dv->devname, strerror(errno)); - if (tfd >= 0) - close(tfd); - return 1; + if (tfd < 0 && dv->disposition == 'r' && + lstat(dv->devname, &stb) == 0) + /* Be happy, the lstat worked, that is + * enough for --remove + */ + ; + else { + if (tfd < 0 || fstat(tfd, &stb) != 0) { + fprintf(stderr, Name ": cannot find %s: %s\n", + dv->devname, strerror(errno)); + if (tfd >= 0) + close(tfd); + return 1; + } + close(tfd); } - close(tfd); if ((stb.st_mode & S_IFMT) != S_IFBLK) { fprintf(stderr, Name ": %s is not a " "block device.\n", |