On 03/31/2014 08:50 PM, Cole Robinson wrote:
VolOpen notifies the user of a potentially non-fatal failure by
returning -2 and logging a VIR_WARN or VIR_INFO. Unfortunately most
callers treat -2 as fatal but don't actually report any message with
the error APIs.
Change VolOpen to report an error if the VOL_OPEN_ERROR flag is passed.
The ony caller that doesn't use this flag is the one that is explicitly
handling -2 return code, so it fits the pattern.
Tweak some of the other call sites to propagate the newly raised error.
---
src/storage/storage_backend.c | 60 ++++++++++++++++++++++++-----------
src/storage/storage_backend_fs.c | 21 ++++++------
src/storage/storage_backend_logical.c | 6 +++-
src/storage/storage_backend_scsi.c | 4 +--
4 files changed, 59 insertions(+), 32 deletions(-)
diff --git a/src/storage/storage_backend.c b/src/storage/storage_backend.c
index 42bd445..7c1220e 100644
--- a/src/storage/storage_backend.c
+++ b/src/storage/storage_backend.c
@@ -1273,10 +1273,11 @@ virStorageBackendDetectBlockVolFormatFD(virStorageVolTargetPtr
target,
/*
- * Allows caller to silently ignore files with improper mode
- *
* Returns -1 on error, -2 if file mode is unexpected or the
* volume is a dangling symbolic link.
+ *
+ * -2 can be an ignorable error, but callers have to make sure to
+ * virResetLastError()
*/
int
virStorageBackendVolOpen(const char *path, struct stat *sb,
@@ -1284,22 +1285,30 @@ virStorageBackendVolOpen(const char *path, struct stat *sb,
{
int fd, mode = 0;
char *base = last_component(path);
+ bool raise_error = (flags & VIR_STORAGE_VOL_OPEN_ERROR);
We've been using !!(flags & FLAG) for this kind of assignment, but I can't
remember what that fixes.
if (lstat(path, sb) < 0) {
- if (errno == ENOENT && !(flags & VIR_STORAGE_VOL_OPEN_ERROR)) {
+ if (errno == ENOENT && !raise_error) {
VIR_WARN("ignoring missing file '%s'", path);
return -2;
}
- virReportSystemError(errno,
- _("cannot stat file '%s'"),
- path);
+
+ virReportSystemError(errno, _("cannot stat file '%s'"),
path);
return -1;
}
if (S_ISFIFO(sb->st_mode)) {
+ if (raise_error) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("Volume path '%s' is a FIFO"), path);
+ }
VIR_WARN("ignoring FIFO '%s'", path);
We don't need both an error and a warning. And I think we should return -1 if
an error has been logged.
return -2;
} else if (S_ISSOCK(sb->st_mode)) {
+ if (raise_error) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("Volume path '%s' is a socket"), path);
+ }
VIR_WARN("ignoring socket '%s'", path);
return -2;
}
@@ -1366,13 +1386,11 @@ virStorageBackendVolOpen(const char *path,
struct stat *sb,
if (!(mode & flags)) {
VIR_FORCE_CLOSE(fd);
VIR_INFO("Skipping volume '%s'", path);
-
- if (mode & VIR_STORAGE_VOL_OPEN_ERROR) {
Hmm, it seems this condition could never have been true before.
+ if (raise_error) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("unexpected storage mode for '%s'"),
path);
return -1;
}
-
return -2;
}
@@ -1389,8 +1407,12 @@
virStorageBackendUpdateVolTargetInfo(virStorageVolTargetPtr target,
int ret, fd = -1;
struct stat sb;
- if ((ret = virStorageBackendVolOpen(target->path, &sb, openflags)) < 0)
+ if ((ret = virStorageBackendVolOpen(target->path, &sb, openflags)) < 0) {
+ /* ret == -2 may be a non-fatal error, but if callers want that
+ * behavior they should call VolOpen manually */
+ ret = -1;
goto cleanup;
This and the snipped changes below would not be needed if we never returned -2
with VOL_OPEN_ERROR (or by default if we switch the flag to NOERROR as Eric
suggested.)
+ }
fd = ret;
if ((ret = virStorageBackendUpdateVolTargetInfoFD(target,
Jan