Fix wrap issue with 64-bit pwritev2/preadv2
authorJens Axboe <axboe@fb.com>
Thu, 18 May 2017 17:59:09 +0000 (11:59 -0600)
committerJens Axboe <axboe@fb.com>
Thu, 18 May 2017 17:59:09 +0000 (11:59 -0600)
Apparently I missed that Linux does a clever trick to optimize
how we pass in lo/hi offsets for 64-bit, and it encodes the
full offset in just the low part. This caused corruption when
writing with pwritev2 for laver sizes, and bad data for preadv2
for larger sizes.

Signed-off-by: Jens Axboe <axboe@fb.com>
os/os-linux.h

index 911f7e7c8710719d5c6d2d9b094efb096077f0c5..695e9dad0fc04204b20f94901be68801581c3904 100644 (file)
@@ -314,9 +314,15 @@ static inline int fio_set_sched_idle(void)
 static inline void make_pos_h_l(unsigned long *pos_h, unsigned long *pos_l,
                                off_t offset)
 {
+#if BITS_PER_LONG == 64
+#warning 64
+       *pos_l = offset;
+       *pos_h = 0;
+#else
+#warning 32
        *pos_l = offset & 0xffffffff;
        *pos_h = ((uint64_t) offset) >> 32;
-
+#endif
 }
 static inline ssize_t preadv2(int fd, const struct iovec *iov, int iovcnt,
                              off_t offset, unsigned int flags)