From patchwork Tue Jul 5 15:24:04 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: clord@redhat.com X-Patchwork-Id: 644820 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3rkSQj64V6z9sXR for ; Wed, 6 Jul 2016 01:26:21 +1000 (AEST) Received: from localhost ([::1]:55797 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bKSEt-0007VX-PW for incoming@patchwork.ozlabs.org; Tue, 05 Jul 2016 11:26:19 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:32781) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bKSDM-0005v7-61 for qemu-devel@nongnu.org; Tue, 05 Jul 2016 11:24:47 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bKSDK-0008NX-1s for qemu-devel@nongnu.org; Tue, 05 Jul 2016 11:24:44 -0400 Received: from mx1.redhat.com ([209.132.183.28]:36786) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bKSDF-0008KU-AQ; Tue, 05 Jul 2016 11:24:37 -0400 Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id E61277F6A2; Tue, 5 Jul 2016 15:24:36 +0000 (UTC) Received: from dhcp-17-138.bos.redhat.com (dhcp-17-5.bos.redhat.com [10.18.17.5]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u65FOWu0006841; Tue, 5 Jul 2016 11:24:36 -0400 From: Colin Lord To: qemu-devel@nongnu.org Date: Tue, 5 Jul 2016 11:24:04 -0400 Message-Id: <1467732272-23368-5-git-send-email-clord@redhat.com> In-Reply-To: <1467732272-23368-1-git-send-email-clord@redhat.com> References: <1467732272-23368-1-git-send-email-clord@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Tue, 05 Jul 2016 15:24:36 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v3 04/32] blockdev: Move bochs probe into separate file 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, Colin Lord , qemu-block@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" This puts the bochs probe function into its own separate file as part of the process of modularizing block drivers. Having the probe functions separate from the rest of the driver allows us to probe without having to potentially unnecessarily load the driver. Signed-off-by: Colin Lord Reviewed-by: Max Reitz --- block/Makefile.objs | 1 + block/bochs.c | 55 ++------------------------------------------ block/probe/bochs.c | 21 +++++++++++++++++ include/block/driver/bochs.h | 40 ++++++++++++++++++++++++++++++++ include/block/probe.h | 6 +++++ 5 files changed, 70 insertions(+), 53 deletions(-) create mode 100644 block/probe/bochs.c create mode 100644 include/block/driver/bochs.h create mode 100644 include/block/probe.h diff --git a/block/Makefile.objs b/block/Makefile.objs index 44a5416..bc0c2aa 100644 --- a/block/Makefile.objs +++ b/block/Makefile.objs @@ -24,6 +24,7 @@ block-obj-y += accounting.o dirty-bitmap.o block-obj-y += write-threshold.o block-obj-y += crypto.o +block-obj-y += probe/bochs.o common-obj-y += stream.o common-obj-y += commit.o diff --git a/block/bochs.c b/block/bochs.c index 6c8d0f3..11da0fd 100644 --- a/block/bochs.c +++ b/block/bochs.c @@ -28,45 +28,11 @@ #include "block/block_int.h" #include "qemu/module.h" #include "qemu/bswap.h" +#include "block/driver/bochs.h" +#include "block/probe.h" /**************************************************************/ -#define HEADER_MAGIC "Bochs Virtual HD Image" -#define HEADER_VERSION 0x00020000 -#define HEADER_V1 0x00010000 -#define HEADER_SIZE 512 - -#define REDOLOG_TYPE "Redolog" -#define GROWING_TYPE "Growing" - -// not allocated: 0xffffffff - -// always little-endian -struct bochs_header { - char magic[32]; /* "Bochs Virtual HD Image" */ - char type[16]; /* "Redolog" */ - char subtype[16]; /* "Undoable" / "Volatile" / "Growing" */ - uint32_t version; - uint32_t header; /* size of header */ - - uint32_t catalog; /* num of entries */ - uint32_t bitmap; /* bitmap size */ - uint32_t extent; /* extent size */ - - union { - struct { - uint32_t reserved; /* for ??? */ - uint64_t disk; /* disk size */ - char padding[HEADER_SIZE - 64 - 20 - 12]; - } QEMU_PACKED redolog; - struct { - uint64_t disk; /* disk size */ - char padding[HEADER_SIZE - 64 - 20 - 8]; - } QEMU_PACKED redolog_v1; - char padding[HEADER_SIZE - 64 - 20]; - } extra; -} QEMU_PACKED; - typedef struct BDRVBochsState { CoMutex lock; uint32_t *catalog_bitmap; @@ -79,23 +45,6 @@ typedef struct BDRVBochsState { uint32_t extent_size; } BDRVBochsState; -static int bochs_probe(const uint8_t *buf, int buf_size, const char *filename) -{ - const struct bochs_header *bochs = (const void *)buf; - - if (buf_size < HEADER_SIZE) - return 0; - - if (!strcmp(bochs->magic, HEADER_MAGIC) && - !strcmp(bochs->type, REDOLOG_TYPE) && - !strcmp(bochs->subtype, GROWING_TYPE) && - ((le32_to_cpu(bochs->version) == HEADER_VERSION) || - (le32_to_cpu(bochs->version) == HEADER_V1))) - return 100; - - return 0; -} - static int bochs_open(BlockDriverState *bs, QDict *options, int flags, Error **errp) { diff --git a/block/probe/bochs.c b/block/probe/bochs.c new file mode 100644 index 0000000..8adc09f --- /dev/null +++ b/block/probe/bochs.c @@ -0,0 +1,21 @@ +#include "qemu/osdep.h" +#include "block/block_int.h" +#include "block/probe.h" +#include "block/driver/bochs.h" + +int bochs_probe(const uint8_t *buf, int buf_size, const char *filename) +{ + const struct bochs_header *bochs = (const void *)buf; + + if (buf_size < HEADER_SIZE) + return 0; + + if (!strcmp(bochs->magic, HEADER_MAGIC) && + !strcmp(bochs->type, REDOLOG_TYPE) && + !strcmp(bochs->subtype, GROWING_TYPE) && + ((le32_to_cpu(bochs->version) == HEADER_VERSION) || + (le32_to_cpu(bochs->version) == HEADER_V1))) + return 100; + + return 0; +} diff --git a/include/block/driver/bochs.h b/include/block/driver/bochs.h new file mode 100644 index 0000000..cd87256 --- /dev/null +++ b/include/block/driver/bochs.h @@ -0,0 +1,40 @@ +#ifndef BOCHS_H +#define BOCHS_H + +#define HEADER_MAGIC "Bochs Virtual HD Image" +#define HEADER_VERSION 0x00020000 +#define HEADER_V1 0x00010000 +#define HEADER_SIZE 512 + +#define REDOLOG_TYPE "Redolog" +#define GROWING_TYPE "Growing" + +// not allocated: 0xffffffff + +// always little-endian +struct bochs_header { + char magic[32]; /* "Bochs Virtual HD Image" */ + char type[16]; /* "Redolog" */ + char subtype[16]; /* "Undoable" / "Volatile" / "Growing" */ + uint32_t version; + uint32_t header; /* size of header */ + + uint32_t catalog; /* num of entries */ + uint32_t bitmap; /* bitmap size */ + uint32_t extent; /* extent size */ + + union { + struct { + uint32_t reserved; /* for ??? */ + uint64_t disk; /* disk size */ + char padding[HEADER_SIZE - 64 - 20 - 12]; + } QEMU_PACKED redolog; + struct { + uint64_t disk; /* disk size */ + char padding[HEADER_SIZE - 64 - 20 - 8]; + } QEMU_PACKED redolog_v1; + char padding[HEADER_SIZE - 64 - 20]; + } extra; +} QEMU_PACKED; + +#endif diff --git a/include/block/probe.h b/include/block/probe.h new file mode 100644 index 0000000..6450ca1 --- /dev/null +++ b/include/block/probe.h @@ -0,0 +1,6 @@ +#ifndef PROBE_H +#define PROBE_H + +int bochs_probe(const uint8_t *buf, int buf_size, const char *filename); + +#endif