This is the second version of the series I first posted here:
I've reworked and refactored the first two patches in the series,
breaking them out into simpler, more self contained patches.
The main change from the previous version is that I dropped the
pre-allocation of the append transaction to avoid the nesting
problems it could cause.
The only other major change is that the ioend is only allocated when
a mapping is either for an unwritten region or spans EOF. hence if the
mapping is an overwrite within EOF we do not allocate an ioend, we
do not defer completion to the DIO workqueue and we do nothing in
the completion function as there is nothing to do.