From nobody Mon Feb 9 01:19:32 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1486137286698322.1752363238903; Fri, 3 Feb 2017 07:54:46 -0800 (PST) Received: from localhost ([::1]:35422 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cZgCC-0004Xk-OE for importer@patchew.org; Fri, 03 Feb 2017 10:54:44 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:36740) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cZg5o-0007p9-Dn for qemu-devel@nongnu.org; Fri, 03 Feb 2017 10:48:11 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cZg5k-00083b-DE for qemu-devel@nongnu.org; Fri, 03 Feb 2017 10:48:08 -0500 Received: from mailhub.sw.ru ([195.214.232.25]:48742 helo=relay.sw.ru) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cZg5j-00080Y-RA for qemu-devel@nongnu.org; Fri, 03 Feb 2017 10:48:04 -0500 Received: from kvm.qa.sw.ru. (msk-vpn.virtuozzo.com [195.214.232.6]) by relay.sw.ru (8.13.4/8.13.4) with ESMTP id v13Flv7x011039; Fri, 3 Feb 2017 18:47:59 +0300 (MSK) From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org, qemu-devel@nongnu.org Date: Fri, 3 Feb 2017 18:47:57 +0300 Message-Id: <20170203154757.36140-19-vsementsov@virtuozzo.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20170203154757.36140-1-vsementsov@virtuozzo.com> References: <20170203154757.36140-1-vsementsov@virtuozzo.com> X-detected-operating-system: by eggs.gnu.org: OpenBSD 3.x [fuzzy] X-Received-From: 195.214.232.25 Subject: [Qemu-devel] [PATCH 18/18] nbd: BLOCK_STATUS for standard get_block_status function: client part X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, famz@redhat.com, den@virtuozzo.com, armbru@redhat.com, mreitz@redhat.com, stefanha@redhat.com, pbonzini@redhat.com, jsnow@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Minimal realization: only first extent from the answer is used. Signed-off-by: Vladimir Sementsov-Ogievskiy --- block/nbd-client.c | 41 ++++++++++++++++++++++++++++++++++++++++- block/nbd-client.h | 5 +++++ block/nbd.c | 3 +++ include/block/nbd.h | 2 +- nbd/client.c | 23 ++++++++++++++++------- qemu-nbd.c | 2 +- 6 files changed, 66 insertions(+), 10 deletions(-) diff --git a/block/nbd-client.c b/block/nbd-client.c index c7eb21fb02..e419c1497c 100644 --- a/block/nbd-client.c +++ b/block/nbd-client.c @@ -528,6 +528,44 @@ int64_t nbd_client_co_load_bitmap_part(BlockDriverStat= e *bs, uint64_t offset, (uint64_t)bdrv_dirty_bitmap_granularity(bitmap)); } =20 +int64_t coroutine_fn nbd_client_co_get_block_status(BlockDriverState *bs, + int64_t sector_num, + int nb_sectors, int *p= num, + BlockDriverState **fil= e) +{ + int64_t ret; + uint32_t nb_extents; + NBDExtent *extents; + NBDClientSession *client =3D nbd_get_client_session(bs); + + if (!client->block_status_ok) { + *pnum =3D nb_sectors; + ret =3D BDRV_BLOCK_DATA | BDRV_BLOCK_ALLOCATED; + if (bs->drv->protocol_name) { + ret |=3D BDRV_BLOCK_OFFSET_VALID | (sector_num * BDRV_SECTOR_S= IZE); + } + return ret; + } + + ret =3D nbd_client_co_cmd_block_status(bs, sector_num << BDRV_SECTOR_B= ITS, + nb_sectors << BDRV_SECTOR_BITS, + &extents, &nb_extents); + if (ret < 0) { + return ret; + } + + *pnum =3D extents[0].length >> BDRV_SECTOR_BITS; + ret =3D (extents[0].flags & NBD_STATE_HOLE ? 0 : BDRV_BLOCK_ALLOCATED)= | + (extents[0].flags & NBD_STATE_ZERO ? BDRV_BLOCK_ZERO : 0); + + if ((ret & BDRV_BLOCK_ALLOCATED) && !(ret & BDRV_BLOCK_ZERO)) { + ret |=3D BDRV_BLOCK_DATA; + } + + g_free(extents); + + return ret; +} =20 void nbd_client_detach_aio_context(BlockDriverState *bs) { @@ -579,7 +617,8 @@ int nbd_client_init(BlockDriverState *bs, &client->size, &client->structured_reply, bitmap_name, - &client->bitmap_ok, errp); + &client->bitmap_ok, + &client->block_status_ok, errp); if (ret < 0) { logout("Failed to negotiate with the NBD server\n"); return ret; diff --git a/block/nbd-client.h b/block/nbd-client.h index e5ec89b9f6..9848732628 100644 --- a/block/nbd-client.h +++ b/block/nbd-client.h @@ -34,6 +34,7 @@ typedef struct NBDClientSession { bool is_unix; =20 bool structured_reply; + bool block_status_ok; bool bitmap_ok; uint32_t meta_data_context_id; } NBDClientSession; @@ -59,6 +60,10 @@ int nbd_client_co_preadv(BlockDriverState *bs, uint64_t = offset, uint64_t bytes, QEMUIOVector *qiov, int flags); int64_t nbd_client_co_load_bitmap_part(BlockDriverState *bs, uint64_t offs= et, uint64_t bytes, BdrvDirtyBitmap *bi= tmap); +int64_t coroutine_fn nbd_client_co_get_block_status(BlockDriverState *bs, + int64_t sector_num, + int nb_sectors, int *p= num, + BlockDriverState **fil= e); =20 void nbd_client_detach_aio_context(BlockDriverState *bs); void nbd_client_attach_aio_context(BlockDriverState *bs, diff --git a/block/nbd.c b/block/nbd.c index b2b6fd1cf9..b3a28f0746 100644 --- a/block/nbd.c +++ b/block/nbd.c @@ -604,6 +604,7 @@ static BlockDriver bdrv_nbd =3D { .bdrv_attach_aio_context =3D nbd_attach_aio_context, .bdrv_refresh_filename =3D nbd_refresh_filename, .bdrv_dirty_bitmap_load =3D nbd_dirty_bitmap_load, + .bdrv_co_get_block_status =3D nbd_client_co_get_block_status, }; =20 static BlockDriver bdrv_nbd_tcp =3D { @@ -624,6 +625,7 @@ static BlockDriver bdrv_nbd_tcp =3D { .bdrv_attach_aio_context =3D nbd_attach_aio_context, .bdrv_refresh_filename =3D nbd_refresh_filename, .bdrv_dirty_bitmap_load =3D nbd_dirty_bitmap_load, + .bdrv_co_get_block_status =3D nbd_client_co_get_block_status, }; =20 static BlockDriver bdrv_nbd_unix =3D { @@ -644,6 +646,7 @@ static BlockDriver bdrv_nbd_unix =3D { .bdrv_attach_aio_context =3D nbd_attach_aio_context, .bdrv_refresh_filename =3D nbd_refresh_filename, .bdrv_dirty_bitmap_load =3D nbd_dirty_bitmap_load, + .bdrv_co_get_block_status =3D nbd_client_co_get_block_status, }; =20 static void bdrv_nbd_init(void) diff --git a/include/block/nbd.h b/include/block/nbd.h index 69aee1eda1..58c1a3866b 100644 --- a/include/block/nbd.h +++ b/include/block/nbd.h @@ -196,7 +196,7 @@ int nbd_receive_negotiate(QIOChannel *ioc, const char *= name, uint16_t *flags, QIOChannel **outioc, off_t *size, bool *structured_reply, const char *bitmap_name, bool *bitmap_ok, - Error **errp); + bool *block_status_ok, Error **errp); int nbd_init(int fd, QIOChannelSocket *sioc, uint16_t flags, off_t size); ssize_t nbd_send_request(QIOChannel *ioc, NBDRequest *request); int nbd_receive_reply(QIOChannel *ioc, NBDReply *reply); diff --git a/nbd/client.c b/nbd/client.c index c3817b84fa..1b478d112c 100644 --- a/nbd/client.c +++ b/nbd/client.c @@ -563,10 +563,10 @@ static int nbd_receive_query_bitmap(QIOChannel *ioc, = const char *export, =20 int nbd_receive_negotiate(QIOChannel *ioc, const char *name, uint16_t *fla= gs, QCryptoTLSCreds *tlscreds, const char *hostname, - QIOChannel **outioc, - off_t *size, bool *structured_reply, + QIOChannel **outioc, off_t *size, + bool *structured_reply, const char *bitmap_name, bool *bitmap_ok, - Error **errp) + bool *block_status_ok, Error **errp) { char buf[256]; uint64_t magic, s; @@ -681,11 +681,19 @@ int nbd_receive_negotiate(QIOChannel *ioc, const char= *name, uint16_t *flags, false, NULL) =3D=3D 0; } =20 - if (!!structured_reply && *structured_reply && !!bitmap_name) { + if (!!structured_reply && *structured_reply) { int ret; - assert(!!bitmap_ok); - ret =3D nbd_receive_query_bitmap(ioc, name, bitmap_name, - bitmap_ok, errp) =3D=3D 0; + + if (!!bitmap_name) { + assert(!!bitmap_ok); + ret =3D nbd_receive_query_bitmap(ioc, name, bitmap_nam= e, + bitmap_ok, errp) =3D=3D= 0; + } else { + ret =3D nbd_receive_query_meta_context(ioc, name, + "base:allocation", + block_status_ok, + errp); + } if (ret < 0) { goto fail; } @@ -969,6 +977,7 @@ static int nbd_receive_structured_reply_chunk(QIOChanne= l *ioc, NBDReply *reply) =20 switch (reply->type) { case NBD_REPLY_TYPE_NONE: + case NBD_REPLY_TYPE_BLOCK_STATUS: break; case NBD_REPLY_TYPE_OFFSET_DATA: case NBD_REPLY_TYPE_OFFSET_HOLE: diff --git a/qemu-nbd.c b/qemu-nbd.c index cf45444faf..e3a4733e60 100644 --- a/qemu-nbd.c +++ b/qemu-nbd.c @@ -272,7 +272,7 @@ static void *nbd_client_thread(void *arg) =20 ret =3D nbd_receive_negotiate(QIO_CHANNEL(sioc), NULL, &nbdflags, NULL, NULL, NULL, - &size, NULL, NULL, NULL, &local_error); + &size, NULL, NULL, NULL, NULL, &local_erro= r); if (ret < 0) { if (local_error) { error_report_err(local_error); --=20 2.11.0