« Previous | Next » 

Revision e1c66c6d

IDe1c66c6d82fe5988d66531febc27ef8480c44c8a

Added by Laszlo Ersek over 10 years ago

add skeleton for BSD licensed "raw" BlockDriver

On 08/05/13 15:03, Paolo Bonzini wrote:

----- Original Message -----

From: "Laszlo Ersek" <>
To: "Paolo Bonzini" <>
Sent: Monday, August 5, 2013 2:43:46 PM
Subject: Re: [PATCH 1/2] raw: add license header

On 08/02/13 00:27, Paolo Bonzini wrote:

On 08/01/2013 10:13 AM, Christoph Hellwig wrote:

On Wed, Jul 31, 2013 at 08:19:51AM +0200, Paolo Bonzini wrote:

Most of the block layer is under the BSD license, thus it is
reasonable to license block/raw.c the same way. CCed people should
ACK by replying with a Signed-off-by line.

The coded was intended to be GPLv2.

Laszlo, would you be willing to do clean-room reverse engineering?

(No rants, please. :))

What's the scope exactly?

It's quite small, it's a file full of forwarders like

static void raw_foo(BlockDriverState *bs) {
return bdrv_foo(bs->file);
}

It's 170 lines of code, all as boring as this. I only picked you
because I'm quite certain you have never seen the file (and the answer
confirmed it).

Basically:

1) BlockDriver is a struct in which these function members are
interesting:

.bdrv_reopen_prepare
.bdrv_co_readv
.bdrv_co_writev
.bdrv_co_is_allocated
.bdrv_co_write_zeroes
.bdrv_co_discard
.bdrv_getlength
.bdrv_get_info
.bdrv_truncate
.bdrv_is_inserted
.bdrv_media_changed
.bdrv_eject
.bdrv_lock_medium
.bdrv_ioctl
.bdrv_aio_ioctl
.bdrv_has_zero_init

They should be implemented as simple forwarders (see above).
There are 16 functions listed here, you can easily see how this
already accounts for 100+ SLOC roughly...

The implementations of bdrv_co_readv and bdrv_co_writev should also
call BLKDBG_EVENT on bs->file too, before forwarding to bs->file. The
events to be generated are BLKDBG_READ_AIO and BLKDBG_WRITE_AIO.

2) This is also a simple forwarder function:

.bdrv_create

but there is no BlockDriverState argument so the forwarded-to function
does not have a bs->file argument either. The forwarded-to function
is bdrv_create_file.

3) These members are special

.format_name is the string "raw"
.bdrv_open raw_open should set bs->sg to bs->file->sg and return 0
.bdrv_close raw_close should do nothing
.bdrv_probe raw_probe should just return 1.

4) There is another member, .create_options, which is an array of
QEMUOptionParameter structs, terminated by an all-zero item. The only
option you need is for the virtual disk size. You will find something
to copy from in other block drivers, for example block/qcow2.c.

5) Formats are registered with bdrv_register (takes a BlockDriver*).
You also need to pass the caller of bdrv_register to block_init.

6) I'm not sure how to organize the patch series, so I'll leave this to
your creativity. I guess in this case move/copy detection of git should
be disabled. I would definitely include this spec in the commit
message as a proof of clean-room reverse engineering.

7) Remember a BSD header like the one in block.c.

Paolo

This patch implements the email up to the paragraph ending with "100+ SLOC
roughly". The skeleton is generated from the list there, with a simple
shell loop using "sed" and the raw_foo() template.

The BSD license block is copied (and reflowed) from
"util/qemu-progress.c".

Signed-off-by: Laszlo Ersek <>
Signed-off-by: Kevin Wolf <>

Files

  • added
  • modified
  • copied
  • renamed
  • deleted

View differences