On Thu, Jun 20, 2024 at 09:21:57PM +0800, Hongbo Li wrote: > Support fallback to buffered I/O if the operation being performed on > unaligned length or offset. This may change the behavior for direct > I/O in some cases. > > [Before] > For length which aligned with 256 bytes (not SECTOR aligned) will > read failed under direct I/O. > > [After] > For length which aligned with 256 bytes (not SECTOR aligned) will > read the data successfully under direct I/O because it will fallback > to buffer I/O. > > Signed-off-by: Hongbo Li <lihongbo22@xxxxxxxxxx> I don't think we want to do this in bcachefs - we can't efficiently mix buffered and O_DIRECT IO on the same file. This is true on any filesystem, but even moreso on bcachefs as we guarantee strict page cache consistency (O_DIRECT IO blocks pagecache fills, and vice versa). Better way to do that would be to make the bcachefs read path natively handle unaligned IO, which conceptually wouldn't be difficult since our read path already has support for bouncing when necessary (i.e. reading only part of a checksummed or compressed extent). The catch is that struct bio - bvec_iter - represents addresses with a sector_t, and we'd want that to be a loff_t. That's something we should do anyways; everything else in struct bio can represent a byte-aligned io, bvec_iter.bi_sector is the only exception and fixing that would help in consolidating our various scatter-gather list data structures - but we'd need buy-in from Jens and Christoph before doing that. As an intermediate solution (i.e., I would want it clearly labelled as a hack to be removed when the proper solution is merged and an explanation of what we actually want), we could add a loff_t to bch_read_bio, and only initialize bi_iter.bi_sector right before submit_bio() when we know our loff_t is properly aligned. But that'd be pretty ugly, we'd have to audit and probably add new helpers for everywhere we use a bvec_iter in the read path.