Message ID | 1400077367-23409-4-git-send-email-stefanha@redhat.com |
---|---|
State | New |
Headers | show |
The Wednesday 14 May 2014 à 16:22:47 (+0200), Stefan Hajnoczi wrote :G > The block_set_io_throttle QMP and HMP commands modify I/O throttling > limits for block devices. > > Acquire the BlockDriverState's AioContext to protect against race > conditions with an IOThread that is running I/O for this device. > > Cc: Benoît Canet <benoit.canet@irqsave.net> > Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> > --- > blockdev.c | 6 ++++++ > 1 file changed, 6 insertions(+) > > diff --git a/blockdev.c b/blockdev.c > index 7810e9f..e0f1978 100644 > --- a/blockdev.c > +++ b/blockdev.c > @@ -1663,6 +1663,7 @@ void qmp_block_set_io_throttle(const char *device, int64_t bps, int64_t bps_rd, > { > ThrottleConfig cfg; > BlockDriverState *bs; > + AioContext *aio_context; > > bs = bdrv_find(device); > if (!bs) { > @@ -1706,6 +1707,9 @@ void qmp_block_set_io_throttle(const char *device, int64_t bps, int64_t bps_rd, > return; > } > > + aio_context = bdrv_get_aio_context(bs); > + aio_context_acquire(aio_context); > + > if (!bs->io_limits_enabled && throttle_enabled(&cfg)) { > bdrv_io_limits_enable(bs); > } else if (bs->io_limits_enabled && !throttle_enabled(&cfg)) { > @@ -1715,6 +1719,8 @@ void qmp_block_set_io_throttle(const char *device, int64_t bps, int64_t bps_rd, > if (bs->io_limits_enabled) { > bdrv_set_io_limits(bs, &cfg); > } > + > + aio_context_release(aio_context); > } > > int do_drive_del(Monitor *mon, const QDict *qdict, QObject **ret_data) > -- > 1.9.0 > Reviewed-by: Benoit Canet <benoit@irqsave.net>
diff --git a/blockdev.c b/blockdev.c index 7810e9f..e0f1978 100644 --- a/blockdev.c +++ b/blockdev.c @@ -1663,6 +1663,7 @@ void qmp_block_set_io_throttle(const char *device, int64_t bps, int64_t bps_rd, { ThrottleConfig cfg; BlockDriverState *bs; + AioContext *aio_context; bs = bdrv_find(device); if (!bs) { @@ -1706,6 +1707,9 @@ void qmp_block_set_io_throttle(const char *device, int64_t bps, int64_t bps_rd, return; } + aio_context = bdrv_get_aio_context(bs); + aio_context_acquire(aio_context); + if (!bs->io_limits_enabled && throttle_enabled(&cfg)) { bdrv_io_limits_enable(bs); } else if (bs->io_limits_enabled && !throttle_enabled(&cfg)) { @@ -1715,6 +1719,8 @@ void qmp_block_set_io_throttle(const char *device, int64_t bps, int64_t bps_rd, if (bs->io_limits_enabled) { bdrv_set_io_limits(bs, &cfg); } + + aio_context_release(aio_context); } int do_drive_del(Monitor *mon, const QDict *qdict, QObject **ret_data)
The block_set_io_throttle QMP and HMP commands modify I/O throttling limits for block devices. Acquire the BlockDriverState's AioContext to protect against race conditions with an IOThread that is running I/O for this device. Cc: Benoît Canet <benoit.canet@irqsave.net> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> --- blockdev.c | 6 ++++++ 1 file changed, 6 insertions(+)