If filesystem has to guarantee write ordering, it has to serialize write request. So, only when 'A' is written to the block (completion received from block driver) filesystem can dispatch 'B' not before that. Remember that there could be failures too. So if 'A' is failed, request for 'B' is pending, would a filesystem fail that too? I guess not. Usually page cache absorbs such overwrites first than issues a single merged IO to block device, but what about direct IO? If applications need consistency guarantee against such failures, it should serialize writes. So to summarize, write ordering effort from each layers
Block driver: none
Filesystem: best effort
Application: full
Rajat