Re: [Qemu-devel] [PATCH v3 11/29] block: Introduce bdrv_aligned_pwritev()

2014-01-21 Thread Benoît Canet
Le Friday 17 Jan 2014 à 15:15:01 (+0100), Kevin Wolf a écrit :
 This separates the part of bdrv_co_do_writev() that needs to happen
 before the request is modified to match the backend alignment, and a
 part that needs to be executed afterwards and passes the request to the
 BlockDriver.
 
 Signed-off-by: Kevin Wolf kw...@redhat.com
 Reviewed-by: Max Reitz mre...@redhat.com
 ---
  block.c | 62 +-
  1 file changed, 41 insertions(+), 21 deletions(-)
 
 diff --git a/block.c b/block.c
 index f378a10..70b72f0 100644
 --- a/block.c
 +++ b/block.c
 @@ -2964,34 +2964,20 @@ static int coroutine_fn 
 bdrv_co_do_write_zeroes(BlockDriverState *bs,
  }
  
  /*
 - * Handle a write request in coroutine context
 + * Forwards an already correctly aligned write request to the BlockDriver.
   */
 -static int coroutine_fn bdrv_co_do_writev(BlockDriverState *bs,
 -int64_t sector_num, int nb_sectors, QEMUIOVector *qiov,
 -BdrvRequestFlags flags)
 +static int coroutine_fn bdrv_aligned_pwritev(BlockDriverState *bs,
 +int64_t offset, unsigned int bytes, QEMUIOVector *qiov, int flags)
  {
  BlockDriver *drv = bs-drv;
  BdrvTrackedRequest req;
  int ret;
  
 -if (!bs-drv) {
 -return -ENOMEDIUM;
 -}
 -if (bs-read_only) {
 -return -EACCES;
 -}
 -if (bdrv_check_request(bs, sector_num, nb_sectors)) {
 -return -EIO;
 -}
 -
 -if (bs-copy_on_read_in_flight) {
 -wait_for_overlapping_requests(bs, sector_num, nb_sectors);
 -}
 +int64_t sector_num = offset  BDRV_SECTOR_BITS;
 +unsigned int nb_sectors = bytes  BDRV_SECTOR_BITS;
  
 -/* throttling disk I/O */
 -if (bs-io_limits_enabled) {
 -bdrv_io_limits_intercept(bs, nb_sectors, true);
 -}
 +assert((offset  (BDRV_SECTOR_SIZE - 1)) == 0);
 +assert((bytes  (BDRV_SECTOR_SIZE - 1)) == 0);
  
  tracked_request_begin(req, bs, sector_num, nb_sectors, true);
  
 @@ -3023,6 +3009,40 @@ static int coroutine_fn 
 bdrv_co_do_writev(BlockDriverState *bs,
  return ret;
  }
  
 +/*
 + * Handle a write request in coroutine context
 + */
 +static int coroutine_fn bdrv_co_do_writev(BlockDriverState *bs,
 +int64_t sector_num, int nb_sectors, QEMUIOVector *qiov,
 +BdrvRequestFlags flags)
 +{
 +int ret;
 +
 +if (!bs-drv) {
 +return -ENOMEDIUM;
 +}
 +if (bs-read_only) {
 +return -EACCES;
 +}
 +if (bdrv_check_request(bs, sector_num, nb_sectors)) {
 +return -EIO;
 +}
 +
 +if (bs-copy_on_read_in_flight) {
 +wait_for_overlapping_requests(bs, sector_num, nb_sectors);
 +}
 +
 +/* throttling disk I/O */
 +if (bs-io_limits_enabled) {
 +bdrv_io_limits_intercept(bs, nb_sectors, true);
 +}
 +
 +ret = bdrv_aligned_pwritev(bs, sector_num  BDRV_SECTOR_BITS,
 +   nb_sectors  BDRV_SECTOR_BITS, qiov, flags);
 +
 +return ret;
 +}
 +
  int coroutine_fn bdrv_co_writev(BlockDriverState *bs, int64_t sector_num,
  int nb_sectors, QEMUIOVector *qiov)
  {
 -- 
 1.8.1.4
 
 

Reviewed-by: Benoit Canet ben...@irqsave.net



[Qemu-devel] [PATCH v3 11/29] block: Introduce bdrv_aligned_pwritev()

2014-01-17 Thread Kevin Wolf
This separates the part of bdrv_co_do_writev() that needs to happen
before the request is modified to match the backend alignment, and a
part that needs to be executed afterwards and passes the request to the
BlockDriver.

Signed-off-by: Kevin Wolf kw...@redhat.com
Reviewed-by: Max Reitz mre...@redhat.com
---
 block.c | 62 +-
 1 file changed, 41 insertions(+), 21 deletions(-)

diff --git a/block.c b/block.c
index f378a10..70b72f0 100644
--- a/block.c
+++ b/block.c
@@ -2964,34 +2964,20 @@ static int coroutine_fn 
bdrv_co_do_write_zeroes(BlockDriverState *bs,
 }
 
 /*
- * Handle a write request in coroutine context
+ * Forwards an already correctly aligned write request to the BlockDriver.
  */
-static int coroutine_fn bdrv_co_do_writev(BlockDriverState *bs,
-int64_t sector_num, int nb_sectors, QEMUIOVector *qiov,
-BdrvRequestFlags flags)
+static int coroutine_fn bdrv_aligned_pwritev(BlockDriverState *bs,
+int64_t offset, unsigned int bytes, QEMUIOVector *qiov, int flags)
 {
 BlockDriver *drv = bs-drv;
 BdrvTrackedRequest req;
 int ret;
 
-if (!bs-drv) {
-return -ENOMEDIUM;
-}
-if (bs-read_only) {
-return -EACCES;
-}
-if (bdrv_check_request(bs, sector_num, nb_sectors)) {
-return -EIO;
-}
-
-if (bs-copy_on_read_in_flight) {
-wait_for_overlapping_requests(bs, sector_num, nb_sectors);
-}
+int64_t sector_num = offset  BDRV_SECTOR_BITS;
+unsigned int nb_sectors = bytes  BDRV_SECTOR_BITS;
 
-/* throttling disk I/O */
-if (bs-io_limits_enabled) {
-bdrv_io_limits_intercept(bs, nb_sectors, true);
-}
+assert((offset  (BDRV_SECTOR_SIZE - 1)) == 0);
+assert((bytes  (BDRV_SECTOR_SIZE - 1)) == 0);
 
 tracked_request_begin(req, bs, sector_num, nb_sectors, true);
 
@@ -3023,6 +3009,40 @@ static int coroutine_fn 
bdrv_co_do_writev(BlockDriverState *bs,
 return ret;
 }
 
+/*
+ * Handle a write request in coroutine context
+ */
+static int coroutine_fn bdrv_co_do_writev(BlockDriverState *bs,
+int64_t sector_num, int nb_sectors, QEMUIOVector *qiov,
+BdrvRequestFlags flags)
+{
+int ret;
+
+if (!bs-drv) {
+return -ENOMEDIUM;
+}
+if (bs-read_only) {
+return -EACCES;
+}
+if (bdrv_check_request(bs, sector_num, nb_sectors)) {
+return -EIO;
+}
+
+if (bs-copy_on_read_in_flight) {
+wait_for_overlapping_requests(bs, sector_num, nb_sectors);
+}
+
+/* throttling disk I/O */
+if (bs-io_limits_enabled) {
+bdrv_io_limits_intercept(bs, nb_sectors, true);
+}
+
+ret = bdrv_aligned_pwritev(bs, sector_num  BDRV_SECTOR_BITS,
+   nb_sectors  BDRV_SECTOR_BITS, qiov, flags);
+
+return ret;
+}
+
 int coroutine_fn bdrv_co_writev(BlockDriverState *bs, int64_t sector_num,
 int nb_sectors, QEMUIOVector *qiov)
 {
-- 
1.8.1.4