ioengines.c revision 78e51c7279a93d3f6200d58a72a813c3ba852c2e
1ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe/* 2ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe * The io parts of the fio tool, includes workers for sync and mmap'ed 3ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe * io, as well as both posix and linux libaio support. 4ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe * 5ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe * sync io is implemented on top of aio. 6ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe * 7ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe * This is not really specific to fio, if the get_io_u/put_io_u and 8ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe * structures was pulled into this as well it would be a perfectly 9ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe * generic io engine that could be used for other projects. 10ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe * 11ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe */ 12ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#include <stdio.h> 13ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#include <stdlib.h> 14ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#include <unistd.h> 155c4e1dbc4ec6ee963220c5f4e64a04cd6130dc81Jens Axboe#include <string.h> 162866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe#include <dlfcn.h> 170c6e75175bcaf8d05bfa88aa8caa584fbb848b74Jens Axboe#include <assert.h> 188c16d840377c1e6fb79f479ee60590a2da5b52eeJens Axboe 19ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#include "fio.h" 207c9b1bce094d58c374b086bbb780c08265623ea4Jens Axboe#include "diskutil.h" 21ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe 2201743ee1718e7ec4b16ae3e53c8f64900c6052ccJens Axboestatic FLIST_HEAD(engine_list); 235f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe 248c16d840377c1e6fb79f479ee60590a2da5b52eeJens Axboestatic int check_engine_ops(struct ioengine_ops *ops) 258c16d840377c1e6fb79f479ee60590a2da5b52eeJens Axboe{ 265f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe if (ops->version != FIO_IOOPS_VERSION) { 275ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe log_err("bad ioops version %d (want %d)\n", ops->version, 285ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe FIO_IOOPS_VERSION); 295f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe return 1; 305f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe } 315f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe 3236167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe if (!ops->queue) { 3336167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe log_err("%s: no queue handler\n", ops->name); 3436167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe return 1; 3536167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe } 3636167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe 3736167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe /* 3836167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe * sync engines only need a ->queue() 3936167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe */ 4036167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe if (ops->flags & FIO_SYNCIO) 4136167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe return 0; 425ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe 438c16d840377c1e6fb79f479ee60590a2da5b52eeJens Axboe if (!ops->event) { 4436167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe log_err("%s: no event handler\n", ops->name); 458c16d840377c1e6fb79f479ee60590a2da5b52eeJens Axboe return 1; 468c16d840377c1e6fb79f479ee60590a2da5b52eeJens Axboe } 478c16d840377c1e6fb79f479ee60590a2da5b52eeJens Axboe if (!ops->getevents) { 4836167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe log_err("%s: no getevents handler\n", ops->name); 498c16d840377c1e6fb79f479ee60590a2da5b52eeJens Axboe return 1; 508c16d840377c1e6fb79f479ee60590a2da5b52eeJens Axboe } 518c16d840377c1e6fb79f479ee60590a2da5b52eeJens Axboe if (!ops->queue) { 5236167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe log_err("%s: no queue handler\n", ops->name); 538c16d840377c1e6fb79f479ee60590a2da5b52eeJens Axboe return 1; 548c16d840377c1e6fb79f479ee60590a2da5b52eeJens Axboe } 555ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe 568c16d840377c1e6fb79f479ee60590a2da5b52eeJens Axboe return 0; 578c16d840377c1e6fb79f479ee60590a2da5b52eeJens Axboe} 588c16d840377c1e6fb79f479ee60590a2da5b52eeJens Axboe 595f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboevoid unregister_ioengine(struct ioengine_ops *ops) 60ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe{ 61ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe dprint(FD_IO, "ioengine %s unregistered\n", ops->name); 6201743ee1718e7ec4b16ae3e53c8f64900c6052ccJens Axboe flist_del(&ops->list); 6301743ee1718e7ec4b16ae3e53c8f64900c6052ccJens Axboe INIT_FLIST_HEAD(&ops->list); 645f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe} 655f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe 66b2fdda43cf0699f60e711429c778ff1685e30062Jens Axboevoid register_ioengine(struct ioengine_ops *ops) 675f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe{ 68ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe dprint(FD_IO, "ioengine %s registered\n", ops->name); 6901743ee1718e7ec4b16ae3e53c8f64900c6052ccJens Axboe INIT_FLIST_HEAD(&ops->list); 7001743ee1718e7ec4b16ae3e53c8f64900c6052ccJens Axboe flist_add_tail(&ops->list, &engine_list); 715f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe} 725f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe 735f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboestatic struct ioengine_ops *find_ioengine(const char *name) 745f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe{ 755f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe struct ioengine_ops *ops; 7601743ee1718e7ec4b16ae3e53c8f64900c6052ccJens Axboe struct flist_head *entry; 77ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe 7801743ee1718e7ec4b16ae3e53c8f64900c6052ccJens Axboe flist_for_each(entry, &engine_list) { 7901743ee1718e7ec4b16ae3e53c8f64900c6052ccJens Axboe ops = flist_entry(entry, struct ioengine_ops, list); 80bc5b77a8c46aabea554c4a2c8cca37f27f97969aJens Axboe if (!strcmp(name, ops->name)) 815f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe return ops; 825f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe } 835f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe 845f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe return NULL; 855f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe} 865f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe 875f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboestatic struct ioengine_ops *dlopen_ioengine(struct thread_data *td, 885f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe const char *engine_lib) 895f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe{ 905f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe struct ioengine_ops *ops; 915f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe void *dlhandle; 925f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe 93ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe dprint(FD_IO, "dload engine %s\n", engine_lib); 94ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe 952866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe dlerror(); 962866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe dlhandle = dlopen(engine_lib, RTLD_LAZY); 97d4dbaaa821b9d3dd34ca002d1976d4f924a07a47Jens Axboe if (!dlhandle) { 98e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe td_vmsg(td, -1, dlerror(), "dlopen"); 99d4dbaaa821b9d3dd34ca002d1976d4f924a07a47Jens Axboe return NULL; 100d4dbaaa821b9d3dd34ca002d1976d4f924a07a47Jens Axboe } 1018756e4d421722eaeb089067aeaaf317d05d53a57Jens Axboe 102da51c0505c753f64ad5f65808377b8f67b445828Jens Axboe /* 103da51c0505c753f64ad5f65808377b8f67b445828Jens Axboe * Unlike the included modules, external engines should have a 104da51c0505c753f64ad5f65808377b8f67b445828Jens Axboe * non-static ioengine structure that we can reference. 105da51c0505c753f64ad5f65808377b8f67b445828Jens Axboe */ 1062866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe ops = dlsym(dlhandle, "ioengine"); 107d4dbaaa821b9d3dd34ca002d1976d4f924a07a47Jens Axboe if (!ops) { 108e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe td_vmsg(td, -1, dlerror(), "dlsym"); 109d4dbaaa821b9d3dd34ca002d1976d4f924a07a47Jens Axboe dlclose(dlhandle); 110d4dbaaa821b9d3dd34ca002d1976d4f924a07a47Jens Axboe return NULL; 111d4dbaaa821b9d3dd34ca002d1976d4f924a07a47Jens Axboe } 1128756e4d421722eaeb089067aeaaf317d05d53a57Jens Axboe 1135f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe ops->dlhandle = dlhandle; 1145f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe return ops; 1155f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe} 1165f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe 1175f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboestruct ioengine_ops *load_ioengine(struct thread_data *td, const char *name) 1185f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe{ 1195f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe struct ioengine_ops *ops, *ret; 1205f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe char engine[16]; 1215f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe 122ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe dprint(FD_IO, "load ioengine %s\n", name); 123ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe 1245f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe strncpy(engine, name, sizeof(engine) - 1); 1255f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe 1265f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe /* 1275f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe * linux libaio has alias names, so convert to what we want 1285f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe */ 1295f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe if (!strncmp(engine, "linuxaio", 8) || !strncmp(engine, "aio", 3)) 1305f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe strcpy(engine, "libaio"); 1315f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe 1325f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe ops = find_ioengine(engine); 1335f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe if (!ops) 1345f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe ops = dlopen_ioengine(td, name); 1355f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe 1365f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe if (!ops) { 1375f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe log_err("fio: engine %s not loadable\n", name); 138b902ceb53977a12062c615ab529ca0c3422e3cffJens Axboe return NULL; 139b902ceb53977a12062c615ab529ca0c3422e3cffJens Axboe } 140b902ceb53977a12062c615ab529ca0c3422e3cffJens Axboe 1418c16d840377c1e6fb79f479ee60590a2da5b52eeJens Axboe /* 1428c16d840377c1e6fb79f479ee60590a2da5b52eeJens Axboe * Check that the required methods are there. 1438c16d840377c1e6fb79f479ee60590a2da5b52eeJens Axboe */ 1445f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe if (check_engine_ops(ops)) 1458c16d840377c1e6fb79f479ee60590a2da5b52eeJens Axboe return NULL; 1468c16d840377c1e6fb79f479ee60590a2da5b52eeJens Axboe 14784585003d025a38b91749cb0d68f6b5653d1f1a3Jens Axboe ret = malloc(sizeof(*ret)); 14884585003d025a38b91749cb0d68f6b5653d1f1a3Jens Axboe memcpy(ret, ops, sizeof(*ret)); 14984585003d025a38b91749cb0d68f6b5653d1f1a3Jens Axboe ret->data = NULL; 15084585003d025a38b91749cb0d68f6b5653d1f1a3Jens Axboe 15184585003d025a38b91749cb0d68f6b5653d1f1a3Jens Axboe return ret; 1528756e4d421722eaeb089067aeaaf317d05d53a57Jens Axboe} 1538756e4d421722eaeb089067aeaaf317d05d53a57Jens Axboe 1542866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboevoid close_ioengine(struct thread_data *td) 1558756e4d421722eaeb089067aeaaf317d05d53a57Jens Axboe{ 156ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe dprint(FD_IO, "close ioengine %s\n", td->io_ops->name); 157ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe 1582992b059b8f54ac91e723a8bde629b4d8fed513eJens Axboe if (td->io_ops->cleanup) { 1592866c82d598e30604d8a92723c664ee6ced90fb0Jens Axboe td->io_ops->cleanup(td); 1602992b059b8f54ac91e723a8bde629b4d8fed513eJens Axboe td->io_ops->data = NULL; 1612992b059b8f54ac91e723a8bde629b4d8fed513eJens Axboe } 162b990b5c06801d6d25e3fcc5415efbbe7bb23341eJens Axboe 1635f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe if (td->io_ops->dlhandle) 1645f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe dlclose(td->io_ops->dlhandle); 1655f350952eff89948bfbf1eb6ac4d3d08a9109581Jens Axboe 16684585003d025a38b91749cb0d68f6b5653d1f1a3Jens Axboe free(td->io_ops); 16784585003d025a38b91749cb0d68f6b5653d1f1a3Jens Axboe td->io_ops = NULL; 168b990b5c06801d6d25e3fcc5415efbbe7bb23341eJens Axboe} 16910ba535a5cbb95b5576e33a6f8af093a6ca3bfd7Jens Axboe 17010ba535a5cbb95b5576e33a6f8af093a6ca3bfd7Jens Axboeint td_io_prep(struct thread_data *td, struct io_u *io_u) 17110ba535a5cbb95b5576e33a6f8af093a6ca3bfd7Jens Axboe{ 172ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe dprint_io_u(io_u, "prep"); 1737101d9c24abec4be58a086d85d6d92ec6e6492e9Jens Axboe fio_ro_check(td, io_u); 1747101d9c24abec4be58a086d85d6d92ec6e6492e9Jens Axboe 1754d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe lock_file(td, io_u->file, io_u->ddir); 176b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe 1772ba1c290d09af6d630d84a58b97b8032f73bc2ceJens Axboe if (td->io_ops->prep) { 1782ba1c290d09af6d630d84a58b97b8032f73bc2ceJens Axboe int ret = td->io_ops->prep(td, io_u); 1792ba1c290d09af6d630d84a58b97b8032f73bc2ceJens Axboe 1802ba1c290d09af6d630d84a58b97b8032f73bc2ceJens Axboe dprint(FD_IO, "->prep(%p)=%d\n", io_u, ret); 181b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe if (ret) 1824d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe unlock_file(td, io_u->file); 1832ba1c290d09af6d630d84a58b97b8032f73bc2ceJens Axboe return ret; 1842ba1c290d09af6d630d84a58b97b8032f73bc2ceJens Axboe } 18510ba535a5cbb95b5576e33a6f8af093a6ca3bfd7Jens Axboe 18610ba535a5cbb95b5576e33a6f8af093a6ca3bfd7Jens Axboe return 0; 18710ba535a5cbb95b5576e33a6f8af093a6ca3bfd7Jens Axboe} 18810ba535a5cbb95b5576e33a6f8af093a6ca3bfd7Jens Axboe 189e7d2e61694c62b90a2fb84c012b4edcc1973d72cJens Axboeint td_io_getevents(struct thread_data *td, unsigned int min, unsigned int max, 19010ba535a5cbb95b5576e33a6f8af093a6ca3bfd7Jens Axboe struct timespec *t) 19110ba535a5cbb95b5576e33a6f8af093a6ca3bfd7Jens Axboe{ 192ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe int r = 0; 193face81b280ab94ba5d975739578779157c8b54ceJens Axboe 194ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe if (min > 0 && td->io_ops->commit) { 195ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe r = td->io_ops->commit(td); 196face81b280ab94ba5d975739578779157c8b54ceJens Axboe if (r < 0) 197ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe goto out; 198face81b280ab94ba5d975739578779157c8b54ceJens Axboe } 1994950421a7e379ba0ca642390ae4ae7b68e92a42fJens Axboe if (max > td->cur_depth) 2004950421a7e379ba0ca642390ae4ae7b68e92a42fJens Axboe max = td->cur_depth; 2014950421a7e379ba0ca642390ae4ae7b68e92a42fJens Axboe if (min > max) 2024950421a7e379ba0ca642390ae4ae7b68e92a42fJens Axboe max = min; 20336167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe 204ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe r = 0; 2054950421a7e379ba0ca642390ae4ae7b68e92a42fJens Axboe if (max && td->io_ops->getevents) 206ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe r = td->io_ops->getevents(td, min, max, t); 207ee56ad500f6692381e131cc37299d23fa910a24aJens Axboeout: 208838bc709279964bdcc64070d4eb2777a0f79bcbbJens Axboe if (r >= 0) 209838bc709279964bdcc64070d4eb2777a0f79bcbbJens Axboe io_u_mark_complete(td, r); 210f3e11d0575df5b93cd09f8658964e1fb5d38a774Jens Axboe else 2117c639b1495d2776afbf66f91accff1e6000aa8f0Jens Axboe td_verror(td, r, "get_events"); 212f3e11d0575df5b93cd09f8658964e1fb5d38a774Jens Axboe 213ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe dprint(FD_IO, "getevents: %d\n", r); 214ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe return r; 21510ba535a5cbb95b5576e33a6f8af093a6ca3bfd7Jens Axboe} 21610ba535a5cbb95b5576e33a6f8af093a6ca3bfd7Jens Axboe 21710ba535a5cbb95b5576e33a6f8af093a6ca3bfd7Jens Axboeint td_io_queue(struct thread_data *td, struct io_u *io_u) 21810ba535a5cbb95b5576e33a6f8af093a6ca3bfd7Jens Axboe{ 2197e77dd026d85253936aef432ba8f3e89b96b805cJens Axboe int ret; 2207e77dd026d85253936aef432ba8f3e89b96b805cJens Axboe 221ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe dprint_io_u(io_u, "queue"); 2227101d9c24abec4be58a086d85d6d92ec6e6492e9Jens Axboe fio_ro_check(td, io_u); 2237101d9c24abec4be58a086d85d6d92ec6e6492e9Jens Axboe 2240c6e75175bcaf8d05bfa88aa8caa584fbb848b74Jens Axboe assert((io_u->flags & IO_U_F_FLIGHT) == 0); 2250c6e75175bcaf8d05bfa88aa8caa584fbb848b74Jens Axboe io_u->flags |= IO_U_F_FLIGHT; 2260c6e75175bcaf8d05bfa88aa8caa584fbb848b74Jens Axboe 227d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe assert(fio_file_open(io_u->file)); 2283d7b485f9478ed5d291ec58a16a40781ae3ab4aeJens Axboe 229117868024939609aebd94fff5afacfd29b2f9a6fJens Axboe io_u->error = 0; 230117868024939609aebd94fff5afacfd29b2f9a6fJens Axboe io_u->resid = 0; 231117868024939609aebd94fff5afacfd29b2f9a6fJens Axboe 232433afcb4fe81e775c15af9d39a6f4db8a53d693aJens Axboe if (td->io_ops->flags & FIO_SYNCIO) { 23312d9d841526ad75a67bb43a90edeefd05f85f11eJens Axboe if (fio_fill_issue_time(td)) 2349520ebb9f4dd88d086e313ae97e37ebb6d4f240bJens Axboe fio_gettime(&io_u->issue_time, NULL); 235d0c153284c1e6505e711c71e6412e6fef02853b8Jens Axboe 236d0c153284c1e6505e711c71e6412e6fef02853b8Jens Axboe /* 237d0c153284c1e6505e711c71e6412e6fef02853b8Jens Axboe * only used for iolog 238d0c153284c1e6505e711c71e6412e6fef02853b8Jens Axboe */ 239d0c153284c1e6505e711c71e6412e6fef02853b8Jens Axboe if (td->o.read_iolog_file) 240d0c153284c1e6505e711c71e6412e6fef02853b8Jens Axboe memcpy(&td->last_issue, &io_u->issue_time, 2415ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe sizeof(struct timeval)); 242433afcb4fe81e775c15af9d39a6f4db8a53d693aJens Axboe } 243433afcb4fe81e775c15af9d39a6f4db8a53d693aJens Axboe 244ff58fcede39d16a2c642897cbe5a7f28b2da1950Jens Axboe if (ddir_rw(io_u->ddir)) 245755200a326a33e5e19b16dfd5e013dd98bcf1916Jens Axboe td->io_issues[io_u->ddir]++; 246755200a326a33e5e19b16dfd5e013dd98bcf1916Jens Axboe 2477e77dd026d85253936aef432ba8f3e89b96b805cJens Axboe ret = td->io_ops->queue(td, io_u); 2485aeb77df5d75d1065b339c47afbd882a3c04702eJens Axboe 2494d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe unlock_file(td, io_u->file); 250b2bd2bd96a09540b3add0ec74db2cdb1c145ca33Jens Axboe 251cb21168269d746d80d82f28ed4db65c2750a8fd7Jens Axboe /* 252cb21168269d746d80d82f28ed4db65c2750a8fd7Jens Axboe * Add warning for O_DIRECT so that users have an easier time 253cb21168269d746d80d82f28ed4db65c2750a8fd7Jens Axboe * spotting potentially bad alignment. If this triggers for the first 254cb21168269d746d80d82f28ed4db65c2750a8fd7Jens Axboe * IO, then it's likely an alignment problem or because the host fs 255cb21168269d746d80d82f28ed4db65c2750a8fd7Jens Axboe * does not support O_DIRECT 256cb21168269d746d80d82f28ed4db65c2750a8fd7Jens Axboe */ 257ff58fcede39d16a2c642897cbe5a7f28b2da1950Jens Axboe if (io_u->error == EINVAL && td->io_issues[io_u->ddir & 1] == 1 && 258cb21168269d746d80d82f28ed4db65c2750a8fd7Jens Axboe td->o.odirect) { 259cb21168269d746d80d82f28ed4db65c2750a8fd7Jens Axboe log_info("fio: first direct IO errored. File system may not " 260cb21168269d746d80d82f28ed4db65c2750a8fd7Jens Axboe "support direct IO, or iomem_align= is bad.\n"); 261cb21168269d746d80d82f28ed4db65c2750a8fd7Jens Axboe } 262cb21168269d746d80d82f28ed4db65c2750a8fd7Jens Axboe 263838bc709279964bdcc64070d4eb2777a0f79bcbbJens Axboe if (!td->io_ops->commit) { 264838bc709279964bdcc64070d4eb2777a0f79bcbbJens Axboe io_u_mark_submit(td, 1); 265838bc709279964bdcc64070d4eb2777a0f79bcbbJens Axboe io_u_mark_complete(td, 1); 266838bc709279964bdcc64070d4eb2777a0f79bcbbJens Axboe } 267838bc709279964bdcc64070d4eb2777a0f79bcbbJens Axboe 268d8005759746a2cb5c8269201911b1997aa714e80Jens Axboe if (ret == FIO_Q_COMPLETED) { 269ff58fcede39d16a2c642897cbe5a7f28b2da1950Jens Axboe if (ddir_rw(io_u->ddir)) { 270d8005759746a2cb5c8269201911b1997aa714e80Jens Axboe io_u_mark_depth(td, 1); 271d8005759746a2cb5c8269201911b1997aa714e80Jens Axboe td->ts.total_io_u[io_u->ddir]++; 2720d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe } else if (io_u->ddir == DDIR_TRIM) 2730d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe td->ts.total_io_u[2]++; 274d8005759746a2cb5c8269201911b1997aa714e80Jens Axboe } else if (ret == FIO_Q_QUEUED) { 275eb7c8ae27bc301b77490b3586dd5ccab7c95880aJens Axboe int r; 276eb7c8ae27bc301b77490b3586dd5ccab7c95880aJens Axboe 277ff58fcede39d16a2c642897cbe5a7f28b2da1950Jens Axboe if (ddir_rw(io_u->ddir)) { 278d8005759746a2cb5c8269201911b1997aa714e80Jens Axboe td->io_u_queued++; 279d8005759746a2cb5c8269201911b1997aa714e80Jens Axboe td->ts.total_io_u[io_u->ddir]++; 280d8005759746a2cb5c8269201911b1997aa714e80Jens Axboe } 281d8005759746a2cb5c8269201911b1997aa714e80Jens Axboe 282d8005759746a2cb5c8269201911b1997aa714e80Jens Axboe if (td->io_u_queued >= td->o.iodepth_batch) { 283eb7c8ae27bc301b77490b3586dd5ccab7c95880aJens Axboe r = td_io_commit(td); 284eb7c8ae27bc301b77490b3586dd5ccab7c95880aJens Axboe if (r < 0) 285eb7c8ae27bc301b77490b3586dd5ccab7c95880aJens Axboe return r; 286eb7c8ae27bc301b77490b3586dd5ccab7c95880aJens Axboe } 287eb7c8ae27bc301b77490b3586dd5ccab7c95880aJens Axboe } 288cb5ab5121ac4fa62e0ca2612b359f19bfdd30f29Jens Axboe 289433afcb4fe81e775c15af9d39a6f4db8a53d693aJens Axboe if ((td->io_ops->flags & FIO_SYNCIO) == 0) { 29012d9d841526ad75a67bb43a90edeefd05f85f11eJens Axboe if (fio_fill_issue_time(td)) 2919520ebb9f4dd88d086e313ae97e37ebb6d4f240bJens Axboe fio_gettime(&io_u->issue_time, NULL); 292d0c153284c1e6505e711c71e6412e6fef02853b8Jens Axboe 293d0c153284c1e6505e711c71e6412e6fef02853b8Jens Axboe /* 294d0c153284c1e6505e711c71e6412e6fef02853b8Jens Axboe * only used for iolog 295d0c153284c1e6505e711c71e6412e6fef02853b8Jens Axboe */ 296d0c153284c1e6505e711c71e6412e6fef02853b8Jens Axboe if (td->o.read_iolog_file) 297d0c153284c1e6505e711c71e6412e6fef02853b8Jens Axboe memcpy(&td->last_issue, &io_u->issue_time, 298d0c153284c1e6505e711c71e6412e6fef02853b8Jens Axboe sizeof(struct timeval)); 299433afcb4fe81e775c15af9d39a6f4db8a53d693aJens Axboe } 300433afcb4fe81e775c15af9d39a6f4db8a53d693aJens Axboe 3017e77dd026d85253936aef432ba8f3e89b96b805cJens Axboe return ret; 30210ba535a5cbb95b5576e33a6f8af093a6ca3bfd7Jens Axboe} 3038c16d840377c1e6fb79f479ee60590a2da5b52eeJens Axboe 3048c16d840377c1e6fb79f479ee60590a2da5b52eeJens Axboeint td_io_init(struct thread_data *td) 3058c16d840377c1e6fb79f479ee60590a2da5b52eeJens Axboe{ 306eeb121607c2a7f36b0fac17649cb8081d6fd853bJens Axboe int ret = 0; 3078c16d840377c1e6fb79f479ee60590a2da5b52eeJens Axboe 308eeb121607c2a7f36b0fac17649cb8081d6fd853bJens Axboe if (td->io_ops->init) { 309eeb121607c2a7f36b0fac17649cb8081d6fd853bJens Axboe ret = td->io_ops->init(td); 3105ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe if (ret && td->o.iodepth > 1) { 3115ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe log_err("fio: io engine init failed. Perhaps try" 3125ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe " reducing io depth?\n"); 3135ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe } 314eeb121607c2a7f36b0fac17649cb8081d6fd853bJens Axboe } 315eeb121607c2a7f36b0fac17649cb8081d6fd853bJens Axboe 316eeb121607c2a7f36b0fac17649cb8081d6fd853bJens Axboe return ret; 3178c16d840377c1e6fb79f479ee60590a2da5b52eeJens Axboe} 318755200a326a33e5e19b16dfd5e013dd98bcf1916Jens Axboe 319755200a326a33e5e19b16dfd5e013dd98bcf1916Jens Axboeint td_io_commit(struct thread_data *td) 320755200a326a33e5e19b16dfd5e013dd98bcf1916Jens Axboe{ 321f3e11d0575df5b93cd09f8658964e1fb5d38a774Jens Axboe int ret; 322f3e11d0575df5b93cd09f8658964e1fb5d38a774Jens Axboe 323ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe dprint(FD_IO, "calling ->commit(), depth %d\n", td->cur_depth); 324ee56ad500f6692381e131cc37299d23fa910a24aJens Axboe 325d8005759746a2cb5c8269201911b1997aa714e80Jens Axboe if (!td->cur_depth || !td->io_u_queued) 326e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe return 0; 327cb5ab5121ac4fa62e0ca2612b359f19bfdd30f29Jens Axboe 328d8005759746a2cb5c8269201911b1997aa714e80Jens Axboe io_u_mark_depth(td, td->io_u_queued); 329cb5ab5121ac4fa62e0ca2612b359f19bfdd30f29Jens Axboe td->io_u_queued = 0; 330d8005759746a2cb5c8269201911b1997aa714e80Jens Axboe 331f3e11d0575df5b93cd09f8658964e1fb5d38a774Jens Axboe if (td->io_ops->commit) { 332f3e11d0575df5b93cd09f8658964e1fb5d38a774Jens Axboe ret = td->io_ops->commit(td); 333f3e11d0575df5b93cd09f8658964e1fb5d38a774Jens Axboe if (ret) 334f3e11d0575df5b93cd09f8658964e1fb5d38a774Jens Axboe td_verror(td, -ret, "io commit"); 335f3e11d0575df5b93cd09f8658964e1fb5d38a774Jens Axboe } 336755200a326a33e5e19b16dfd5e013dd98bcf1916Jens Axboe 337755200a326a33e5e19b16dfd5e013dd98bcf1916Jens Axboe return 0; 338755200a326a33e5e19b16dfd5e013dd98bcf1916Jens Axboe} 339b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe 340b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboeint td_io_open_file(struct thread_data *td, struct fio_file *f) 341b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe{ 34222a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe assert(!fio_file_open(f)); 34322a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe assert(f->fd == -1); 34422a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe 345413d669320995eaef092c58e67cdb7b500134551Jens Axboe if (td->io_ops->open_file(td, f)) { 346413d669320995eaef092c58e67cdb7b500134551Jens Axboe if (td->error == EINVAL && td->o.odirect) 347413d669320995eaef092c58e67cdb7b500134551Jens Axboe log_err("fio: destination does not support O_DIRECT\n"); 3485ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe if (td->error == EMFILE) { 3495ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe log_err("fio: try reducing/setting openfiles (failed" 3505ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe " at %u of %u)\n", td->nr_open_files, 3515ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe td->o.nr_files); 3525ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe } 353413d669320995eaef092c58e67cdb7b500134551Jens Axboe 35422a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe assert(f->fd == -1); 35522a57ba81de2c3f458797e9158da760c9e0ea435Jens Axboe assert(!fio_file_open(f)); 356413d669320995eaef092c58e67cdb7b500134551Jens Axboe return 1; 357413d669320995eaef092c58e67cdb7b500134551Jens Axboe } 358413d669320995eaef092c58e67cdb7b500134551Jens Axboe 359d5707a3565e958af566247e2c0acf09e031d8921Jens Axboe fio_file_reset(f); 360d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe fio_file_set_open(f); 361d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe fio_file_clear_closing(f); 362c97bd0fa0f68d924f4e6f3c480f380c4ca20b872Jens Axboe disk_util_inc(f->du); 363d5707a3565e958af566247e2c0acf09e031d8921Jens Axboe 364d5707a3565e958af566247e2c0acf09e031d8921Jens Axboe td->nr_open_files++; 365d5707a3565e958af566247e2c0acf09e031d8921Jens Axboe get_file(f); 366d5707a3565e958af566247e2c0acf09e031d8921Jens Axboe 367661598287ecc3b8987f312cf8403936552ce686aJens Axboe if (f->filetype == FIO_TYPE_PIPE) { 368661598287ecc3b8987f312cf8403936552ce686aJens Axboe if (td_random(td)) { 369661598287ecc3b8987f312cf8403936552ce686aJens Axboe log_err("fio: can't seek on pipes (no random io)\n"); 370661598287ecc3b8987f312cf8403936552ce686aJens Axboe goto err; 371661598287ecc3b8987f312cf8403936552ce686aJens Axboe } 372661598287ecc3b8987f312cf8403936552ce686aJens Axboe } 373661598287ecc3b8987f312cf8403936552ce686aJens Axboe 374413d669320995eaef092c58e67cdb7b500134551Jens Axboe if (td->io_ops->flags & FIO_DISKLESSIO) 375413d669320995eaef092c58e67cdb7b500134551Jens Axboe goto done; 376413d669320995eaef092c58e67cdb7b500134551Jens Axboe 377413d669320995eaef092c58e67cdb7b500134551Jens Axboe if (td->o.invalidate_cache && file_invalidate_cache(td, f)) 378413d669320995eaef092c58e67cdb7b500134551Jens Axboe goto err; 379413d669320995eaef092c58e67cdb7b500134551Jens Axboe 380661598287ecc3b8987f312cf8403936552ce686aJens Axboe if (td->o.fadvise_hint && 381661598287ecc3b8987f312cf8403936552ce686aJens Axboe (f->filetype == FIO_TYPE_BD || f->filetype == FIO_TYPE_FILE)) { 382413d669320995eaef092c58e67cdb7b500134551Jens Axboe int flags; 383413d669320995eaef092c58e67cdb7b500134551Jens Axboe 384413d669320995eaef092c58e67cdb7b500134551Jens Axboe if (td_random(td)) 385413d669320995eaef092c58e67cdb7b500134551Jens Axboe flags = POSIX_FADV_RANDOM; 386413d669320995eaef092c58e67cdb7b500134551Jens Axboe else 387413d669320995eaef092c58e67cdb7b500134551Jens Axboe flags = POSIX_FADV_SEQUENTIAL; 388413d669320995eaef092c58e67cdb7b500134551Jens Axboe 389413d669320995eaef092c58e67cdb7b500134551Jens Axboe if (fadvise(f->fd, f->file_offset, f->io_size, flags) < 0) { 390413d669320995eaef092c58e67cdb7b500134551Jens Axboe td_verror(td, errno, "fadvise"); 391413d669320995eaef092c58e67cdb7b500134551Jens Axboe goto err; 392413d669320995eaef092c58e67cdb7b500134551Jens Axboe } 3937bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe } 394a978ba684deb758465a0ccb18a008797636e8054Jens Axboe 395e116f2b90f110334e77741227ad4e4600302c718Jens Axboe#ifdef FIO_OS_DIRECTIO 396e116f2b90f110334e77741227ad4e4600302c718Jens Axboe /* 397e116f2b90f110334e77741227ad4e4600302c718Jens Axboe * Some OS's have a distinct call to mark the file non-buffered, 398e116f2b90f110334e77741227ad4e4600302c718Jens Axboe * instead of using O_DIRECT (Solaris) 399e116f2b90f110334e77741227ad4e4600302c718Jens Axboe */ 400e116f2b90f110334e77741227ad4e4600302c718Jens Axboe if (td->o.odirect) { 401e116f2b90f110334e77741227ad4e4600302c718Jens Axboe int ret = fio_set_odirect(f->fd); 402e116f2b90f110334e77741227ad4e4600302c718Jens Axboe 403e116f2b90f110334e77741227ad4e4600302c718Jens Axboe if (ret) { 404e116f2b90f110334e77741227ad4e4600302c718Jens Axboe td_verror(td, ret, "fio_set_odirect"); 40578e51c7279a93d3f6200d58a72a813c3ba852c2eJens Axboe log_err("fio: the file system does not seem to support direct IO\n"); 406e116f2b90f110334e77741227ad4e4600302c718Jens Axboe goto err; 407e116f2b90f110334e77741227ad4e4600302c718Jens Axboe } 408e116f2b90f110334e77741227ad4e4600302c718Jens Axboe } 409e116f2b90f110334e77741227ad4e4600302c718Jens Axboe#endif 410e116f2b90f110334e77741227ad4e4600302c718Jens Axboe 411413d669320995eaef092c58e67cdb7b500134551Jens Axboedone: 412f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe log_file(td, f, FIO_LOG_OPEN_FILE); 413413d669320995eaef092c58e67cdb7b500134551Jens Axboe return 0; 414413d669320995eaef092c58e67cdb7b500134551Jens Axboeerr: 415c97bd0fa0f68d924f4e6f3c480f380c4ca20b872Jens Axboe disk_util_dec(f->du); 416b284075ab5414220496f396dff038003e57e3047Jens Axboe if (td->io_ops->close_file) 417b284075ab5414220496f396dff038003e57e3047Jens Axboe td->io_ops->close_file(td, f); 4187bb48f84ac78cac1f90e3e04d0220d90d6a64a6bJens Axboe return 1; 419b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe} 420b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe 4216977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboeint td_io_close_file(struct thread_data *td, struct fio_file *f) 422b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe{ 423d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe if (!fio_file_closing(f)) 424f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe log_file(td, f, FIO_LOG_CLOSE_FILE); 425f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe 4260ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe /* 4270ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe * mark as closing, do real close when last io on it has completed 4280ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe */ 429d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe fio_file_set_closing(f); 4300ad920e7f85db1fdc26649be6bc7e584e8c7fdc9Jens Axboe 431c97bd0fa0f68d924f4e6f3c480f380c4ca20b872Jens Axboe disk_util_dec(f->du); 4324d4e80f2b4260f2c8b37a8612ce655502a799f7aJens Axboe unlock_file_all(td, f); 43329c1349f1840c3f60434c9da602074bc8fde4afeJens Axboe 4346977bcd0e4ee3faa7ffd8f208e4031bdf906ed88Jens Axboe return put_file(td, f); 435b5af82930ccfd7dda6a1b11794efb452eb76d8dcJens Axboe} 436df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe 437df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboeint td_io_get_file_size(struct thread_data *td, struct fio_file *f) 438df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe{ 439df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe if (!td->io_ops->get_file_size) 440df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe return 0; 441df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe 442df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe return td->io_ops->get_file_size(td, f); 443df9c26b10275a631e83e7cc92d5f7384998b2c49Jens Axboe} 44444f29692cfba246981bb3c1b894333a6d2209f51Jens Axboe 4450a28ecda80a78c9d70ae38ced58f3a2fa9c9529dJens Axboestatic int do_sync_file_range(struct thread_data *td, struct fio_file *f) 44644f29692cfba246981bb3c1b894333a6d2209f51Jens Axboe{ 44744f29692cfba246981bb3c1b894333a6d2209f51Jens Axboe off64_t offset, nbytes; 44844f29692cfba246981bb3c1b894333a6d2209f51Jens Axboe 44944f29692cfba246981bb3c1b894333a6d2209f51Jens Axboe offset = f->first_write; 45044f29692cfba246981bb3c1b894333a6d2209f51Jens Axboe nbytes = f->last_write - f->first_write; 45144f29692cfba246981bb3c1b894333a6d2209f51Jens Axboe 4523843deb322eb7b54d2d19d7b1ce19c5dc44d57ffJens Axboe if (!nbytes) 4533843deb322eb7b54d2d19d7b1ce19c5dc44d57ffJens Axboe return 0; 45444f29692cfba246981bb3c1b894333a6d2209f51Jens Axboe 4553843deb322eb7b54d2d19d7b1ce19c5dc44d57ffJens Axboe return sync_file_range(f->fd, offset, nbytes, td->o.sync_file_range); 45644f29692cfba246981bb3c1b894333a6d2209f51Jens Axboe} 4570a28ecda80a78c9d70ae38ced58f3a2fa9c9529dJens Axboe 4580a28ecda80a78c9d70ae38ced58f3a2fa9c9529dJens Axboeint do_io_u_sync(struct thread_data *td, struct io_u *io_u) 4590a28ecda80a78c9d70ae38ced58f3a2fa9c9529dJens Axboe{ 4600a28ecda80a78c9d70ae38ced58f3a2fa9c9529dJens Axboe int ret; 4610a28ecda80a78c9d70ae38ced58f3a2fa9c9529dJens Axboe 4620a28ecda80a78c9d70ae38ced58f3a2fa9c9529dJens Axboe if (io_u->ddir == DDIR_SYNC) { 4630a28ecda80a78c9d70ae38ced58f3a2fa9c9529dJens Axboe ret = fsync(io_u->file->fd); 4640a28ecda80a78c9d70ae38ced58f3a2fa9c9529dJens Axboe } else if (io_u->ddir == DDIR_DATASYNC) { 4650a28ecda80a78c9d70ae38ced58f3a2fa9c9529dJens Axboe#ifdef FIO_HAVE_FDATASYNC 4660a28ecda80a78c9d70ae38ced58f3a2fa9c9529dJens Axboe ret = fdatasync(io_u->file->fd); 4670a28ecda80a78c9d70ae38ced58f3a2fa9c9529dJens Axboe#else 4680a28ecda80a78c9d70ae38ced58f3a2fa9c9529dJens Axboe ret = io_u->xfer_buflen; 4690a28ecda80a78c9d70ae38ced58f3a2fa9c9529dJens Axboe io_u->error = EINVAL; 4700a28ecda80a78c9d70ae38ced58f3a2fa9c9529dJens Axboe#endif 4710a28ecda80a78c9d70ae38ced58f3a2fa9c9529dJens Axboe } else if (io_u->ddir == DDIR_SYNC_FILE_RANGE) 4720a28ecda80a78c9d70ae38ced58f3a2fa9c9529dJens Axboe ret = do_sync_file_range(td, io_u->file); 4730a28ecda80a78c9d70ae38ced58f3a2fa9c9529dJens Axboe else { 4740a28ecda80a78c9d70ae38ced58f3a2fa9c9529dJens Axboe ret = io_u->xfer_buflen; 4750a28ecda80a78c9d70ae38ced58f3a2fa9c9529dJens Axboe io_u->error = EINVAL; 4760a28ecda80a78c9d70ae38ced58f3a2fa9c9529dJens Axboe } 4770a28ecda80a78c9d70ae38ced58f3a2fa9c9529dJens Axboe 478cb849a795d2bfd99efdd66f5a3e475c9fb3edd86Jens Axboe if (ret < 0) 479cb849a795d2bfd99efdd66f5a3e475c9fb3edd86Jens Axboe io_u->error = errno; 480cb849a795d2bfd99efdd66f5a3e475c9fb3edd86Jens Axboe 4810a28ecda80a78c9d70ae38ced58f3a2fa9c9529dJens Axboe return ret; 4820a28ecda80a78c9d70ae38ced58f3a2fa9c9529dJens Axboe} 483a5f3027cb0495dfe217b2626d248fcc054e7e878Jens Axboe 484a5f3027cb0495dfe217b2626d248fcc054e7e878Jens Axboeint do_io_u_trim(struct thread_data *td, struct io_u *io_u) 485a5f3027cb0495dfe217b2626d248fcc054e7e878Jens Axboe{ 486a5f3027cb0495dfe217b2626d248fcc054e7e878Jens Axboe#ifndef FIO_HAVE_TRIM 487a5f3027cb0495dfe217b2626d248fcc054e7e878Jens Axboe io_u->error = EINVAL; 488ff58fcede39d16a2c642897cbe5a7f28b2da1950Jens Axboe return 0; 489a5f3027cb0495dfe217b2626d248fcc054e7e878Jens Axboe#else 490a5f3027cb0495dfe217b2626d248fcc054e7e878Jens Axboe struct fio_file *f = io_u->file; 491a5f3027cb0495dfe217b2626d248fcc054e7e878Jens Axboe int ret; 492a5f3027cb0495dfe217b2626d248fcc054e7e878Jens Axboe 493c6404a44d139fb494202f9d968f7affe8c3d986fJens Axboe ret = os_trim(f->fd, io_u->offset, io_u->xfer_buflen); 494a5f3027cb0495dfe217b2626d248fcc054e7e878Jens Axboe if (!ret) 495ff58fcede39d16a2c642897cbe5a7f28b2da1950Jens Axboe return io_u->xfer_buflen;; 496a5f3027cb0495dfe217b2626d248fcc054e7e878Jens Axboe 497ff58fcede39d16a2c642897cbe5a7f28b2da1950Jens Axboe io_u->error = ret; 498ff58fcede39d16a2c642897cbe5a7f28b2da1950Jens Axboe return 0; 499a5f3027cb0495dfe217b2626d248fcc054e7e878Jens Axboe#endif 500a5f3027cb0495dfe217b2626d248fcc054e7e878Jens Axboe} 501