提交 1bc84b0a 编写于 作者: J John Ferlan

storage: Handle readflags errors

Similar to the openflags VIR_STORAGE_VOL_OPEN_NOERROR processing, if some
read processing operation fails, check the readflags for the corresponding
error flag being set. If so, rather then causing an error - use VIR_WARN
to flag the error, but return -2 which some callers can use to perform
specific actions. Use a new VIR_STORAGE_VOL_READ_NOERROR flag in a new
VolReadErrorMode enum.
上级 1edfce9b
...@@ -1393,14 +1393,17 @@ static struct diskType const disk_types[] = { ...@@ -1393,14 +1393,17 @@ static struct diskType const disk_types[] = {
* virStorageBackendDetectBlockVolFormatFD * virStorageBackendDetectBlockVolFormatFD
* @target: target definition ptr of volume to update * @target: target definition ptr of volume to update
* @fd: fd of storage volume to update, * @fd: fd of storage volume to update,
* @readflags: unused * @readflags: VolReadErrorMode flags to handle read error after open
* is successful, but read is not.
* *
* Returns 0 for success, -1 on a legitimate error condition * Returns 0 for success, -1 on a legitimate error condition, -2 if
* the read error is desired to be ignored (along with appropriate
* VIR_WARN of the issue).
*/ */
static int static int
virStorageBackendDetectBlockVolFormatFD(virStorageSourcePtr target, virStorageBackendDetectBlockVolFormatFD(virStorageSourcePtr target,
int fd, int fd,
unsigned int readflags ATTRIBUTE_UNUSED) unsigned int readflags)
{ {
size_t i; size_t i;
off_t start; off_t start;
...@@ -1419,10 +1422,16 @@ virStorageBackendDetectBlockVolFormatFD(virStorageSourcePtr target, ...@@ -1419,10 +1422,16 @@ virStorageBackendDetectBlockVolFormatFD(virStorageSourcePtr target,
} }
bytes = saferead(fd, buffer, sizeof(buffer)); bytes = saferead(fd, buffer, sizeof(buffer));
if (bytes < 0) { if (bytes < 0) {
virReportSystemError(errno, if (readflags & VIR_STORAGE_VOL_READ_NOERROR) {
_("cannot read beginning of file '%s'"), VIR_WARN("ignoring failed saferead of file '%s'",
target->path); target->path);
return -1; return -2;
} else {
virReportSystemError(errno,
_("cannot read beginning of file '%s'"),
target->path);
return -1;
}
} }
for (i = 0; disk_types[i].part_table_type != -1; i++) { for (i = 0; disk_types[i].part_table_type != -1; i++) {
...@@ -1591,11 +1600,13 @@ virStorageBackendVolOpen(const char *path, struct stat *sb, ...@@ -1591,11 +1600,13 @@ virStorageBackendVolOpen(const char *path, struct stat *sb,
* @target: target definition ptr of volume to update * @target: target definition ptr of volume to update
* @withBlockVolFormat: true if caller determined a block file * @withBlockVolFormat: true if caller determined a block file
* @openflags: various VolOpenCheckMode flags to handle errors on open * @openflags: various VolOpenCheckMode flags to handle errors on open
* @readflags: unused * @readflags: VolReadErrorMode flags to handle read error after open
* is successful, but read is not.
* *
* Returns 0 for success, -1 on a legitimate error condition, and -2 * Returns 0 for success, -1 on a legitimate error condition, and -2
* if the openflags used VIR_STORAGE_VOL_OPEN_NOERROR and some sort of * if the openflags used VIR_STORAGE_VOL_OPEN_NOERROR and some sort of
* open error occurred. It is up to the caller to handle. * open error occurred. It is up to the caller to handle. A -2 may also
* be returned if the caller passed a readflagsflag.
*/ */
int int
virStorageBackendUpdateVolTargetInfo(virStorageSourcePtr target, virStorageBackendUpdateVolTargetInfo(virStorageSourcePtr target,
...@@ -1630,8 +1641,16 @@ virStorageBackendUpdateVolTargetInfo(virStorageSourcePtr target, ...@@ -1630,8 +1641,16 @@ virStorageBackendUpdateVolTargetInfo(virStorageSourcePtr target,
} }
if ((len = virFileReadHeaderFD(fd, len, &buf)) < 0) { if ((len = virFileReadHeaderFD(fd, len, &buf)) < 0) {
virReportSystemError(errno, _("cannot read header '%s'"), target->path); if (readflags & VIR_STORAGE_VOL_READ_NOERROR) {
ret = -1; VIR_WARN("ignoring failed header read for '%s'",
target->path);
ret = -2;
} else {
virReportSystemError(errno,
_("cannot read header '%s'"),
target->path);
ret = -1;
}
goto cleanup; goto cleanup;
} }
...@@ -1663,7 +1682,7 @@ virStorageBackendUpdateVolTargetInfo(virStorageSourcePtr target, ...@@ -1663,7 +1682,7 @@ virStorageBackendUpdateVolTargetInfo(virStorageSourcePtr target,
* @vol: Pointer to a volume storage definition * @vol: Pointer to a volume storage definition
* @withBlockVolFormat: true if the caller determined a block file * @withBlockVolFormat: true if the caller determined a block file
* @openflags: various VolOpenCheckMode flags to handle errors on open * @openflags: various VolOpenCheckMode flags to handle errors on open
* @readflags: unused * @readflags: various VolReadErrorMode flags to handle errors on read
* *
* Returns 0 for success, -1 on a legitimate error condition, and -2 * Returns 0 for success, -1 on a legitimate error condition, and -2
* if the openflags used VIR_STORAGE_VOL_OPEN_NOERROR and some sort of * if the openflags used VIR_STORAGE_VOL_OPEN_NOERROR and some sort of
......
...@@ -179,6 +179,15 @@ enum { ...@@ -179,6 +179,15 @@ enum {
VIR_STORAGE_VOL_OPEN_DIR = 1 << 4, /* directories okay */ VIR_STORAGE_VOL_OPEN_DIR = 1 << 4, /* directories okay */
}; };
/* VolReadErrorMode flags
* If flag is present, then operation won't cause fatal error for
* specified operation, rather a VIR_WARN will be issued and a -2 returned
* for function call
*/
enum {
VIR_STORAGE_VOL_READ_NOERROR = 1 << 0, /* ignore *read errors */
};
# define VIR_STORAGE_VOL_OPEN_DEFAULT (VIR_STORAGE_VOL_OPEN_REG |\ # define VIR_STORAGE_VOL_OPEN_DEFAULT (VIR_STORAGE_VOL_OPEN_REG |\
VIR_STORAGE_VOL_OPEN_BLOCK) VIR_STORAGE_VOL_OPEN_BLOCK)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册