rbd: Implement object map for tracking in-use objects

When enabled, the object map is stored in a new
'rbd_object_map.<id>' object in the image's pool. The
object map tracks blocks that are in-use, non-existent,
and are pending deletion.

Signed-off-by: Jason Dillaman <dillaman@redhat.com>
rbd: Use object map for IO operations

When the RBD object map is enabled, IO operations
now check whether or not an object exists before
sending a IO operation to RADOS.

Signed-off-by: Jason Dillaman <dillaman@redhat.com>
librados: Expose RadosClient instance id through librados

Allow librados clients to utilize the global id of the RadosClient.

Signed-off-by: Jason Dillaman <dillaman@redhat.com>
rbd: Coordinate maintenance through object map leader

When the object map is enabled, only a single client can
modify the image.  As a result, certain maintenance activities
need to be proxied from the maintenance client to the active
leader.

Signed-off-by: Jason Dillaman <dillaman@redhat.com>
rbd: Request object map leadership if image is modified

When the object map is enabled, attempting to modify the image
data while not the object map leader results in a promotion
request to the current leader.  The current leader will demote
itself so that the other client can become leader.

Signed-off-by: Jason Dillaman <dillaman@redhat.com>
rbd: Allow CLI to optionally create shared images

Shared images disable the use of the RBD object map.

Signed-off-by: Jason Dillaman <dillaman@redhat.com>