"[..] Looks like the latest versions of cp use fiemap to decide if a file is
sparse, which is a great way to avoid doing memcmp, but only if your fiemap is really accurate about which ranges in the file have holes. Our fiemap tends to return holes for delalloc bytes, and has a few other bugs along the way. The end result is a bunch of zeros instead of good data when you copy the file. [..]"
patch is available here