On Mon, Oct 20, 2014 at 1:20 PM, Max Reitz <mre...@redhat.com> wrote:

>  Am 2014-10-17 um 16:59 schrieb Sandeep Joshi:
>
>
>  Hi there,
>
>  Do let me know if I am asking these questions on the wrong forum.  I'd
> like to write a QEMU block driver which forwards IO requests to a
> custom-built storage cluster.
>
>  I have seen Jeff Cody's presentation <http://bugnik.us/kvm2013> and also
> browsed the source code for sheepdog, nbd and gluster in the "block"
> directory and had a few questions to confirm or correct my understanding.
>
>  1) What is the difference between bdrv_open and bdrv_file_open function
> pointers in the BlockDriver ?
>
>
> I'm not sure, but the main difference should be that bdrv_file_open() is
> invoked for protocol block drivers, whereas bdrv_open() is invoked for
> format block drivers. A couple of months ago, there was still a top-level
> bdrv_file_open() function which has since been integrated into bdrv_open(),
> so we might probably want to remove bdrv_file_open() in the future as
> well...
>
> But for now, use bdrv_file_open() for protocol drivers and bdrv_open() for
> format drivers.
>
>  2) Is it possible to implement only a protocol driver without a format
> driver (the distinction that Jeff made in his presentation above) ?  In
> other words, can I only set the "protocol_name" and not "format_name" in
> BlockDriver ?  I'd like to support all image formats (qemu, raw, etc)
> without having to reimplement the logic for each.
>
>
> Setting format_name does not make a block driver a format driver. A block
> driver can only be either protocol or format driver, and the distinction is
> probably made (again, I'd have to look it up to be sure) by protocol
> drivers setting protocol_name and bdrv_file_open(), whereas format drivers
> do not.
>
> So you just need to set protocol_name and bdrv_file_open() (and
> format_name as well, see nbd for an example where protocol_name and
> format_name differ) and qemu knows your block driver is a protocol driver
> and any format drivers will work on top of it. You should not set
> bdrv_open(), however.
>
> Once again, I'm not 100 % sure, but it should work that way.
>
> Just by the way, I can very well imagine that the distinction between
> protocol and format block drivers will disappear (at least in the code) in
> the future. But that should not be any of your concern. :-)
>


Yeah, right ! ;-)



>
>  3) The control flow for creating a file starts with the image format
> driver and later invokes the protocol driver.
>
> image_driver->bdrv_create()
>      --> bdrv_create_file
>            --> bdrv_find_protocol(filename)
>            --> bdrv_create
>                  ---> Protocol_driver->bdrv_create()
>
>  Is this the case for all functions?   Does the read/write first flow
> through the image format driver before getting passed down to the protocol
> driver (possibly via some coroutine invoked from the block layer or
> virtio-blk ) ?  Can someone give me a hint as to how I can trace the
> control flow ?
>
>
> Well, you can always use gdb with break points and backtraces. At least
> that's what I'd do.
>
> For your first question: Yes, for each guest device or let's say virtual
> guest device (because creating an image is not done through a guest device,
> but the only thing missing from a guest device configuration is in fact the
> device itself), there is a tree of BlockDriverStates. Every request runs
> through the whole tree. It may not touch all nodes, but it will start from
> the top (which is normally a format BDS) and then proceed as far as the
> block drivers create new requests to their children.
>
> Or, to be more technical: A request only goes to the topmost node in the
> BDS tree (the root). If need be, it will manually forward it to its child
> (which normally is bs->file if bs is a pointer to the BlockDriverState) or
> children (e.g. bs->backing_hd, the backing file, or driver-specific things,
> such as the children for the quorum block driver which are not stored in
> the BlockDriverState).
>
> This doesn't apply so well to bdrv_create(), because that function does
> not work on BlockDriverStates, but I'm hoping you're seeing the point.
>
> Shameless self plug: Regarding this whole BDS tree thing I can recommend
> Kevin's and my presentation from this year's KVM Forum:
> http://events.linuxfoundation.org/sites/events/files/slides/blockdev.pdf
>


Your shameless self-plug is priceless !  The pictures in there provide some
intuition of how the format and protocol drivers interact.

I will respond later on this thread after I have done some more digging and
have more questions.

 -Sandeep


>
> Max
>

Reply via email to