From patchwork Thu Jul 14 19:03:00 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: 648546 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 3rr58d0qGbz9sCZ for ; Fri, 15 Jul 2016 05:18:41 +1000 (AEST) Received: from localhost ([::1]:56352 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bNm9f-0004Om-27 for incoming@patchwork.ozlabs.org; Thu, 14 Jul 2016 15:18:39 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:60207) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bNlvA-0003eR-L7 for qemu-devel@nongnu.org; Thu, 14 Jul 2016 15:03:42 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bNlv9-0002di-2q for qemu-devel@nongnu.org; Thu, 14 Jul 2016 15:03:40 -0400 Received: from mx1.redhat.com ([209.132.183.28]:51072) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bNlv4-0002aP-5d; Thu, 14 Jul 2016 15:03:34 -0400 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (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 B59517EA89; Thu, 14 Jul 2016 19:03:33 +0000 (UTC) Received: from dhcp-17-138.bos.redhat.com (dhcp-17-130.bos.redhat.com [10.18.17.130]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u6EJ3T8R000405; Thu, 14 Jul 2016 15:03:33 -0400 From: Colin Lord To: qemu-devel@nongnu.org Date: Thu, 14 Jul 2016 15:03:00 -0400 Message-Id: <1468523008-30013-5-git-send-email-clord@redhat.com> In-Reply-To: <1468523008-30013-1-git-send-email-clord@redhat.com> References: <1468523008-30013-1-git-send-email-clord@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Thu, 14 Jul 2016 19:03:33 +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 v4 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-probe.c | 21 ++++++++++++++++++++ block/bochs.c | 55 ++------------------------------------------------- block/bochs.h | 40 +++++++++++++++++++++++++++++++++++++ include/block/probe.h | 6 ++++++ 5 files changed, 70 insertions(+), 53 deletions(-) create mode 100644 block/bochs-probe.c create mode 100644 block/bochs.h create mode 100644 include/block/probe.h diff --git a/block/Makefile.objs b/block/Makefile.objs index 2593a2f..9d4be3b 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 += bochs-probe.o common-obj-y += stream.o common-obj-y += backup.o diff --git a/block/bochs-probe.c b/block/bochs-probe.c new file mode 100644 index 0000000..befe2cf --- /dev/null +++ b/block/bochs-probe.c @@ -0,0 +1,21 @@ +#include "qemu/osdep.h" +#include "block/block_int.h" +#include "block/probe.h" +#include "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/block/bochs.c b/block/bochs.c index 8c9652e..5c9a696 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 "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/bochs.h b/block/bochs.h new file mode 100644 index 0000000..2883f7d --- /dev/null +++ b/block/bochs.h @@ -0,0 +1,40 @@ +#ifndef BLOCK_BOCHS_H +#define BLOCK_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