pagecache, zfs: make hole detection logic more efficient

Instead of searching for next data offset in a file before getting ARC
buffer this patch adds dmu_buf_hold_array_sparse() function which is variant
of dmu_buf_hold_array() but it returns an error if requested offset
belongs to a hole. This reduces amount of locks taken and avoids file
syncing that dmu_offset_next() does.

Reviewed-by: Glauber Costa <glommer@cloudius-systems.com>
Signed-off-by: Gleb Natapov <gleb@cloudius-systems.com>
Signed-off-by: Pekka Enberg <penberg@cloudius-systems.com>