diff options
author | NeilBrown <neilb@suse.de> | 2012-11-28 10:12:09 +1100 |
---|---|---|
committer | NeilBrown <neilb@suse.de> | 2012-11-28 10:12:09 +1100 |
commit | 5fe7f5f7c8c4c02e108d48aec5463329870ff71b (patch) | |
tree | 4ec5c49fb9527e4e7f15e22d697a6a9eed0c4dd8 /Manage.c | |
parent | 66eb2c93a619eb1d79dc653fd91add159aa3d1ff (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.c | 47 |
1 files changed, 23 insertions, 24 deletions
@@ -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){ |