Another small question.   I noticed that all block drivers call block_init
("module_init") and qemu_system binary has the "--enable-modules" command
line option.

But does QEMU support building block drivers outside the main source tree
?   And can I load a new block driver module into running QEMU system -
like the Linux kernel allows ?   Or do I have to distribute an entire own
QEMU image if I add a new driver ?  I am not sure if what I am asking is
the same as https://wiki.ubuntu.com/QemuDiskHotplug

-Sandeep

On Tue, Oct 21, 2014 at 1:00 PM, Sandeep Joshi <sanjos...@gmail.com> wrote:

>
>
> 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