rbd: record aggregate image request result

If any image object request produces a non-zero result, preserve
that as the result of the overall image request.  If multiple
objects have non-zero results, save the first one.

Signed-off-by: Alex Elder <elder@inktank.com>
rbd: define rbd image request type

Define a type for an rbd image request, either a block request
(initiated from the Linux block layer) or a parent request
(initiated to satisfy a layered rbd image request).

Signed-off-by: Alex Elder <elder@inktank.com>
rbd: encapsulate image object end request

Create a helper function that handles the final processing
of an image object request.

Signed-off-by: Alex Elder <elder@inktank.com>
rbd: record image-relative offset in object request

For an image object request we will need to know what offset within
the rbd image the request covers.  Record that when the object
request gets created.

Update the I/O error warnings so they use this so what's reported
is more informative.

Signed-off-by: Alex Elder <elder@inktank.com>
rbd: implement layered reads

First try.  It works, but it needs a LOT of testing.

Signed-off-by: Alex Elder <elder@inktank.com>