GNU cp seems to just skip blocks that are completely zeroed, leading to currently unsupported write patterns ("Wrong offset for writing to ...").
A simple mechanism should be implemented that fills the write queue with zeroed blocks for such write requests.