Actually, there is traditional interface for both hole punching in files and releasing DASD blocks.
Standard long ago has specified that holes in sparse files are read as zeros.
Similarly, block should be freed or punched out automatically when it's overwritten with zeros, may be conditionally if it's not optimal thing to do.
There is no need for any special interfaces on any level.
And any such interface should just zero-fill underlaying storage if not supported as is, and never return its own error code.