The Monday 01 Sep 2014 à 15:43:08 (+0800), Liu Yuan wrote : > Driver operations are defined as callbacks passed from block upper drivers to > lower drivers and are supposed to be called by lower drivers. > > Requests handling(queuing, submitting, etc.) are done in protocol tier in the > block layer and connection states are also maintained down there. Driver > operations are supposed to notify the upper tier (such as quorum) of the > states > changes. > > For now only two operation are added: > > driver_disconnect: called when connection is off > driver_reconnect: called when connection is on after disconnection > > Which are used to notify upper tier of the connection state. > > Cc: Eric Blake <ebl...@redhat.com> > Cc: Benoit Canet <ben...@irqsave.net> > Cc: Kevin Wolf <kw...@redhat.com> > Cc: Stefan Hajnoczi <stefa...@redhat.com> > Signed-off-by: Liu Yuan <namei.u...@gmail.com> > --- > block.c | 7 +++++++ > include/block/block.h | 7 +++++++ > include/block/block_int.h | 3 +++ > 3 files changed, 17 insertions(+) > > diff --git a/block.c b/block.c > index c12b8de..22eb3e4 100644 > --- a/block.c > +++ b/block.c > @@ -2152,6 +2152,13 @@ void bdrv_set_dev_ops(BlockDriverState *bs, const > BlockDevOps *ops, > bs->dev_opaque = opaque; > } > > +void bdrv_set_drv_ops(BlockDriverState *bs, const BlockDrvOps *ops, > + void *opaque) > +{ > + bs->drv_ops = ops; > + bs->drv_opaque = opaque;
We need to be very carefull of the mix between these fields and the infamous bdrv_swap function. Also I don't know if "driver operations" is the right name since the BlockDriver structure's callback could also be named "driver operations". > +} > + > static void bdrv_dev_change_media_cb(BlockDriverState *bs, bool load) > { > if (bs->dev_ops && bs->dev_ops->change_media_cb) { > diff --git a/include/block/block.h b/include/block/block.h > index 8f4ad16..a61eaf0 100644 > --- a/include/block/block.h > +++ b/include/block/block.h > @@ -82,6 +82,11 @@ typedef struct BlockDevOps { > void (*resize_cb)(void *opaque); > } BlockDevOps; > > +typedef struct BlockDrvOps { > + void (*driver_reconnect)(BlockDriverState *bs); > + void (*driver_disconnect)(BlockDriverState *bs); > +} BlockDrvOps; > + > typedef enum { > BDRV_REQ_COPY_ON_READ = 0x1, > BDRV_REQ_ZERO_WRITE = 0x2, > @@ -234,6 +239,8 @@ void bdrv_detach_dev(BlockDriverState *bs, void *dev); > void *bdrv_get_attached_dev(BlockDriverState *bs); > void bdrv_set_dev_ops(BlockDriverState *bs, const BlockDevOps *ops, > void *opaque); > +void bdrv_set_drv_ops(BlockDriverState *bs, const BlockDrvOps *ops, > + void *opaque); > void bdrv_dev_eject_request(BlockDriverState *bs, bool force); > bool bdrv_dev_has_removable_media(BlockDriverState *bs); > bool bdrv_dev_is_tray_open(BlockDriverState *bs); > diff --git a/include/block/block_int.h b/include/block/block_int.h > index 2334895..9fdec7f 100644 > --- a/include/block/block_int.h > +++ b/include/block/block_int.h > @@ -319,6 +319,9 @@ struct BlockDriverState { > const BlockDevOps *dev_ops; > void *dev_opaque; > > + const BlockDrvOps *drv_ops; > + void *drv_opaque; > + > AioContext *aio_context; /* event loop used for fd handlers, timers, etc > */ > > char filename[1024]; > -- > 1.9.1 >