unsigned long long offset,
unsigned long long length,
int oflags,
- int mode)
+ int mode,
+ bool forceIOHelper)
{
int fd = -1;
int childfd = -1;
* the I/O so we just have a fifo. Or use AIO :-(
*/
if ((st->flags & VIR_STREAM_NONBLOCK) &&
- (!S_ISCHR(sb.st_mode) &&
- !S_ISFIFO(sb.st_mode))) {
+ ((!S_ISCHR(sb.st_mode) &&
+ !S_ISFIFO(sb.st_mode)) || forceIOHelper)) {
int fds[2] = { -1, -1 };
if ((oflags & O_ACCMODE) == O_RDWR) {
}
return virFDStreamOpenFileInternal(st, path,
offset, length,
- oflags, 0);
+ oflags, 0, false);
}
int virFDStreamCreateFile(virStreamPtr st,
{
return virFDStreamOpenFileInternal(st, path,
offset, length,
- oflags | O_CREAT, mode);
+ oflags | O_CREAT, mode,
+ false);
}
#ifdef HAVE_CFMAKERAW
if (virFDStreamOpenFileInternal(st, path,
offset, length,
- oflags | O_CREAT, 0) < 0)
+ oflags | O_CREAT, 0,
+ false) < 0)
return -1;
fdst = st->privateData;
}
#endif /* !HAVE_CFMAKERAW */
+int virFDStreamOpenBlockDevice(virStreamPtr st,
+ const char *path,
+ unsigned long long offset,
+ unsigned long long length,
+ int oflags)
+{
+ return virFDStreamOpenFileInternal(st, path,
+ offset, length,
+ oflags, 0, true);
+}
+
int virFDStreamSetInternalCloseCb(virStreamPtr st,
virFDStreamInternalCloseCb cb,
void *opaque,
unsigned long long offset,
unsigned long long length,
int oflags);
+int virFDStreamOpenBlockDevice(virStreamPtr st,
+ const char *path,
+ unsigned long long offset,
+ unsigned long long length,
+ int oflags);
int virFDStreamSetInternalCloseCb(virStreamPtr st,
virFDStreamInternalCloseCb cb,
/* Not using O_CREAT because the file is required to already exist at
* this point */
- return virFDStreamOpenFile(stream, vol->target.path, offset, len, O_WRONLY);
+ return virFDStreamOpenBlockDevice(stream, vol->target.path,
+ offset, len, O_WRONLY);
}
int
{
virCheckFlags(0, -1);
- return virFDStreamOpenFile(stream, vol->target.path, offset, len, O_RDONLY);
+ return virFDStreamOpenBlockDevice(stream, vol->target.path,
+ offset, len, O_RDONLY);
}