summaryrefslogtreecommitdiff
path: root/Manage.c
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2012-11-28 10:12:09 +1100
committerNeilBrown <neilb@suse.de>2012-11-28 10:12:09 +1100
commit5fe7f5f7c8c4c02e108d48aec5463329870ff71b (patch)
tree4ec5c49fb9527e4e7f15e22d697a6a9eed0c4dd8 /Manage.c
parent66eb2c93a619eb1d79dc653fd91add159aa3d1ff (diff)
Fix "--remove faulty" and similar commands.
A recent change to improve error messages for subdev management broken all use cases were device names like %d:%d were used. Re-arrange the code again so we use dev_open first - which understands those names - and then only try 'stat' if that failed. The important thing is to base the 'Cannot find' message on the result of 'stat', not on the result of 'open'. Signed-off-by: NeilBrown <neilb@suse.de>
Diffstat (limited to 'Manage.c')
-rw-r--r--Manage.c47
1 files changed, 23 insertions, 24 deletions
diff --git a/Manage.c b/Manage.c
index 8ed1a1a7..3d713a32 100644
--- a/Manage.c
+++ b/Manage.c
@@ -1205,38 +1205,37 @@ int Manage_subdevs(char *devname, int fd,
}
}
} else {
- if (stat(dv->devname, &stb) != 0) {
- pr_err("Cannot find %s: %s\n",
- dv->devname, strerror(errno));
- goto abort;
- }
- if ((stb.st_mode & S_IFMT) != S_IFBLK) {
- if (dv->disposition == 'M')
- /* non-fatal. Also improbable */
- continue;
- pr_err("%s is not a block device.\n",
- dv->devname);
- goto abort;
- }
tfd = dev_open(dv->devname, O_RDONLY);
- if (tfd < 0 && dv->disposition == 'r')
- /* Be happy, the stat worked, that is
- * enough for --remove
- */
- ;
+ if (tfd >= 0)
+ fstat(tfd, &stb);
else {
- if (tfd < 0 || fstat(tfd, &stb) != 0) {
- if (tfd >= 0)
- close(tfd);
+ int open_err = errno;
+ if (stat(dv->devname, &stb) != 0) {
+ pr_err("Cannot find %s: %s\n",
+ dv->devname, strerror(errno));
+ goto abort;
+ }
+ if ((stb.st_mode & S_IFMT) != S_IFBLK) {
+ if (dv->disposition == 'M')
+ /* non-fatal. Also improbable */
+ continue;
+ pr_err("%s is not a block device.\n",
+ dv->devname);
+ goto abort;
+ }
+ if (dv->disposition == 'r')
+ /* Be happy, the stat worked, that is
+ * enough for --remove
+ */
+ ;
+ else {
if (dv->disposition == 'M')
/* non-fatal */
continue;
pr_err("Cannot open %s: %s\n",
- dv->devname, strerror(errno));
+ dv->devname, strerror(open_err));
goto abort;
}
- close(tfd);
- tfd = -1;
}
}
switch(dv->disposition){