summaryrefslogtreecommitdiff
path: root/Manage.c
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2012-10-24 12:51:14 +1100
committerNeilBrown <neilb@suse.de>2012-10-24 12:51:14 +1100
commit839f27a38057a56b213d3e873925712c1c3f4b34 (patch)
tree4d1c923e4871e99821ab9e9781b9f82c6173e950 /Manage.c
parent4cda8682c6607d8268072243d310919bcc5f21b2 (diff)
Manage: improve error message when given a non-block device.
As dev_open uses O_DIRECT it will fail on directories and such. So we never get to report that it isn't a block device. So do a 'stat' earlier and if it is a block device, report the error there. Signed-off-by: NeilBrown <neilb@suse.de>
Diffstat (limited to 'Manage.c')
-rw-r--r--Manage.c29
1 files changed, 16 insertions, 13 deletions
diff --git a/Manage.c b/Manage.c
index 832e84ce..8ed1a1a7 100644
--- a/Manage.c
+++ b/Manage.c
@@ -1205,10 +1205,22 @@ 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' &&
- lstat(dv->devname, &stb) == 0)
- /* Be happy, the lstat worked, that is
+ if (tfd < 0 && dv->disposition == 'r')
+ /* Be happy, the stat worked, that is
* enough for --remove
*/
;
@@ -1219,22 +1231,13 @@ int Manage_subdevs(char *devname, int fd,
if (dv->disposition == 'M')
/* non-fatal */
continue;
- pr_err("cannot find %s: %s\n",
+ pr_err("Cannot open %s: %s\n",
dv->devname, strerror(errno));
goto abort;
}
close(tfd);
tfd = -1;
}
- 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;
- }
}
switch(dv->disposition){
default: