From patchwork Thu Jan 27 17:00:18 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vladimir Sementsov-Ogievskiy X-Patchwork-Id: 12727153 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 4FE01C433F5 for ; Thu, 27 Jan 2022 17:59:14 +0000 (UTC) Received: from localhost ([::1]:43156 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nD93B-0004ni-90 for qemu-devel@archiver.kernel.org; Thu, 27 Jan 2022 12:59:13 -0500 Received: from eggs.gnu.org ([209.51.188.92]:38186) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nD894-00043N-ET; Thu, 27 Jan 2022 12:01:14 -0500 Received: from mail-eopbgr130133.outbound.protection.outlook.com ([40.107.13.133]:11264 helo=EUR01-HE1-obe.outbound.protection.outlook.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nD88u-0002aA-Kc; Thu, 27 Jan 2022 12:01:09 -0500 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=fEwL0x2SPltNzikxI89dpXdVLNcfH11cJWrNEx8WvSVlv2jzlXEEw5W6t3lrrHSSHNnArDI5oyra28onTmdeN2tLO5d3ZHA1uSRtDHyNftZwyWI64hlhIj4WH0IerXF+hTxhXeQll3aW7z53YkKodeqOgjBeR3xXU74f3inpgUMjSHreAk4jbAwPe1y907c83KTh3iamFleL2ZPofgOgZTWO62kxr3seoSY9IsiZ8kwZrPYVH55nJtlOQeYOtNhsgHYVECby2JnzzADvC1WRUz0uOgWs0RzCQorp13SNoOd3drKrT7tfx9HOEsVTlhnp3hLJ/ZCPXXogYMazG4/F9g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=t0MZ5Jr9yXpAHqEj/OXuwecvceID6C3pGppqTcnvA6U=; b=jIma3wc1BDE2GbGyIOQCvHqWqAaUDLRn08SScQbPZ8xiQo6PC/gxbl7wb5fHaMG2kLuoysTUfjiYtnely7rTtI/6pGdNUauRRM2sS94DyxWBgE4LMMpWsUDTBuXia/dNsNvYWQhRqH7PeK+qvjPQ8gHvniKp1ij6p8BQo3cmQc+CwORYoD5Eor02kZU8RYaZvTLPxeoYmSF2gsZaIBb8RfUvAFLd/Q66/gWXq+jDyhPxaIeVWn5iUAZOS5WGimGGeUVPW6QASZXtjTkw7PGkP1ujK5TNhnmdnzAaGPW9IGPXJd7grJc1wvKWTTTuqzQEc6OOETjTOFWJt8Njj8RiuA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=virtuozzo.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=t0MZ5Jr9yXpAHqEj/OXuwecvceID6C3pGppqTcnvA6U=; b=sx4WLEE9CajexUUXpUWTwBFo610zBP+XjX2P28zHiTXEMrL/jQKamLAdSTGDrzBOb8aBmS2fFUhZi+fOIwlECZS+NwDpIt312WuqLhhg4lrIvTOhPMWLK/UL73udJPWM+fRNW6H06SyGElunVVRgWVR3DZ6me8Mvngi0JANG+fs= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=virtuozzo.com; Received: from AM9PR08MB6737.eurprd08.prod.outlook.com (2603:10a6:20b:304::18) by AM0PR08MB4436.eurprd08.prod.outlook.com (2603:10a6:208:13a::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4930.15; Thu, 27 Jan 2022 17:00:30 +0000 Received: from AM9PR08MB6737.eurprd08.prod.outlook.com ([fe80::4def:4b08:dfe6:b4bd]) by AM9PR08MB6737.eurprd08.prod.outlook.com ([fe80::4def:4b08:dfe6:b4bd%3]) with mapi id 15.20.4909.017; Thu, 27 Jan 2022 17:00:30 +0000 From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Cc: qemu-devel@nongnu.org, armbru@redhat.com, eblake@redhat.com, hreitz@redhat.com, kwolf@redhat.com, vsementsov@virtuozzo.com, den@openvz.org, ktkhai@virtuozzo.com, igor@virtuozzo.com Subject: [PATCH v2 1/2] qcow2: add keep-dirty open option Date: Thu, 27 Jan 2022 18:00:18 +0100 Message-Id: <20220127170019.3292051-2-vsementsov@virtuozzo.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220127170019.3292051-1-vsementsov@virtuozzo.com> References: <20220127170019.3292051-1-vsementsov@virtuozzo.com> X-ClientProxiedBy: AM5PR1001CA0072.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:206:15::49) To AM9PR08MB6737.eurprd08.prod.outlook.com (2603:10a6:20b:304::18) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 35ebdee2-e24a-4804-ae48-08d9e1b68605 X-MS-TrafficTypeDiagnostic: AM0PR08MB4436:EE_ X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:121; X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: xEubmmTQvCnWi3gvABQ/4Yhx0AVr8XM2XYK+bkXxrd6eWgrs9rxQW54BLeIl4lYqF9QmCoLocxcpqAsCc7X2CgdeiiaF6IFvUytkhOUg8j/+IOG9G8/yfZH1EmlJUW9Ec1ELORsq1W/7WLRNr7ec8XWF406jaJi6QeNZdLi0fnh8EHpla1GD5WKiF6Dq8xmMnm2+1owTgoXzGZ7YMwDElvUu3Y2KnaSaSoNa9s9vFNQqs1him9CWfFmhKXimTQ1LudaNFPDBxtVZQem197HBvoWTH0UVnCcWk0h7w4Pbkh+VKX7r0mXiYiUudBwyP2xkjgW2LRdJgECTkZjiyI/RNWBHIQmvb1xonPTibuMLMbkG6xLRa1lAb/2X/VHTseFyhRwfPTyhwnw8z5bFEB6AFifADHK5hLY1lNlDkxeX/1hh5kGidaGS8InYYvlRj5ZrZP85o3UEpQTxbGd+iNj1Zw5daorJ1Vx/A6Wl0wTTch/f3kH3IpUTQ+PvAXfEcOOKeVKynGoQbVYm7+OMWZAkrZN1z+p4Xdb9I9PqD22pBjSTKC3ljTUmA3MXsm9cI/keNmAE5s/RSxAs2ORqcpZoi5RebQ2V/VHRDcZCpcBl/MHJuyg143pv5qg/aPOYDOoLSrKFV6AdZFX6zA7oBHgz2jZGdQrgruvIVkd9pHePg8K7LBx7i5QYo9WxHxoZvJ0kp5mpMTEYizWBJoL/zrPgK3kdZ2//tALktKJIJdpypdo= X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:AM9PR08MB6737.eurprd08.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230001)(4636009)(366004)(107886003)(6666004)(6512007)(2616005)(86362001)(6486002)(26005)(186003)(83380400001)(52116002)(6506007)(1076003)(508600001)(66476007)(2906002)(8936002)(8676002)(36756003)(66946007)(66556008)(6916009)(4326008)(38350700002)(38100700002)(5660300002)(316002)(19627235002)(14143004)(20210929001); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: IIbXEiUCdCTFR2tUZHvkT6Sj/9SKaXBb54ltNsI/lFE0zpokREsJs07eDcp2RmhoAdfwb/+v/U9ovEK6TCnsGrkxsQuc7dubm4PqaLOdfTbho6AnAZuDAmwm/TC0k8wlUja7rsU/H9xdb2wlrA86oeqYZeNZAEC/KqXItuKgA/O2HOqUi3x3P1ZGckp9iGfeC8Xx0WKQwJRbxxvmSfPfpYnKCnpn5vCGyT6Dfd2qyGAUlMXYEziHvozvqF6cSCgbXMbyy8c4m9n9hepFfzUvlVMOUFjA+drDDu8m6cE5daT3GtndYrjkK9wcmLVcYvYUcEzTU5mpmIzud2L1eNJuVQekVryDzvLKMu0XiHw5IGx3LFAI0Zo5MLGxQ43ZZ2ClMr7pG+MtHmyo9B+Xp6KbVpVWMSUoKwOSsGxEKbkmSsMwSjC8mytbbKQLKgH3UOALIOI6Z+hal2vEqB7Z/vZR4DsqrhsxUTTSU7jPZ8OidDGtblpTgD6X7An38w0k/tVAY9vJ6+YZYEFis0udRL2gwKuoZWmFev1x8KKMDTu7XJ2+4z2X/jxFGoabKy3haAVyt0qQLeyKGiqAJJQpXPWoa4wwG/OMmeH29XUalSCQqMFcKKf8nKkGwbQXNlPNo1HRYW4zmj/aIJxrinJiUAIw0DbmyqYSYfSNQn8JHrJvhZBJ2B8CVKgJGoW511nUX6rvN+WXBaIvdhbpMRY/C6Dp+tSAh97rWWm7smBYrfYvInq/w5w+7DGm2DhLG1ALnKA2TPxxBXdy0OjlqkqY1S+Bd8BOETKQLHhV12RtMMMXD5Dhzb1lm9glMMqmpKjyetz7uAm/wO/KifB1AoyMfY2Ra3STOK+Mf9S1898Jbe6uaZafHxSPGli9GdTWsGrIO3Ic8slwL/k6SkHftEVwnC5KnoTk2Pe5pJ/z6jTlgfyp2vY+4uxNZzBaIDzz89e3pUSe3V6b5JYebhwHMh+eJnZt6tPxdQHVHz2sYAeHHtmd4eF/r1ojjFy2w334diWsFG2Xt05g7N2hXKlwZ+AsLfrUvU62+2KkKOFgV1wBljFGxprESoOZtKYpk9P/JmnHbzyFqKlZrsDVwsbngqNuQtsaUerGWj4SxKOHfeeSF/JKP9hvnXULKQI3TyqPsBWI3GlR6PgJffcfULJv+PurbmJrcbolWHbOQyWxgBn2nQDDxCnjf0n9n86mZ7Gh3y6dEYqb6DYnzPEoOUD5d0hMQFH96r1L17EZVbP13ZARhc6KjnPE0SgutJ6yLH12A4Jy2YY8OkkoXQYcB89lul6kJB9G+ZYk0jYjxUIKKKFZKPstqaiuuQ2JSIsmrN+qzAI7sWY8PxxUOX57mmCpor7LlfD6f9pv52jrbgooxUtYzvAMBz2yi7cLar0MhQXirIk5KH1BHpgsrYyUuO1sNJXVmv13ooaD/hkVCA6fGHe/hfGyJMA8nDR2JRp4AQf4AfaWGkFZltNqL+KSVZ2hsvV913RfbNcYIcoqXpyePeXcweUIPLVXkZTq/+aSV7374syWykW4xL50RGpkTk63ke/xvUoKI9acxwErHKOv+KeS4YNgOTObSP7c4raLzO3TrXJFQsQC6N9BhEe/L0CIl9enAc/TvGUQ7Duiqx3Kh29T0f8m/8IsH5ibdYk/6CpX8UxscyLyUARhadMGLMcl/ESNaRiUazlMDJHYd51p87w9g1LsH3w= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-Network-Message-Id: 35ebdee2-e24a-4804-ae48-08d9e1b68605 X-MS-Exchange-CrossTenant-AuthSource: AM9PR08MB6737.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 27 Jan 2022 17:00:29.9702 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: /hGjAZaxkUt8BcmENB4sGhLR3x6rlKNtyqrNgoy0f9jpi/kPZSI5WmQ1dvTnUQ421ITIR7YouTvIFGGXSt/Opt4E5+Up2wPN5TQPtkCFSsY= X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM0PR08MB4436 Received-SPF: pass client-ip=40.107.13.133; envelope-from=vsementsov@virtuozzo.com; helo=EUR01-HE1-obe.outbound.protection.outlook.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" Consider the case: Thirdparty component works with qcow2 image, and dirty bit is set. Thirdparty component want to start qemu-img to do some manipulation. Ofcourse, third party component flushes refcounts and other metadata before starting QEMU. But the component don't want to clear dirty bit, as this breaks transactionability of the operation: we'll have to set it again but it may fail. Clearing the dirty bit is unrecoverable action and can't be transactional. That's a problem. The solution is a new qcow2 open option: keep-dirty. When set: 1. On qcow2 open, ignore dirty bit and don't do check: caller is responsible for refcounts being valid. 2. Never clear dirty bit during QEMU execution, including close. Details: 1. For simplicity let's just not allow keep-dirty without lazy refcounts. 2. Don't allow to open with keep-dirty when dirty bit is unset. This may mean some error in user logic. 3. For implementation do the following: dirty flag in s->incompatible_features behaves same way as without keep-dirty option: it actually designate status of refcounts dirtiness. But we never clear the flag in the image, and we remember that it is always set. Signed-off-by: Vladimir Sementsov-Ogievskiy Tested-by: Kirill Tkhai --- qapi/block-core.json | 8 ++++++ block/qcow2.h | 2 ++ block/qcow2.c | 61 +++++++++++++++++++++++++++++++++++--------- 3 files changed, 59 insertions(+), 12 deletions(-) diff --git a/qapi/block-core.json b/qapi/block-core.json index 9a5a3641d0..4b5c6d7935 100644 --- a/qapi/block-core.json +++ b/qapi/block-core.json @@ -3228,6 +3228,13 @@ # @lazy-refcounts: whether to enable the lazy refcounts # feature (default is taken from the image file) # +# @keep-dirty: whether to not touch dirty bit. When set, QEMU doesn't +# check refcounts on qcow2 open (ignoring dirty bit) and doesn't +# clear dirty bit on qcow2 close. When true dirty bit must +# be already set in the image on open, otherwise open fails. +# When true user guarantees that refcounts are consistent on +# open, so the check is omitted. (since 7.0) +# # @pass-discard-request: whether discard requests to the qcow2 # device should be forwarded to the data source # @@ -3276,6 +3283,7 @@ { 'struct': 'BlockdevOptionsQcow2', 'base': 'BlockdevOptionsGenericCOWFormat', 'data': { '*lazy-refcounts': 'bool', + '*keep-dirty': 'bool', '*pass-discard-request': 'bool', '*pass-discard-snapshot': 'bool', '*pass-discard-other': 'bool', diff --git a/block/qcow2.h b/block/qcow2.h index fd48a89d45..696e13377a 100644 --- a/block/qcow2.h +++ b/block/qcow2.h @@ -130,6 +130,7 @@ #define QCOW2_OPT_DATA_FILE "data-file" #define QCOW2_OPT_LAZY_REFCOUNTS "lazy-refcounts" +#define QCOW2_OPT_KEEP_DIRTY "keep-dirty" #define QCOW2_OPT_DISCARD_REQUEST "pass-discard-request" #define QCOW2_OPT_DISCARD_SNAPSHOT "pass-discard-snapshot" #define QCOW2_OPT_DISCARD_OTHER "pass-discard-other" @@ -376,6 +377,7 @@ typedef struct BDRVQcow2State { int flags; int qcow_version; bool use_lazy_refcounts; + bool keep_dirty; int refcount_order; int refcount_bits; uint64_t refcount_max; diff --git a/block/qcow2.c b/block/qcow2.c index d509016756..ee82ef2a8f 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -514,15 +514,17 @@ int qcow2_mark_dirty(BlockDriverState *bs) return 0; /* already dirty */ } - val = cpu_to_be64(s->incompatible_features | QCOW2_INCOMPAT_DIRTY); - ret = bdrv_pwrite(bs->file, offsetof(QCowHeader, incompatible_features), - &val, sizeof(val)); - if (ret < 0) { - return ret; - } - ret = bdrv_flush(bs->file->bs); - if (ret < 0) { - return ret; + if (!s->keep_dirty) { + val = cpu_to_be64(s->incompatible_features | QCOW2_INCOMPAT_DIRTY); + ret = bdrv_pwrite(bs->file, offsetof(QCowHeader, incompatible_features), + &val, sizeof(val)); + if (ret < 0) { + return ret; + } + ret = bdrv_flush(bs->file->bs); + if (ret < 0) { + return ret; + } } /* Only treat image as dirty if the header was updated successfully */ @@ -549,7 +551,13 @@ static int qcow2_mark_clean(BlockDriverState *bs) return ret; } - return qcow2_update_header(bs); + if (!s->keep_dirty) { + /* + * No reason to update the header if we don't want to clear dirty + * bit. + */ + return qcow2_update_header(bs); + } } return 0; } @@ -709,6 +717,11 @@ static QemuOptsList qcow2_runtime_opts = { .type = QEMU_OPT_BOOL, .help = "Postpone refcount updates", }, + { + .name = QCOW2_OPT_KEEP_DIRTY, + .type = QEMU_OPT_BOOL, + .help = "Keep dirty bit set", + }, { .name = QCOW2_OPT_DISCARD_REQUEST, .type = QEMU_OPT_BOOL, @@ -966,6 +979,7 @@ typedef struct Qcow2ReopenState { Qcow2Cache *refcount_block_cache; int l2_slice_size; /* Number of entries in a slice of the L2 table */ bool use_lazy_refcounts; + bool keep_dirty; int overlap_check; bool discard_passthrough[QCOW2_DISCARD_MAX]; uint64_t cache_clean_interval; @@ -1088,6 +1102,8 @@ static int qcow2_update_options_prepare(BlockDriverState *bs, } } + r->keep_dirty = qemu_opt_get_bool(opts, QCOW2_OPT_KEEP_DIRTY, false); + /* Overlap check options */ opt_overlap_check = qemu_opt_get(opts, QCOW2_OPT_OVERLAP); opt_overlap_check_template = qemu_opt_get(opts, QCOW2_OPT_OVERLAP_TEMPLATE); @@ -1214,6 +1230,7 @@ static void qcow2_update_options_commit(BlockDriverState *bs, s->overlap_check = r->overlap_check; s->use_lazy_refcounts = r->use_lazy_refcounts; + s->keep_dirty = r->keep_dirty; for (i = 0; i < QCOW2_DISCARD_MAX; i++) { s->discard_passthrough[i] = r->discard_passthrough[i]; @@ -1810,7 +1827,7 @@ static int coroutine_fn qcow2_do_open(BlockDriverState *bs, QDict *options, bs->supported_truncate_flags = BDRV_REQ_ZERO_WRITE; /* Repair image if dirty */ - if (!(flags & BDRV_O_CHECK) && bdrv_is_writable(bs) && + if (!s->keep_dirty && !(flags & BDRV_O_CHECK) && bdrv_is_writable(bs) && (s->incompatible_features & QCOW2_INCOMPAT_DIRTY)) { BdrvCheckResult result = {0}; @@ -1825,6 +1842,20 @@ static int coroutine_fn qcow2_do_open(BlockDriverState *bs, QDict *options, } } + if (s->keep_dirty) { + if (!(s->incompatible_features & QCOW2_INCOMPAT_DIRTY)) { + error_setg(errp, "keep-dirty behaviour is requested but image " + "is not dirty"); + ret = -EINVAL; + goto fail; + } + /* + * User guarantees that refcounts are valid. So, consider them valid, + * keeping dirty bit set in the header. + */ + s->incompatible_features &= ~QCOW2_INCOMPAT_DIRTY; + } + #ifdef DEBUG_ALLOC { BdrvCheckResult result = {0}; @@ -2826,6 +2857,7 @@ int qcow2_update_header(BlockDriverState *bs) uint32_t refcount_table_clusters; size_t header_length; Qcow2UnknownHeaderExtension *uext; + uint64_t incompatible_features; buf = qemu_blockalign(bs, buflen); @@ -2846,6 +2878,11 @@ int qcow2_update_header(BlockDriverState *bs) goto fail; } + incompatible_features = s->incompatible_features; + if (s->keep_dirty) { + incompatible_features |= QCOW2_INCOMPAT_DIRTY; + } + *header = (QCowHeader) { /* Version 2 fields */ .magic = cpu_to_be32(QCOW_MAGIC), @@ -2863,7 +2900,7 @@ int qcow2_update_header(BlockDriverState *bs) .snapshots_offset = cpu_to_be64(s->snapshots_offset), /* Version 3 fields */ - .incompatible_features = cpu_to_be64(s->incompatible_features), + .incompatible_features = cpu_to_be64(incompatible_features), .compatible_features = cpu_to_be64(s->compatible_features), .autoclear_features = cpu_to_be64(s->autoclear_features), .refcount_order = cpu_to_be32(s->refcount_order), From patchwork Thu Jan 27 17:00:19 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vladimir Sementsov-Ogievskiy X-Patchwork-Id: 12727150 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 0414FC433EF for ; Thu, 27 Jan 2022 17:53:15 +0000 (UTC) Received: from localhost ([::1]:34270 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nD8xO-0006tY-Li for qemu-devel@archiver.kernel.org; Thu, 27 Jan 2022 12:53:14 -0500 Received: from eggs.gnu.org ([209.51.188.92]:38184) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nD894-00043M-ES for qemu-devel@nongnu.org; Thu, 27 Jan 2022 12:01:14 -0500 Received: from [2a01:111:f400:fe06::708] (port=63135 helo=EUR02-VE1-obe.outbound.protection.outlook.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nD88u-0002Rv-IB for qemu-devel@nongnu.org; Thu, 27 Jan 2022 12:01:08 -0500 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=LJ5JyyUj+yR5uClbSE3X6eISNapGxJ+Dlmu4051+3e09m+YvGfwxB8COGqpJzygWYk+jHexlAdN+6NLb1X1C8ociT1PjqSQPgYqGCfBlLFe5txrtSIOY1i6rTK0vrfUEywvrdKU1AEexHvpDNFe+roWYpLKXXFEod4Hh9WmerZ/02frbT+ea7TRXPKpIMzBLLDShW68l6Ah6jnUPE2uoZGHOj9wMYuj9Hc4Au6/2r+/EmmCl4xU9sS20RyPkOGLposHpUONWdeSCnhxVLEBfLRktF3d5/vL3AN4Qk/x6SPttNh3KqO0O9jw10KrF1znkNmWjm1SMPMtCPMqj03Dy+g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=AfG3LZ8a4a0YM5mqdzYz3resveBifW5lAI4xGf0dlA4=; b=L+HTjn5vMbrqlLbLCWeVl39np5Ovnra5b/0SkUptd2EkK9U6tYOtLGc2LJiOVKpAJkVzkanNzZbydu9A1al8Bm1x6RJpQ0NvU6xPJeH3v4BqLVbw1odlSxCP0UAio/7VFAPnXe6DIhTVrpfQFh1CDsEc13YJFlYlTl4dxV/4QnjES2p42aq6hpO+J2OtMmjyQYuzMV/yJxsxYNchrpraaVfClYHmAo/M74mDW7iV4RXP63WGCIRRAYN6P/yy1vmP0irZZ6G+iqhxRRdlfd2sv45zuv0X8dVzG3I4NPSoIGufv8X6/LAcfUXdPMGHbj7eQc/A6HTFVvmSbkHiD7asuQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=virtuozzo.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=AfG3LZ8a4a0YM5mqdzYz3resveBifW5lAI4xGf0dlA4=; b=kK26LexUdFHzNA2XmlgV4bSGftRhtO0vBjIux1SgNog1P0dEtocxT0+S7TZlOHQWE/Zr38qVrVtkpKhdKDDbNnAIW49EpD0FeNDNW4/blszKZdsgbl/ipWl2iLSvY7CW2WwuvU1lcWGGT8F+fYs/cGoHMLuhT2Q4jAM97CiiYFU= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=virtuozzo.com; Received: from AM9PR08MB6737.eurprd08.prod.outlook.com (2603:10a6:20b:304::18) by AM0PR08MB4436.eurprd08.prod.outlook.com (2603:10a6:208:13a::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4930.15; Thu, 27 Jan 2022 17:00:30 +0000 Received: from AM9PR08MB6737.eurprd08.prod.outlook.com ([fe80::4def:4b08:dfe6:b4bd]) by AM9PR08MB6737.eurprd08.prod.outlook.com ([fe80::4def:4b08:dfe6:b4bd%3]) with mapi id 15.20.4909.017; Thu, 27 Jan 2022 17:00:30 +0000 From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Cc: qemu-devel@nongnu.org, armbru@redhat.com, eblake@redhat.com, hreitz@redhat.com, kwolf@redhat.com, vsementsov@virtuozzo.com, den@openvz.org, ktkhai@virtuozzo.com, igor@virtuozzo.com Subject: [PATCH v2 2/2] iotests: add qcow2-keep-dirty Date: Thu, 27 Jan 2022 18:00:19 +0100 Message-Id: <20220127170019.3292051-3-vsementsov@virtuozzo.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220127170019.3292051-1-vsementsov@virtuozzo.com> References: <20220127170019.3292051-1-vsementsov@virtuozzo.com> X-ClientProxiedBy: AM5PR1001CA0072.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:206:15::49) To AM9PR08MB6737.eurprd08.prod.outlook.com (2603:10a6:20b:304::18) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: d4c22449-0c46-452a-583b-08d9e1b68654 X-MS-TrafficTypeDiagnostic: AM0PR08MB4436:EE_ X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:2958; X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: CZ8zxUHGZ0LrXUUuPgBXCeEOWK7OvOBDIJXB5vUPSgYXhfXU/OvN32sFewDgHtcnukyCW/GstVaB47c/xlyQavmmlU/wPk+8ROhAs5pOvr3sIBEv6op6q8WVYwV0F2IF+Dq6ofz9Us4wCADigcr4WCgcuYrYlNqDASa91j2zU+N8Glmpr4n3Fm9kRM1dL5XtYzinpRZjCMECe+0IbyR/H3PuEtpHL+CI2jQ8azl/tkMJ1iRFq/XMi7tbVQjTntaHO3vQkR51B5qqWzJJHT5BD5hvoc3vQlWHGN6XfMfszqYNedgMsY6A+2m6MzkBi4kRAh8qK3q/QcmATdtTgcBU5BjxARhBsrTd2R0RVAYboYQN/gAJCPKN1eoAbirSvHrmfD3FwX3QVvPaMGO6H/cjTwmpf2aO33MofrzOjq4DiAer3DmGu8ttCPjy7Ish0UaxCoZfP0ExY3a5Z93N317HIuEy56AUSd2JYk2BOyFu4Y0lA4I3wmrwJLSySegbIcgqDhB7VQEtHDgPk5stEpo7iHAjuuIF1zoIJNaIdFUmMxnnRL8lR3TkDYFv1k6U1sH8tpSHMLkx3p0tJHS5r24U39TDMRWU+O9FJZQ7OxE8MquJPGhDShWvXy9p92uRxfBpYUo7NDjNZpiqlzRPA+AjAl/pFuCzuF2m5t6fkRQEdGcaYrfv5j2TasomWBDxadcuCGMq3KIdwsAFcUpjPvGYCnhUOwBvaBq25qrx7L2EUBU5+P/Qz7AQCrnkyKL2tUOJvse3RHRP3DprAHio20Orr8oYKJ9eeXj83QF7P+FVY9f70yL5DGCRUOGOR4g/B3sjzsExXFG2jjnRPO6qzwmYIA== X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:AM9PR08MB6737.eurprd08.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230001)(4636009)(366004)(107886003)(6666004)(6512007)(2616005)(86362001)(6486002)(26005)(186003)(83380400001)(52116002)(6506007)(1076003)(508600001)(66476007)(2906002)(8936002)(8676002)(36756003)(66946007)(66556008)(6916009)(4326008)(38350700002)(38100700002)(5660300002)(316002)(2004002)(14143004)(20210929001); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: UtDoGIadGK8f9hMLcRKuk20Ig28Vxi9/5UHGeHvDikV2pfJTUsWsm++FVx3YP1X3dPclR3DlGBqRFz954i4kRAMfvzyfi/s3/8YTjAzpvLtbbWvNTmCaiYAnYCV6ZMB9vOVKSS8E0X/95E+SPkyXvvk0B0o1h8FRhAqPPEu0dH9wyXxfv1tv5E3cyKYYrPyJN5hVDwidn7YB8ApKEDbEZu/92HsngFkBD4+j4E3hAQUX07tJbm8uDAE7FcLLORXDYFt9B7if1S4YmSc5eZQQRDv4Eh9bcHdLbasfifSfShwLwqP1nfw1x6yr9ym7DZxixzl5CSoe1LkDAmjuG+FLbKZzqqFgesY1rgIhaER+3QvdHhW++uPw8gImwKah69VpAbjV6U7ShvOI+98Z+IJHCIGOKxo40bBgEgQB1cyU0z6mOrriJx0BBYyNFGG8DXnY/hX7bzet+XsozwjT1tm5+Bb0GGeLQnsSmt79fp+Ss24ALAFgKCK79ZsCGhMrtKin7U6UIoc792bCSFCjoiFXM19FiTDz9OQn/9ZN0APBh42jyssw+LmIfSG57X9V5pT74EK/1uMr88KcSfhPLifonZRxgmqcjsWQsrtuyXCjKRND/Iq0qHtZ1GoCXq9zT4r5ECIvJMLBCqYouh3bA6qqPS/Z2CQd98wGwyyeSteSVuFkcQR5e46jdLar5sB1FVuOJASX3uHKMWdfyktjJvVztDFDZQRP4LR7k9Ni2rdBdRYZL9uTdykQ0n4DjzmZvGatUBOnI1Vw0eqh0hMrJMxQxnAUwY5HYKBjw1QBJeRYd2eENre098SYkG6nunDcI5eH5mSu5iyAIX5WplGiGb9vXQPpeOdf9gmL83+eryKeEU/hptqUkaor35k61OGY4yPtz7Iu2DCx/SYjknR9Xkc1ZZ1pT6R/vkOQ8/6/n8AGwMesbnhG5qVG/MEEGrj0XQzxpyzG0Kt+dqn6uwx/PWKRBNjdW3fkdpYQbkGxdOc6fbK07aC4RVyqgUNg0UQ/r9s9bzJ2/n3O+MU9xV3bxyUEDAXLEy+2P+suh6fi2n9HeihS9hspby6pPFxf9CjfBSeLAGqHC3UAMIFYhcl6tLb+rbPbdJzFGZmMWcNVo8vgYSlqILvxUMSEEvOzKbf/mS6QNsF+Zsmnvr9z4XZ+Jhr9E67sXLaaoc9d9KRopOPD9E7boHX0kJZ/JDBNeShWMZZ6FOQOW0zEJnZBeeLYnKdf5QxwaXAnEdpj+rsXS6Wt+bteZxJTSaa8K/qlVjK3tOoHrbztIPAqX/FWpznoY+0CbZ8p/xtL2nZy2CXtnSFKziXYhctcdxeeXnja45034zF9to5u/N+iD+eFk5dPLa3u+5/tZ+4EPgFqtTPVNjDKTRvB2kYptpJGSXXIidSHYoNyqtdvQgrRlb4bIccBfyphPsYpOWujj6BXfFsGwuxvLiojRnGN+zraylvDjzw6jcTDDvAScJgahnLoxnLQ5yN8FlGEL4JEXVSrjZp7N9fa3bZt/S4qH3vLqeW/jgdBg8ACmEWtmMmtK+PJEPKt3WfU4hprHW9BBViROUzVbUr9wX2csDtkbqt2kfI5Y6BPQf+b7SO3prQjc6a1VQgJ0J/30Khsw8gosGpVugMyK4WuZiglTDplJCKGVNPh826a6HV/IjkL17npPzuAChYAaniibu2qeT/CghfosZk6OSNDwYE= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-Network-Message-Id: d4c22449-0c46-452a-583b-08d9e1b68654 X-MS-Exchange-CrossTenant-AuthSource: AM9PR08MB6737.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 27 Jan 2022 17:00:30.5013 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: MLxop7uRNi4LtobEqfWLRbwC8sxaoP0y71U2QmTbMZrLitqk03U61JE/QRLqXc4rII8mrvzx0m2CqK0yPTpFqV1v6UOMH9xupPtgncLfXwA= X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM0PR08MB4436 X-Host-Lookup-Failed: Reverse DNS lookup failed for 2a01:111:f400:fe06::708 (failed) Received-SPF: pass client-ip=2a01:111:f400:fe06::708; envelope-from=vsementsov@virtuozzo.com; helo=EUR02-VE1-obe.outbound.protection.outlook.com X-Spam_score_int: -12 X-Spam_score: -1.3 X-Spam_bar: - X-Spam_report: (-1.3 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, PDS_HP_HELO_NORDNS=0.001, RCVD_IN_DNSWL_NONE=-0.0001, RDNS_NONE=0.793, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" Test new qcow2 open option: keep-dirty. Signed-off-by: Vladimir Sementsov-Ogievskiy --- tests/qemu-iotests/tests/qcow2-keep-dirty | 99 +++++++++++++++++++ tests/qemu-iotests/tests/qcow2-keep-dirty.out | 31 ++++++ 2 files changed, 130 insertions(+) create mode 100755 tests/qemu-iotests/tests/qcow2-keep-dirty create mode 100644 tests/qemu-iotests/tests/qcow2-keep-dirty.out diff --git a/tests/qemu-iotests/tests/qcow2-keep-dirty b/tests/qemu-iotests/tests/qcow2-keep-dirty new file mode 100755 index 0000000000..8f74e68967 --- /dev/null +++ b/tests/qemu-iotests/tests/qcow2-keep-dirty @@ -0,0 +1,99 @@ +#!/usr/bin/env bash +# group: rw quick +# +# Test qcow2 keep-dirty option +# +# Copyright (c) 2022 Virtuozzo International GmbH. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +# creator +owner=vsementsov@virtuozzo.com + +seq=`basename $0` +echo "QA output created by $seq" + +status=1 # failure is the default! + +_cleanup() +{ + _cleanup_test_img +} +trap "_cleanup; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +. ../common.rc +. ../common.filter +. ../common.qemu + +_supported_fmt qcow2 +_supported_proto file +_supported_os Linux +# This test does not make much sense with external data files +_unsupported_imgopts data_file + +check_dirty_bit() { + $QEMU_IMG info --output=json "$TEST_IMG" | grep 'dirty-flag' +} + +set_dirty_bit() { + echo Set dirty bit + $PYTHON ../qcow2.py "$TEST_IMG" set-feature-bit incompatible 0 + check_dirty_bit +} + +QEMU_IO_OPTIONS=$QEMU_IO_OPTIONS_NO_FMT + +keep_dirty_opts="driver=qcow2,keep-dirty=true,file.filename=$TEST_IMG" + +size=10M + +_make_test_img $size + +echo +echo Check that keep-dirty not allowed without dirty bit +$QEMU_IO -c 'quit' --image-opts "$keep_dirty_opts" + +echo +echo Check that usual access clears dirty bit +set_dirty_bit +$QEMU_IO -c 'quit' "$TEST_IMG" +check_dirty_bit + +echo +echo Check keep-dirty +set_dirty_bit +$QEMU_IO -c 'quit' --image-opts "$keep_dirty_opts" +check_dirty_bit + +echo +echo Check that usual qemu-img check clears dirty bit +set_dirty_bit +$QEMU_IMG check -r all "$TEST_IMG" +check_dirty_bit + +echo +echo Test qemu-img check with keep-dirty +set_dirty_bit +# also set corrupt bit +$PYTHON ../qcow2.py "$TEST_IMG" set-feature-bit incompatible 1 +$PYTHON ../qcow2.py "$TEST_IMG" dump-header | grep incompatible +$QEMU_IMG check -r all --image-opts "$keep_dirty_opts" +$PYTHON ../qcow2.py "$TEST_IMG" dump-header | grep incompatible + +# success, all done +echo "*** done" +rm -f $seq.full +status=0 diff --git a/tests/qemu-iotests/tests/qcow2-keep-dirty.out b/tests/qemu-iotests/tests/qcow2-keep-dirty.out new file mode 100644 index 0000000000..6224cb7ece --- /dev/null +++ b/tests/qemu-iotests/tests/qcow2-keep-dirty.out @@ -0,0 +1,31 @@ +QA output created by qcow2-keep-dirty +Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=10485760 + +Check that keep-dirty not allowed without dirty bit +qemu-io: can't open: keep-dirty behaviour is requested but image is not dirty + +Check that usual access clears dirty bit +Set dirty bit + "dirty-flag": true + "dirty-flag": false + +Check keep-dirty +Set dirty bit + "dirty-flag": true + "dirty-flag": true + +Check that usual qemu-img check clears dirty bit +Set dirty bit + "dirty-flag": true +No errors were found on the image. +Image end offset: 262144 + "dirty-flag": false + +Test qemu-img check with keep-dirty +Set dirty bit + "dirty-flag": true +incompatible_features [0, 1] +No errors were found on the image. +Image end offset: 262144 +incompatible_features [0] +*** done