The IOKit alternative looks a little fragile in that it relies on the existence of a named property that you're already not very happy with. ;o) It's workable but quite unwieldy. It's a shame that there's no nice simple BSD way to get at this important information. Should I file an enhancement request for e.g. an fcntl selector? The implementation of the F_LOG2PHYS fcntl command comes very close to providing mnt_devblocksize already.
Do you think I'm ever likely to encounter RAID setups with mnt_devblocksize values greater than 4k? I'm much more concerned about taking the cluster_copy_upl_data hit than I am about being a little bit inefficient on volumes with 512 alignment. My code runs underneath video NLEs and is rarely used with formats that can be read off a standalone disk. If >4k is a possibility, I'll implement the IOKit code you suggest. Otherwise I think I'll just leave it hard coded to read from 4k offsets.