Errors like:
fio: pid=0, err=22/file:filesetup.c:380, error=Invalid argument
do not give a lot of clue as to what is wrong, unless you
have a matching source. So add a context relevant info
message as well.
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
16 files changed:
static int fio_cpuio_init(struct thread_data *td)
{
if (!td->cpuload) {
static int fio_cpuio_init(struct thread_data *td)
{
if (!td->cpuload) {
- td_vmsg(td, EINVAL, "cpu thread needs rate");
+ td_vmsg(td, EINVAL, "cpu thread needs rate", "cpu_load");
return 1;
} else if (td->cpuload > 100)
td->cpuload = 100;
return 1;
} else if (td->cpuload > 100)
td->cpuload = 100;
memset(ld, 0, sizeof(*ld));
if (io_queue_init(td->iodepth, &ld->aio_ctx)) {
memset(ld, 0, sizeof(*ld));
if (io_queue_init(td->iodepth, &ld->aio_ctx)) {
+ td_verror(td, errno, "io_queue_init");
- td_verror(td, io_u->error);
+ td_verror(td, io_u->error, "sync");
return FIO_Q_COMPLETED;
}
return FIO_Q_COMPLETED;
}
*/
for_each_file(td, f, i) {
if (ftruncate(f->fd, f->file_size) < 0) {
*/
for_each_file(td, f, i) {
if (ftruncate(f->fd, f->file_size) < 0) {
+ td_verror(td, errno, "ftruncate");
*/
if ((send_to_net(td) && io_u->ddir == DDIR_READ) ||
(!send_to_net(td) && io_u->ddir == DDIR_WRITE)) {
*/
if ((send_to_net(td) && io_u->ddir == DDIR_READ) ||
(!send_to_net(td) && io_u->ddir == DDIR_WRITE)) {
+ td_verror(td, EINVAL, "bad direction");
* If offset is different from last end position, it's a seek.
* As network io is purely sequential, we don't allow seeks.
*/
* If offset is different from last end position, it's a seek.
* As network io is purely sequential, we don't allow seeks.
*/
+ td_verror(td, EINVAL, "cannot seek");
- td_verror(td, io_u->error);
+ td_verror(td, io_u->error, "xfer");
return FIO_Q_COMPLETED;
}
return FIO_Q_COMPLETED;
}
hent = gethostbyname(host);
if (!hent) {
hent = gethostbyname(host);
if (!hent) {
+ td_verror(td, errno, "gethostbyname");
for_each_file(td, f, i) {
f->fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (f->fd < 0) {
for_each_file(td, f, i) {
f->fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (f->fd < 0) {
+ td_verror(td, errno, "socket");
return 1;
}
if (connect(f->fd, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
return 1;
}
if (connect(f->fd, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
+ td_verror(td, errno, "connect");
if (errno == EINTR)
continue;
if (errno == EINTR)
continue;
+ td_verror(td, errno, "poll");
break;
} else if (!ret)
continue;
break;
} else if (!ret)
continue;
f->fd = accept(fd, (struct sockaddr *) addr, &socklen);
if (f->fd < 0) {
f->fd = accept(fd, (struct sockaddr *) addr, &socklen);
if (f->fd < 0) {
+ td_verror(td, errno, "accept");
fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (fd < 0) {
fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (fd < 0) {
+ td_verror(td, errno, "socket");
return 1;
}
opt = 1;
if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) < 0) {
return 1;
}
opt = 1;
if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) < 0) {
+ td_verror(td, errno, "setsockopt");
return 1;
}
#ifdef SO_REUSEPORT
if (setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &opt, sizeof(opt)) < 0) {
return 1;
}
#ifdef SO_REUSEPORT
if (setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &opt, sizeof(opt)) < 0) {
+ td_verror(td, errno, "setsockopt");
addr.sin_port = htons(port);
if (bind(fd, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
addr.sin_port = htons(port);
if (bind(fd, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
+ td_verror(td, errno, "bind");
return 1;
}
if (listen(fd, 1) < 0) {
return 1;
}
if (listen(fd, 1) < 0) {
+ td_verror(td, errno, "listen");
if (ret) {
io_u->error = errno;
if (ret) {
io_u->error = errno;
- td_verror(td, io_u->error);
+ td_verror(td, io_u->error, "xfer");
return FIO_Q_COMPLETED;
}
return FIO_Q_COMPLETED;
}
if (ret < 0) {
if (!r)
r = -errno;
if (ret < 0) {
if (!r)
r = -errno;
+ td_verror(td, errno, "poll");
break;
} else if (!ret)
continue;
break;
} else if (!ret)
continue;
if (errno == EAGAIN)
continue;
r = -errno;
if (errno == EAGAIN)
continue;
r = -errno;
+ td_verror(td, errno, "read");
break;
} else if (ret) {
p += ret;
break;
} else if (ret) {
p += ret;
- td_verror(td, io_u->error);
+ td_verror(td, io_u->error, "xfer");
return FIO_Q_COMPLETED;
}
return FIO_Q_COMPLETED;
}
if (td->filetype == FIO_TYPE_BD) {
if (ioctl(f->fd, BLKSSZGET, &bs) < 0) {
if (td->filetype == FIO_TYPE_BD) {
if (ioctl(f->fd, BLKSSZGET, &bs) < 0) {
+ td_verror(td, errno, "ioctl");
goto err;
}
} else if (td->filetype == FIO_TYPE_CHAR) {
int version;
if (ioctl(f->fd, SG_GET_VERSION_NUM, &version) < 0) {
goto err;
}
} else if (td->filetype == FIO_TYPE_CHAR) {
int version;
if (ioctl(f->fd, SG_GET_VERSION_NUM, &version) < 0) {
+ td_verror(td, errno, "ioctl");
- td_verror(td, io_u->error);
+ td_verror(td, io_u->error, "xfer");
return FIO_Q_COMPLETED;
}
return FIO_Q_COMPLETED;
}
struct spliceio_data *sd = malloc(sizeof(*sd));
if (pipe(sd->pipe) < 0) {
struct spliceio_data *sd = malloc(sizeof(*sd));
if (pipe(sd->pipe) < 0) {
+ td_verror(td, errno, "pipe");
return 0;
if (lseek(f->fd, io_u->offset, SEEK_SET) == -1) {
return 0;
if (lseek(f->fd, io_u->offset, SEEK_SET) == -1) {
+ td_verror(td, errno, "lseek");
- td_verror(td, io_u->error);
+ td_verror(td, io_u->error, "xfer");
return FIO_Q_COMPLETED;
}
return FIO_Q_COMPLETED;
}
assert(sd->nr_events < td->iodepth);
if (io_u->error)
assert(sd->nr_events < td->iodepth);
if (io_u->error)
- td_verror(td, io_u->error);
+ td_verror(td, io_u->error, "xfer");
return FIO_Q_COMPLETED;
}
return FIO_Q_COMPLETED;
}
f->fd = open(f->file_name, O_WRONLY | O_CREAT | O_TRUNC, 0644);
if (f->fd < 0) {
f->fd = open(f->file_name, O_WRONLY | O_CREAT | O_TRUNC, 0644);
if (f->fd < 0) {
+ td_verror(td, errno, "open");
return 1;
}
if (ftruncate(f->fd, f->file_size) == -1) {
return 1;
}
if (ftruncate(f->fd, f->file_size) == -1) {
+ td_verror(td, errno, "ftruncate");
goto err;
}
if (posix_fallocate(f->fd, 0, f->file_size) < 0) {
goto err;
}
if (posix_fallocate(f->fd, 0, f->file_size) < 0) {
+ td_verror(td, errno, "posix_fallocate");
continue;
} else {
if (r < 0)
continue;
} else {
if (r < 0)
+ td_verror(td, errno, "write");
+ td_verror(td, EIO, "write");
if (!td->total_file_size) {
log_err("Need size for create\n");
if (!td->total_file_size) {
log_err("Need size for create\n");
+ td_verror(td, EINVAL, "file_size");
if (td->overwrite) {
if (fstat(f->fd, &st) == -1) {
if (td->overwrite) {
if (fstat(f->fd, &st) == -1) {
+ td_verror(td, errno, "fstat");
r = blockdev_size(f->fd, &bytes);
if (r) {
r = blockdev_size(f->fd, &bytes);
if (r) {
+ td_verror(td, r, "blockdev_size");
+ td_verror(td, errno, "invalidate_cache");
f->mmap = mmap(NULL, f->file_size, flags, MAP_SHARED, f->fd, f->file_offset);
if (f->mmap == MAP_FAILED) {
f->mmap = NULL;
f->mmap = mmap(NULL, f->file_size, flags, MAP_SHARED, f->fd, f->file_offset);
if (f->mmap == MAP_FAILED) {
f->mmap = NULL;
+ td_verror(td, errno, "mmap");
if (td->sequential) {
if (madvise(f->mmap, f->file_size, MADV_SEQUENTIAL) < 0) {
if (td->sequential) {
if (madvise(f->mmap, f->file_size, MADV_SEQUENTIAL) < 0) {
+ td_verror(td, errno, "madvise");
return 1;
}
} else {
if (madvise(f->mmap, f->file_size, MADV_RANDOM) < 0) {
return 1;
}
} else {
if (madvise(f->mmap, f->file_size, MADV_RANDOM) < 0) {
+ td_verror(td, errno, "madvise");
if (td->sequential) {
if (fadvise(f->fd, f->file_offset, f->file_size, POSIX_FADV_SEQUENTIAL) < 0) {
if (td->sequential) {
if (fadvise(f->fd, f->file_offset, f->file_size, POSIX_FADV_SEQUENTIAL) < 0) {
+ td_verror(td, errno, "fadvise");
return 1;
}
} else {
if (fadvise(f->fd, f->file_offset, f->file_size, POSIX_FADV_RANDOM) < 0) {
return 1;
}
} else {
if (fadvise(f->fd, f->file_offset, f->file_size, POSIX_FADV_RANDOM) < 0) {
+ td_verror(td, errno, "fadvise");
+ int __e = errno;
+
+ td_verror(td, __e, "open");
+ if (__e == EINVAL && td->odirect)
+ log_err("fio: destinations does not support O_DIRECT\n");
td->io_size = td->total_file_size;
if (td->io_size == 0) {
log_err("%s: no io blocks\n", td->name);
td->io_size = td->total_file_size;
if (td->io_size == 0) {
log_err("%s: no io blocks\n", td->name);
+ td_verror(td, EINVAL, "total_file_size");
requeue:
ret = td_io_queue(td, io_u);
if (ret < 0) {
requeue:
ret = td_io_queue(td, io_u);
if (ret < 0) {
- td_verror(td, io_u->error);
+ td_verror(td, io_u->error, "td_io_queue");
put_io_u(td, io_u);
return 1;
} else if (ret == FIO_Q_QUEUED) {
put_io_u(td, io_u);
return 1;
} else if (ret == FIO_Q_QUEUED) {
return 1;
} else if (ret == FIO_Q_COMPLETED) {
if (io_u->error) {
return 1;
} else if (ret == FIO_Q_COMPLETED) {
if (io_u->error) {
- td_verror(td, io_u->error);
+ td_verror(td, io_u->error, "td_io_queue");
break;
default:
assert(ret < 0);
break;
default:
assert(ret < 0);
+ td_verror(td, -ret, "td_io_queue");
if (check_min_rate(td, &comp_time)) {
if (exitall_on_terminate)
terminate_threads(td->groupid, 0);
if (check_min_rate(td, &comp_time)) {
if (exitall_on_terminate)
terminate_threads(td->groupid, 0);
- td_verror(td, ENODATA);
+ td_verror(td, ENODATA, "check_min_rate");
f = fopen(tmp, "r+");
if (!f) {
f = fopen(tmp, "r+");
if (!f) {
+ td_verror(td, errno, "fopen");
*/
ret = fwrite(td->ioscheduler, strlen(td->ioscheduler), 1, f);
if (ferror(f) || ret != 1) {
*/
ret = fwrite(td->ioscheduler, strlen(td->ioscheduler), 1, f);
if (ferror(f) || ret != 1) {
+ td_verror(td, errno, "fwrite");
*/
ret = fread(tmp, 1, sizeof(tmp), f);
if (ferror(f) || ret < 0) {
*/
ret = fread(tmp, 1, sizeof(tmp), f);
if (ferror(f) || ret < 0) {
+ td_verror(td, errno, "fread");
sprintf(tmp2, "[%s]", td->ioscheduler);
if (!strstr(tmp, tmp2)) {
log_err("fio: io scheduler %s not found\n", td->ioscheduler);
sprintf(tmp2, "[%s]", td->ioscheduler);
if (!strstr(tmp, tmp2)) {
log_err("fio: io scheduler %s not found\n", td->ioscheduler);
+ td_verror(td, EINVAL, "iosched_switch");
goto err;
if (fio_setaffinity(td) == -1) {
goto err;
if (fio_setaffinity(td) == -1) {
+ td_verror(td, errno, "cpu_set_affinity");
if (td->ioprio) {
if (ioprio_set(IOPRIO_WHO_PROCESS, 0, td->ioprio) == -1) {
if (td->ioprio) {
if (ioprio_set(IOPRIO_WHO_PROCESS, 0, td->ioprio) == -1) {
+ td_verror(td, errno, "ioprio_set");
goto err;
}
}
if (nice(td->nice) == -1) {
goto err;
}
}
if (nice(td->nice) == -1) {
+ td_verror(td, errno, "nice");
#define IO_U_TIMEOUT_INC 5
#define IO_U_TIMEOUT 30
#define IO_U_TIMEOUT_INC 5
#define IO_U_TIMEOUT 30
-#define __td_verror(td, err, msg) \
+#define __td_verror(td, err, msg, func) \
do { \
if ((td)->error) \
break; \
int e = (err); \
(td)->error = e; \
do { \
if ((td)->error) \
break; \
int e = (err); \
(td)->error = e; \
- snprintf(td->verror, sizeof(td->verror) - 1, "file:%s:%d, error=%s", __FILE__, __LINE__, (msg)); \
+ snprintf(td->verror, sizeof(td->verror) - 1, "file:%s:%d, func=%s, error=%s", __FILE__, __LINE__, (func), (msg)); \
-#define td_verror(td, err) __td_verror((td), (err), strerror((err)))
-#define td_vmsg(td, err, msg) __td_verror((td), (err), (msg))
+#define td_verror(td, err, func) \
+ __td_verror((td), (err), strerror((err)), (func))
+#define td_vmsg(td, err, msg, func) \
+ __td_verror((td), (err), (msg), (func))
extern int exitall_on_terminate;
extern int thread_number;
extern int exitall_on_terminate;
extern int thread_number;
if (td->directory && td->directory[0] != '\0') {
if (lstat(td->directory, &sb) < 0) {
log_err("fio: %s is not a directory\n", td->directory);
if (td->directory && td->directory[0] != '\0') {
if (lstat(td->directory, &sb) < 0) {
log_err("fio: %s is not a directory\n", td->directory);
+ td_verror(td, errno, "lstat");
return 1;
}
if (!S_ISDIR(sb.st_mode)) {
return 1;
}
if (!S_ISDIR(sb.st_mode)) {
fd = open("/dev/urandom", O_RDONLY);
if (fd == -1) {
fd = open("/dev/urandom", O_RDONLY);
if (fd == -1) {
+ td_verror(td, errno, "open");
return 1;
}
if (read(fd, seeds, sizeof(seeds)) < (int) sizeof(seeds)) {
return 1;
}
if (read(fd, seeds, sizeof(seeds)) < (int) sizeof(seeds)) {
+ td_verror(td, EIO, "read");
if (min_events > 0) {
ret = td_io_commit(td);
if (ret < 0) {
if (min_events > 0) {
ret = td_io_commit(td);
if (ret < 0) {
+ td_verror(td, -ret, "td_io_commit");
ret = td_io_getevents(td, min_events, td->cur_depth, tvp);
if (ret < 0) {
ret = td_io_getevents(td, min_events, td->cur_depth, tvp);
if (ret < 0) {
+ td_verror(td, -ret, "td_io_getevents");
return ret;
} else if (!ret)
return ret;
return ret;
} else if (!ret)
return ret;
dlerror();
dlhandle = dlopen(engine_lib, RTLD_LAZY);
if (!dlhandle) {
dlerror();
dlhandle = dlopen(engine_lib, RTLD_LAZY);
if (!dlhandle) {
- td_vmsg(td, -1, dlerror());
+ td_vmsg(td, -1, dlerror(), "dlopen");
*/
ops = dlsym(dlhandle, "ioengine");
if (!ops) {
*/
ops = dlsym(dlhandle, "ioengine");
if (!ops) {
- td_vmsg(td, -1, dlerror());
+ td_vmsg(td, -1, dlerror(), "dlsym");
dlclose(dlhandle);
return NULL;
}
dlclose(dlhandle);
return NULL;
}
int td_io_commit(struct thread_data *td)
{
int td_io_commit(struct thread_data *td)
{
+ if (!td->cur_depth)
+ return 0;
if (td->io_ops->commit)
return td->io_ops->commit(td);
if (td->io_ops->commit)
return td->io_ops->commit(td);
td->shm_id = shmget(IPC_PRIVATE, td->orig_buffer_size, flags);
if (td->shm_id < 0) {
td->shm_id = shmget(IPC_PRIVATE, td->orig_buffer_size, flags);
if (td->shm_id < 0) {
+ td_verror(td, errno, "shmget");
perror("shmget");
return 1;
}
td->orig_buffer = shmat(td->shm_id, NULL, 0);
if (td->orig_buffer == (void *) -1) {
perror("shmget");
return 1;
}
td->orig_buffer = shmat(td->shm_id, NULL, 0);
if (td->orig_buffer == (void *) -1) {
+ td_verror(td, errno, "shmat");
perror("shmat");
td->orig_buffer = NULL;
return 1;
perror("shmat");
td->orig_buffer = NULL;
return 1;
td->mmapfd = open(td->mmapfile, O_RDWR|O_CREAT, 0644);
if (td->mmapfd < 0) {
td->mmapfd = open(td->mmapfile, O_RDWR|O_CREAT, 0644);
if (td->mmapfd < 0) {
+ td_verror(td, errno, "open");
perror("open mmap file");
td->orig_buffer = NULL;
return 1;
perror("open mmap file");
td->orig_buffer = NULL;
return 1;
td->orig_buffer = mmap(NULL, td->orig_buffer_size, PROT_READ | PROT_WRITE, flags, td->mmapfd, 0);
if (td->orig_buffer == MAP_FAILED) {
td->orig_buffer = mmap(NULL, td->orig_buffer_size, PROT_READ | PROT_WRITE, flags, td->mmapfd, 0);
if (td->orig_buffer == MAP_FAILED) {
+ td_verror(td, errno, "mmap");
perror("mmap");
td->orig_buffer = NULL;
if (td->mmapfd) {
perror("mmap");
td->orig_buffer = NULL;
if (td->mmapfd) {