ioengine.h revision bcd5abfa9f230bbe4365dad1289fdea1f5509f74
1dcefb588d556828af570221b2dc276a6376c8557Jens Axboe#ifndef FIO_IOENGINE_H
2dcefb588d556828af570221b2dc276a6376c8557Jens Axboe#define FIO_IOENGINE_H
3dcefb588d556828af570221b2dc276a6376c8557Jens Axboe
467bf982340d95ca98098ea050b54b4c7adb116c0Jens Axboe#ifdef CONFIG_LIBAIO
567bf982340d95ca98098ea050b54b4c7adb116c0Jens Axboe#include <libaio.h>
667bf982340d95ca98098ea050b54b4c7adb116c0Jens Axboe#endif
767bf982340d95ca98098ea050b54b4c7adb116c0Jens Axboe#ifdef CONFIG_GUASI
867bf982340d95ca98098ea050b54b4c7adb116c0Jens Axboe#include <guasi.h>
967bf982340d95ca98098ea050b54b4c7adb116c0Jens Axboe#endif
1067bf982340d95ca98098ea050b54b4c7adb116c0Jens Axboe
11bcd5abfa9f230bbe4365dad1289fdea1f5509f74Jens Axboe#define FIO_IOOPS_VERSION	15
12dcefb588d556828af570221b2dc276a6376c8557Jens Axboe
13dcefb588d556828af570221b2dc276a6376c8557Jens Axboeenum {
140c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran	IO_U_F_FREE		= 1 << 0,
150c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran	IO_U_F_FLIGHT		= 1 << 1,
160c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran	IO_U_F_FREE_DEF		= 1 << 2,
170c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran	IO_U_F_IN_CUR_DEPTH	= 1 << 3,
1838dad62d5154ffaad445bd0231b271b9a46a5190Jens Axboe	IO_U_F_BUSY_OK		= 1 << 4,
190d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	IO_U_F_TRIMMED		= 1 << 5,
201ef2b6be973eded12827990ae1a9eb28b7b20be7Jens Axboe	IO_U_F_BARRIER		= 1 << 6,
2182af2a7ca1a543b41c003de69d5e3c36860f47d5Jens Axboe	IO_U_F_VER_LIST		= 1 << 7,
22dcefb588d556828af570221b2dc276a6376c8557Jens Axboe};
23dcefb588d556828af570221b2dc276a6376c8557Jens Axboe
24dcefb588d556828af570221b2dc276a6376c8557Jens Axboe/*
25dcefb588d556828af570221b2dc276a6376c8557Jens Axboe * The io unit
26dcefb588d556828af570221b2dc276a6376c8557Jens Axboe */
27dcefb588d556828af570221b2dc276a6376c8557Jens Axboestruct io_u {
28dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	union {
2967bf982340d95ca98098ea050b54b4c7adb116c0Jens Axboe#ifdef CONFIG_LIBAIO
30dcefb588d556828af570221b2dc276a6376c8557Jens Axboe		struct iocb iocb;
31dcefb588d556828af570221b2dc276a6376c8557Jens Axboe#endif
3267bf982340d95ca98098ea050b54b4c7adb116c0Jens Axboe#ifdef CONFIG_POSIXAIO
33e97c14423a5688d7adfb342c16363c263cb741f9Jens Axboe		os_aiocb_t aiocb;
34dcefb588d556828af570221b2dc276a6376c8557Jens Axboe#endif
35dcefb588d556828af570221b2dc276a6376c8557Jens Axboe#ifdef FIO_HAVE_SGIO
36dcefb588d556828af570221b2dc276a6376c8557Jens Axboe		struct sg_io_hdr hdr;
37dcefb588d556828af570221b2dc276a6376c8557Jens Axboe#endif
3867bf982340d95ca98098ea050b54b4c7adb116c0Jens Axboe#ifdef CONFIG_GUASI
39dcefb588d556828af570221b2dc276a6376c8557Jens Axboe		guasi_req_t greq;
40dcefb588d556828af570221b2dc276a6376c8557Jens Axboe#endif
4167bf982340d95ca98098ea050b54b4c7adb116c0Jens Axboe#ifdef CONFIG_SOLARISAIO
42dcefb588d556828af570221b2dc276a6376c8557Jens Axboe		aio_result_t resultp;
43dcefb588d556828af570221b2dc276a6376c8557Jens Axboe#endif
4479a43187163eb99eaabaa496cb8b5e3a164f3e09Jens Axboe#ifdef FIO_HAVE_BINJECT
4579a43187163eb99eaabaa496cb8b5e3a164f3e09Jens Axboe		struct b_user_cmd buc;
4679a43187163eb99eaabaa496cb8b5e3a164f3e09Jens Axboe#endif
4767bf982340d95ca98098ea050b54b4c7adb116c0Jens Axboe#ifdef CONFIG_RDMA
4821b8aee865f0d3960687ce6ba7385e5977f45061ren yufei		struct ibv_mr *mr;
4921b8aee865f0d3960687ce6ba7385e5977f45061ren yufei#endif
50dcefb588d556828af570221b2dc276a6376c8557Jens Axboe		void *mmap_data;
51dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	};
52dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	struct timeval start_time;
53dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	struct timeval issue_time;
54dcefb588d556828af570221b2dc276a6376c8557Jens Axboe
55d72be5454c8c5378f16804ff9b8d1afe8729a380Jens Axboe	struct fio_file *file;
56d72be5454c8c5378f16804ff9b8d1afe8729a380Jens Axboe	unsigned int flags;
57d72be5454c8c5378f16804ff9b8d1afe8729a380Jens Axboe	enum fio_ddir ddir;
58d72be5454c8c5378f16804ff9b8d1afe8729a380Jens Axboe
59dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	/*
60bcd5abfa9f230bbe4365dad1289fdea1f5509f74Jens Axboe	 * For replay workloads, we may want to account as a different
61bcd5abfa9f230bbe4365dad1289fdea1f5509f74Jens Axboe	 * IO type than what is being submitted.
62bcd5abfa9f230bbe4365dad1289fdea1f5509f74Jens Axboe	 */
63bcd5abfa9f230bbe4365dad1289fdea1f5509f74Jens Axboe	enum fio_ddir acct_ddir;
64bcd5abfa9f230bbe4365dad1289fdea1f5509f74Jens Axboe
65bcd5abfa9f230bbe4365dad1289fdea1f5509f74Jens Axboe	/*
66dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	 * Allocated/set buffer and length
67dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	 */
68dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	unsigned long buflen;
69dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	unsigned long long offset;
70d72be5454c8c5378f16804ff9b8d1afe8729a380Jens Axboe	void *buf;
71dcefb588d556828af570221b2dc276a6376c8557Jens Axboe
72dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	/*
737d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	 * Initial seed for generating the buffer contents
747d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	 */
757d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	unsigned long rand_seed;
767d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
777d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	/*
78dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	 * IO engine state, may be different from above when we get
79dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	 * partial transfers / residual data counts
80dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	 */
81dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	void *xfer_buf;
82dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	unsigned long xfer_buflen;
83dcefb588d556828af570221b2dc276a6376c8557Jens Axboe
849522850758ecad087891710b391b4e77f6bff839Jens Axboe	/*
859522850758ecad087891710b391b4e77f6bff839Jens Axboe	 * Parameter related to pre-filled buffers and
869522850758ecad087891710b391b4e77f6bff839Jens Axboe	 * their size to handle variable block sizes.
879522850758ecad087891710b391b4e77f6bff839Jens Axboe	 */
889522850758ecad087891710b391b4e77f6bff839Jens Axboe	unsigned long buf_filled_len;
899522850758ecad087891710b391b4e77f6bff839Jens Axboe
90dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	unsigned int resid;
91dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	unsigned int error;
92dcefb588d556828af570221b2dc276a6376c8557Jens Axboe
93dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	/*
94dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	 * io engine private data
95dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	 */
96dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	union {
97dcefb588d556828af570221b2dc276a6376c8557Jens Axboe		unsigned int index;
98dcefb588d556828af570221b2dc276a6376c8557Jens Axboe		unsigned int seen;
99dcefb588d556828af570221b2dc276a6376c8557Jens Axboe		void *engine_data;
100dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	};
101dcefb588d556828af570221b2dc276a6376c8557Jens Axboe
102dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	struct flist_head list;
103dcefb588d556828af570221b2dc276a6376c8557Jens Axboe
104dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	/*
105dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	 * Callback for io completion
106dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	 */
107dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	int (*end_io)(struct thread_data *, struct io_u *);
108dcefb588d556828af570221b2dc276a6376c8557Jens Axboe};
109dcefb588d556828af570221b2dc276a6376c8557Jens Axboe
110dcefb588d556828af570221b2dc276a6376c8557Jens Axboe/*
111dcefb588d556828af570221b2dc276a6376c8557Jens Axboe * io_ops->queue() return values
112dcefb588d556828af570221b2dc276a6376c8557Jens Axboe */
113dcefb588d556828af570221b2dc276a6376c8557Jens Axboeenum {
114dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	FIO_Q_COMPLETED	= 0,		/* completed sync */
115dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	FIO_Q_QUEUED	= 1,		/* queued, will complete async */
116dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	FIO_Q_BUSY	= 2,		/* no more room, call ->commit() */
117dcefb588d556828af570221b2dc276a6376c8557Jens Axboe};
118dcefb588d556828af570221b2dc276a6376c8557Jens Axboe
119dcefb588d556828af570221b2dc276a6376c8557Jens Axboestruct ioengine_ops {
120dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	struct flist_head list;
121dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	char name[16];
122dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	int version;
123dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	int flags;
124dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	int (*setup)(struct thread_data *);
125dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	int (*init)(struct thread_data *);
126dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	int (*prep)(struct thread_data *, struct io_u *);
127dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	int (*queue)(struct thread_data *, struct io_u *);
128dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	int (*commit)(struct thread_data *);
129dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	int (*getevents)(struct thread_data *, unsigned int, unsigned int, struct timespec *);
130dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	struct io_u *(*event)(struct thread_data *, int);
131dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	int (*cancel)(struct thread_data *, struct io_u *);
132dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	void (*cleanup)(struct thread_data *);
133dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	int (*open_file)(struct thread_data *, struct fio_file *);
134dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	int (*close_file)(struct thread_data *, struct fio_file *);
135dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	int (*get_file_size)(struct thread_data *, struct fio_file *);
13636d80bc7c7f7fbc2612941b7dd7ceaf645798c7fJens Axboe	void (*terminate)(struct thread_data *);
137c73ed24623ad94a5254e8302298797aba2eb1e9aJens Axboe	int (*io_u_init)(struct thread_data *, struct io_u *);
138c73ed24623ad94a5254e8302298797aba2eb1e9aJens Axboe	void (*io_u_free)(struct thread_data *, struct io_u *);
139de890a1e48d40238dac69f302708dde8719de240Steven Lang	int option_struct_size;
140de890a1e48d40238dac69f302708dde8719de240Steven Lang	struct fio_option *options;
141dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	void *data;
142dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	void *dlhandle;
143dcefb588d556828af570221b2dc276a6376c8557Jens Axboe};
144dcefb588d556828af570221b2dc276a6376c8557Jens Axboe
1452b4f4abec640f36ccdff39de00e74b2234e27116Jens Axboeenum fio_ioengine_flags {
1462b4f4abec640f36ccdff39de00e74b2234e27116Jens Axboe	FIO_SYNCIO	= 1 << 0,	/* io engine has synchronous ->queue */
1472b4f4abec640f36ccdff39de00e74b2234e27116Jens Axboe	FIO_RAWIO	= 1 << 1,	/* some sort of direct/raw io */
1482b4f4abec640f36ccdff39de00e74b2234e27116Jens Axboe	FIO_DISKLESSIO	= 1 << 2,	/* no disk involved */
1492b4f4abec640f36ccdff39de00e74b2234e27116Jens Axboe	FIO_NOEXTEND	= 1 << 3,	/* engine can't extend file */
15093bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran	FIO_NODISKUTIL  = 1 << 4,	/* diskutil can't handle filename */
1512b4f4abec640f36ccdff39de00e74b2234e27116Jens Axboe	FIO_UNIDIR	= 1 << 5,	/* engine is uni-directional */
1522b4f4abec640f36ccdff39de00e74b2234e27116Jens Axboe	FIO_NOIO	= 1 << 6,	/* thread does only pseudo IO */
15336d80bc7c7f7fbc2612941b7dd7ceaf645798c7fJens Axboe	FIO_PIPEIO	= 1 << 7,	/* input/output no seekable */
15436d80bc7c7f7fbc2612941b7dd7ceaf645798c7fJens Axboe	FIO_BARRIER	= 1 << 8,	/* engine supports barriers */
15536d80bc7c7f7fbc2612941b7dd7ceaf645798c7fJens Axboe	FIO_MEMALIGN	= 1 << 9,	/* engine wants aligned memory */
1562b4f4abec640f36ccdff39de00e74b2234e27116Jens Axboe};
157dcefb588d556828af570221b2dc276a6376c8557Jens Axboe
158dcefb588d556828af570221b2dc276a6376c8557Jens Axboe/*
159dcefb588d556828af570221b2dc276a6376c8557Jens Axboe * io engine entry points
160dcefb588d556828af570221b2dc276a6376c8557Jens Axboe */
161dcefb588d556828af570221b2dc276a6376c8557Jens Axboeextern int __must_check td_io_init(struct thread_data *);
162dcefb588d556828af570221b2dc276a6376c8557Jens Axboeextern int __must_check td_io_prep(struct thread_data *, struct io_u *);
163dcefb588d556828af570221b2dc276a6376c8557Jens Axboeextern int __must_check td_io_queue(struct thread_data *, struct io_u *);
164dcefb588d556828af570221b2dc276a6376c8557Jens Axboeextern int __must_check td_io_sync(struct thread_data *, struct fio_file *);
165dcefb588d556828af570221b2dc276a6376c8557Jens Axboeextern int __must_check td_io_getevents(struct thread_data *, unsigned int, unsigned int, struct timespec *);
166dcefb588d556828af570221b2dc276a6376c8557Jens Axboeextern int __must_check td_io_commit(struct thread_data *);
167dcefb588d556828af570221b2dc276a6376c8557Jens Axboeextern int __must_check td_io_open_file(struct thread_data *, struct fio_file *);
168dcefb588d556828af570221b2dc276a6376c8557Jens Axboeextern int td_io_close_file(struct thread_data *, struct fio_file *);
169dcefb588d556828af570221b2dc276a6376c8557Jens Axboeextern int __must_check td_io_get_file_size(struct thread_data *, struct fio_file *);
170dcefb588d556828af570221b2dc276a6376c8557Jens Axboe
171dcefb588d556828af570221b2dc276a6376c8557Jens Axboeextern struct ioengine_ops *load_ioengine(struct thread_data *, const char *);
172dcefb588d556828af570221b2dc276a6376c8557Jens Axboeextern void register_ioengine(struct ioengine_ops *);
173dcefb588d556828af570221b2dc276a6376c8557Jens Axboeextern void unregister_ioengine(struct ioengine_ops *);
174de890a1e48d40238dac69f302708dde8719de240Steven Langextern void free_ioengine(struct thread_data *);
175dcefb588d556828af570221b2dc276a6376c8557Jens Axboeextern void close_ioengine(struct thread_data *);
176dcefb588d556828af570221b2dc276a6376c8557Jens Axboe
177de890a1e48d40238dac69f302708dde8719de240Steven Langextern int fio_show_ioengine_help(const char *engine);
178de890a1e48d40238dac69f302708dde8719de240Steven Lang
179dcefb588d556828af570221b2dc276a6376c8557Jens Axboe/*
180dcefb588d556828af570221b2dc276a6376c8557Jens Axboe * io unit handling
181dcefb588d556828af570221b2dc276a6376c8557Jens Axboe */
182dcefb588d556828af570221b2dc276a6376c8557Jens Axboe#define queue_full(td)	flist_empty(&(td)->io_u_freelist)
183dcefb588d556828af570221b2dc276a6376c8557Jens Axboeextern struct io_u *__get_io_u(struct thread_data *);
184dcefb588d556828af570221b2dc276a6376c8557Jens Axboeextern struct io_u *get_io_u(struct thread_data *);
185dcefb588d556828af570221b2dc276a6376c8557Jens Axboeextern void put_io_u(struct thread_data *, struct io_u *);
186f2bba1820a567ac00b09916239ac8feb125cead2Radha Ramachandranextern void clear_io_u(struct thread_data *, struct io_u *);
187dcefb588d556828af570221b2dc276a6376c8557Jens Axboeextern void requeue_io_u(struct thread_data *, struct io_u **);
188581e71417760e0aa86eac0acd704253ff0eeea4fJens Axboeextern int __must_check io_u_sync_complete(struct thread_data *, struct io_u *, unsigned long *);
189581e71417760e0aa86eac0acd704253ff0eeea4fJens Axboeextern int __must_check io_u_queued_complete(struct thread_data *, int, unsigned long *);
190dcefb588d556828af570221b2dc276a6376c8557Jens Axboeextern void io_u_queued(struct thread_data *, struct io_u *);
191dcefb588d556828af570221b2dc276a6376c8557Jens Axboeextern void io_u_log_error(struct thread_data *, struct io_u *);
192dcefb588d556828af570221b2dc276a6376c8557Jens Axboeextern void io_u_mark_depth(struct thread_data *, unsigned int);
1939c42684e32325da26e862280388798343c5f1305Jens Axboeextern void io_u_fill_buffer(struct thread_data *td, struct io_u *, unsigned int, unsigned int);
194dcefb588d556828af570221b2dc276a6376c8557Jens Axboevoid io_u_mark_complete(struct thread_data *, unsigned int);
195dcefb588d556828af570221b2dc276a6376c8557Jens Axboevoid io_u_mark_submit(struct thread_data *, unsigned int);
196dcefb588d556828af570221b2dc276a6376c8557Jens Axboe
1970a28ecda80a78c9d70ae38ced58f3a2fa9c9529dJens Axboeint do_io_u_sync(struct thread_data *, struct io_u *);
198a5f3027cb0495dfe217b2626d248fcc054e7e878Jens Axboeint do_io_u_trim(struct thread_data *, struct io_u *);
19944f29692cfba246981bb3c1b894333a6d2209f51Jens Axboe
200c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe#ifdef FIO_INC_DEBUG
201c592b9fe12d4739d99d5bece517e304804876df6Jens Axboestatic inline void dprint_io_u(struct io_u *io_u, const char *p)
202c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe{
203c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe	struct fio_file *f = io_u->file;
204c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe
205c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe	dprint(FD_IO, "%s: io_u %p: off=%llu/len=%lu/ddir=%d", p, io_u,
206c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe					(unsigned long long) io_u->offset,
207c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe					io_u->buflen, io_u->ddir);
208c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe	if (fio_debug & (1 << FD_IO)) {
209c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe		if (f)
210c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe			log_info("/%s", f->file_name);
211c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe
212c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe		log_info("\n");
213c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe	}
214c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe}
215c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe#else
216c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe#define dprint_io_u(io_u, p)
217c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe#endif
218c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe
219bcd5abfa9f230bbe4365dad1289fdea1f5509f74Jens Axboestatic inline enum fio_ddir acct_ddir(struct io_u *io_u)
220bcd5abfa9f230bbe4365dad1289fdea1f5509f74Jens Axboe{
221bcd5abfa9f230bbe4365dad1289fdea1f5509f74Jens Axboe	if (io_u->acct_ddir != -1)
222bcd5abfa9f230bbe4365dad1289fdea1f5509f74Jens Axboe		return io_u->acct_ddir;
223bcd5abfa9f230bbe4365dad1289fdea1f5509f74Jens Axboe
224bcd5abfa9f230bbe4365dad1289fdea1f5509f74Jens Axboe	return io_u->ddir;
225bcd5abfa9f230bbe4365dad1289fdea1f5509f74Jens Axboe}
226bcd5abfa9f230bbe4365dad1289fdea1f5509f74Jens Axboe
227dcefb588d556828af570221b2dc276a6376c8557Jens Axboe#endif
228