On Tue, May 17, 2022 at 04:55:20PM -0600, Keith Busch wrote: > A little less easy than I thought... This is what I'm coming up with, and it's > bad enough that I'm sure there has to be a better way. Specifically concerning > is the new "do_dma()" function below, and was the only way I managed to get the > correct 'struct block_device' whether we're stat'ing a filesystem file or raw > block device file. I don't think doing this in common code makes much sense. The core VFS code should not have to know if something is on a block device or not. Instead add a new getattr method to block/bdev.c for the block devices, and just have a helper to set the alinments(s) based on that by it, and any file systems that is made ready to accept lower alignment. And I'd prefer to do them individully and tested as there might be all kinds of assumptions. For all other instances keep the value as 0 for unknown. > --- a/include/uapi/linux/stat.h > +++ b/include/uapi/linux/stat.h > @@ -106,7 +106,7 @@ struct statx { > __u32 stx_uid; /* User ID of owner */ > __u32 stx_gid; /* Group ID of owner */ > __u16 stx_mode; /* File mode */ > - __u16 __spare0[1]; > + __u16 stx_dma; /* DMA alignment */ I'd name this dio_mem_alignment, because it is is: a) specific to direct I/O b) DMA is just the implementation detail, but not the user semantics while we're at it, please also add a dio_file_alignment for the alignment in the file, which can be sector or fs block size. I'm perfectly fine if you only do it for the block layer first, I'll take up the wok to update the most common file systems after that.