}
if (!rc) {
- for (i = 0; i < td->o.iodepth; i++) {
- wd->ovls[i].io_free = TRUE;
- wd->ovls[i].io_complete = FALSE;
+ for (i = 0; i < td->o.iodepth; i++) {
+ wd->ovls[i].io_free = TRUE;
+ wd->ovls[i].io_complete = FALSE;
wd->ovls[i].o.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
if (wd->ovls[i].o.hEvent == NULL) {
rc = 1;
break;
}
- }
+ }
}
if (!rc) {
if (fov->io_complete) {
fov->io_complete = FALSE;
fov->io_free = TRUE;
+ ResetEvent(fov->o.hEvent);
wd->aio_events[dequeued] = io_u;
dequeued++;
}
if (dequeued < min) {
status = WaitForSingleObject(wd->iocomplete_event, mswait);
- if (status != WAIT_OBJECT_0 && dequeued > 0)
+ if (status != WAIT_OBJECT_0 && dequeued >= min)
break;
}
wd = td->io_ops->data;
for (index = 0; index < td->o.iodepth; index++) {
- if (wd->ovls[index].io_free) {
- wd->ovls[index].io_free = FALSE;
- ResetEvent(wd->ovls[index].o.hEvent);
+ if (wd->ovls[index].io_free)
break;
- }
}
assert(index < td->o.iodepth);
- lpOvl = &wd->ovls[index].o;
+ wd->ovls[index].io_free = FALSE;
wd->ovls[index].io_u = io_u;
+ lpOvl = &wd->ovls[index].o;
lpOvl->Internal = STATUS_PENDING;
lpOvl->InternalHigh = 0;
lpOvl->Offset = io_u->offset & 0xFFFFFFFF;
#define FIO_HAVE_CHARDEV_SIZE
#define FIO_HAVE_FDATASYNC
#define FIO_HAVE_WINDOWSAIO
+#define FIO_HAVE_FALLOCATE
#define FIO_HAVE_GETTID
#define FIO_HAVE_CLOCK_MONOTONIC
#define FIO_USE_GENERIC_RAND
int posix_fallocate(int fd, off_t offset, off_t len)
{
- log_err("%s is not implemented\n", __func__);
- errno = ENOSYS;
- return (-1);
+ const int BUFFER_SIZE = 64*1024*1024;
+ int rc = 0;
+ char *buf;
+ unsigned int write_len;
+ unsigned int bytes_written;
+ off_t bytes_remaining = len;
+
+ if (len == 0 || offset < 0)
+ return EINVAL;
+
+ buf = malloc(BUFFER_SIZE);
+
+ if (buf == NULL)
+ return ENOMEM;
+
+ memset(buf, 0, BUFFER_SIZE);
+
+ if (lseek(fd, offset, SEEK_SET) == -1)
+ return errno;
+
+ while (bytes_remaining > 0) {
+ if (bytes_remaining < BUFFER_SIZE)
+ write_len = (unsigned int)bytes_remaining;
+ else
+ write_len = BUFFER_SIZE;
+
+ bytes_written = _write(fd, buf, write_len);
+ if (bytes_written == -1) {
+ rc = errno;
+ break;
+ }
+
+ bytes_remaining -= bytes_written;
+ }
+
+ free(buf);
+ return rc;
}
int ftruncate(int fildes, off_t length)
int rc;
if (timeout != -1)
- to = &tv;
+ to = &tv;
to->tv_sec = timeout / 1000;
to->tv_usec = (timeout % 1000) * 1000;
if (fds[i].events & POLLOUT)
FD_SET(fds[i].fd, &writefds);
- FD_SET(fds[i].fd, &exceptfds);
+ FD_SET(fds[i].fd, &exceptfds);
}
rc = select(nfds, &readfds, &writefds, &exceptfds, to);