It should be possible to avoid the user of buffer heads in the ordered write mode by tagging each transaction and/or inode to indicate which page range(s) need writing back at journal flush time. It might also be ok to just writeback all dirty data for the inode in question without too much of a performance hit since we'll only be doing it on a journal flush. Either way it has two desirable properties: (1) we'd be able to move gfs2_writepages() for ordered write files to use mpage_writepages() as per the data=writeback mode and (2) we'd be able to get rid of all the ordered write special casing in the databuf_ functions in lops.c which would considerably simplify that code.
This has been pushed upstream: http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commitdiff;h=4513899092b3254b3539f92a65d2839afa1d50f6