if (fio_option_is_set(&td->o, write_hint) &&
(f->filetype == FIO_TYPE_BLOCK || f->filetype == FIO_TYPE_FILE)) {
uint64_t hint = td->o.write_hint;
+ int cmd;
- if (fcntl(f->fd, F_SET_RW_HINT, &hint) < 0) {
+ /*
+ * For direct IO, we just need/want to set the hint on
+ * the file descriptor. For buffered IO, we need to set
+ * it on the inode.
+ */
+ if (td->o.odirect)
+ cmd = F_SET_FILE_RW_HINT;
+ else
+ cmd = F_SET_RW_HINT;
+
+ if (fcntl(f->fd, cmd, &hint) < 0) {
td_verror(td, errno, "fcntl write hint");
goto err;
}
#endif
#define F_GET_RW_HINT (F_LINUX_SPECIFIC_BASE + 11)
#define F_SET_RW_HINT (F_LINUX_SPECIFIC_BASE + 12)
+#define F_GET_FILE_RW_HINT (F_LINUX_SPECIFIC_BASE + 13)
+#define F_SET_FILE_RW_HINT (F_LINUX_SPECIFIC_BASE + 14)
#endif
#ifndef RWH_WRITE_LIFE_NONE
-#define RWH_WRITE_LIFE_NONE 0
-#define RWH_WRITE_LIFE_SHORT 1
-#define RWH_WRITE_LIFE_MEDIUM 2
-#define RWH_WRITE_LIFE_LONG 3
-#define RWH_WRITE_LIFE_EXTREME 4
+#define RWH_WRITE_LIFE_NOT_SET 0
+#define RWH_WRITE_LIFE_NONE 1
+#define RWH_WRITE_LIFE_SHORT 2
+#define RWH_WRITE_LIFE_MEDIUM 3
+#define RWH_WRITE_LIFE_LONG 4
+#define RWH_WRITE_LIFE_EXTREME 5
#endif
#define FIO_HAVE_WRITE_HINT