https://svnweb.freebsd.org/base?view=revision&revision=r344226
https://svnweb.freebsd.org/base?view=revision&revision=r344234
https://svnweb.freebsd.org/base?view=revision&revision=r348471
The bug occurred when a bounce buffer was used and the requested read
size was greater than the size of the bounce buffer. This commit also
rewrites the read logic so that it is easier to systematically verify
all alignment and size cases.