On Thu, Jun 24, 2021 at 03:00:39AM +0100, Matthew Wilcox wrote: > On Wed, Jun 23, 2021 at 02:58:32PM -0700, Omar Sandoval wrote: > > But what you described would look more like: > > > > // Needs to be large enough for maximum returned header + data. > > char buffer[...]; > > struct iovec iov[] = { > > { buffer, sizeof(buffer) }, > > }; > > preadv2(fd, iov, 2, -1, RWF_ENCODED); > > // We should probably align the buffer. > > struct encoded_iov *encoded_iov = (void *)buffer; > > char *data = buffer + encoded_iov->size; > > > > That's a little uglier, but it should work, and allows for arbitrary > > extensions. So, among these three alternatives (fixed size structure > > with reserved space, variable size structure like above, or ioctl), > > which would you prefer? > > Does that work for O_DIRECT and the required 512-byte alignment? I suppose the kernel could pad the encoded_iov structure with zeroes to the next sector boundary, since zeroes are effectively noops for encoded_iov. (As an aside, RWF_ENCODED is always "direct I/O" in the sense that it bypasses the page cache, but not necessarily in the sense that it does DMA to/from the user buffers. The Btrfs implementation doesn't do the latter yet.)