On Thu, Jun 13, 2019 at 1:56 PM Dave Chinner <david@xxxxxxxxxxxxx> wrote: > > - buffered read and buffered write can run concurrently if they > don't overlap, but right now they are serialised because that's the > only way to provide POSIX atomic write vs read semantics (only XFS > provides userspace with that guarantee). I do not believe that posix itself actually requires that at all, although extended standards may. That said, from a quality of implementation standpoint, it's obviously a good thing to do, so it might be worth looking at if something reasonable can be done. The XFS atomicity guarantees are better than what other filesystems give, but they might also not be exactly required. But POSIX actually ends up being pretty lax, and says "Writes can be serialized with respect to other reads and writes. If a read() of file data can be proven (by any means) to occur after a write() of the data, it must reflect that write(), even if the calls are made by different processes. A similar requirement applies to multiple write operations to the same file position. This is needed to guarantee the propagation of data from write() calls to subsequent read() calls. This requirement is particularly significant for networked file systems, where some caching schemes violate these semantics." Note the "can" in "can be serialized", not "must". Also note that whole language about how the read file data must match the written data only if the read can be proven to have occurred after a write of that data. Concurrency is very much left in the air, only provably serial operations matter. (There is also language that talks about "after the write has successfully returned" etc - again, it's about reads that occur _after_ the write, not concurrently with the write). The only atomicity guarantees are about the usual pipe writes and PIPE_BUF. Those are very explicit. Of course, there are lots of standards outside of just the POSIX read/write thing, so you may be thinking of some other stricter standard. POSIX itself has always been pretty permissive. And as mentioned, I do agree from a QoI standpoint that atomicity is nice, and that the XFS behavior is better. However, it does seem that nobody really cares, because I'm not sure we've ever done it in general (although we do have that i_rwsem, but I think it's mainly used to give the proper lseek behavior). And so the XFS behavior may not necessarily be *worth* it, although I presume you have some test for this as part of xfstests. Linus