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>
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)