From nobody Sat May 18 08:14:06 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1594909653; cv=none; d=zohomail.com; s=zohoarc; b=MIgJDZqVFHlmuJk2wgh5DzyhswilCHtv2g0FAKh2nAvR2sdw2E5WYljiwsylPOHIuPLlTLyJEdfv2GEMmHkzhHYG+tsSegBoYjhRZuj3dNehga3/UUmB/OMR0r5ci9IaS00wxxh+RztQZ/sWzAK35+Q4JMlRONryv6lTzy4Rkrw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1594909653; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=6E9xU7LhkbbodOrHzPzfIt1jVa8hx/fUfxgN+TWD1KQ=; b=LT0te9Jbj3mxqSMAycvJvFuTgIliKyChNVY9xAiGUutGrkleO+vvUWfQfP+1wSCJWJ6e/uD/54wzlcVYjKtvByTttRvcmUoghSeX5V7MUHm7hMwXn+DcjCP10UfdFKWDP5TMe/GB8FvxUcoEPJcGsCeJLv3OULbLH8JJGnZ9yes= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 159490965350137.870491087042296; Thu, 16 Jul 2020 07:27:33 -0700 (PDT) Received: from localhost ([::1]:50904 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jw4rE-00029h-7o for importer@patchew.org; Thu, 16 Jul 2020 10:27:32 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:43798) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jw4qB-0001Id-Qt for qemu-devel@nongnu.org; Thu, 16 Jul 2020 10:26:27 -0400 Received: from us-smtp-delivery-1.mimecast.com ([207.211.31.120]:31373 helo=us-smtp-1.mimecast.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1jw4q8-0005bC-11 for qemu-devel@nongnu.org; Thu, 16 Jul 2020 10:26:27 -0400 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-265-4eHvQhAgOba9McxwHEfmVw-1; Thu, 16 Jul 2020 10:26:21 -0400 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 97CE28014D7; Thu, 16 Jul 2020 14:26:20 +0000 (UTC) Received: from linux.fritz.box.com (ovpn-114-172.ams2.redhat.com [10.36.114.172]) by smtp.corp.redhat.com (Postfix) with ESMTP id 751CB710A0; Thu, 16 Jul 2020 14:26:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1594909583; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=6E9xU7LhkbbodOrHzPzfIt1jVa8hx/fUfxgN+TWD1KQ=; b=MmnfHJH1q969fxpVqA+IshL0lN+n2OJ613UHPt4k46SUkASNJqXxU6IWV5rRAj8vZ2t8Rl VypBPS4Iq2HuDV2RGoPAFlfX++KovTAcR8z//1BniI71WrL6R6ezYio0HtX0XPsQ09E5aD XAgS1iKnnYkFzLJPZb/yqRSfllaHYC8= X-MC-Unique: 4eHvQhAgOba9McxwHEfmVw-1 From: Kevin Wolf To: qemu-block@nongnu.org Subject: [PATCH for-5.1 v2 1/2] block: Require aligned image size to avoid assertion failure Date: Thu, 16 Jul 2020 16:26:00 +0200 Message-Id: <20200716142601.111237-2-kwolf@redhat.com> In-Reply-To: <20200716142601.111237-1-kwolf@redhat.com> References: <20200716142601.111237-1-kwolf@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=207.211.31.120; envelope-from=kwolf@redhat.com; helo=us-smtp-1.mimecast.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/07/16 04:25:38 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -40 X-Spam_score: -4.1 X-Spam_bar: ---- X-Spam_report: (-4.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-1, 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=-1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, qemu-devel@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" Unaligned requests will automatically be aligned to bl.request_alignment and we can't extend write requests to access space beyond the end of the image without resizing the image, so if we have the WRITE permission, but not the RESIZE one, it's required that the image size is aligned. Failing to meet this requirement could cause assertion failures like this if RESIZE permissions weren't requested: qemu-img: block/io.c:1910: bdrv_co_write_req_prepare: Assertion `end_sector= <=3D bs->total_sectors || child->perm & BLK_PERM_RESIZE' failed. This was e.g. triggered by qemu-img converting to a target image with 4k request alignment when the image was only aligned to 512 bytes, but not to 4k. Turn this into a graceful error in bdrv_check_perm() so that WRITE without RESIZE can only be taken if the image size is aligned. If a user holds both permissions and drops only RESIZE, the function will return an error, but bdrv_child_try_set_perm() will ignore the failure silently if permissions are only requested to be relaxed and just keep both permissions while returning success. Signed-off-by: Kevin Wolf Reviewed-by: Max Reitz --- block.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/block.c b/block.c index 35a372df57..6371928edb 100644 --- a/block.c +++ b/block.c @@ -2025,6 +2025,22 @@ static int bdrv_check_perm(BlockDriverState *bs, Blo= ckReopenQueue *q, return -EPERM; } =20 + /* + * Unaligned requests will automatically be aligned to bl.request_alig= nment + * and without RESIZE we can't extend requests to write to space beyon= d the + * end of the image, so it's required that the image size is aligned. + */ + if ((cumulative_perms & BLK_PERM_WRITE) && + !(cumulative_perms & BLK_PERM_RESIZE)) + { + if ((bs->total_sectors * BDRV_SECTOR_SIZE) % bs->bl.request_alignm= ent) { + error_setg(errp, "Cannot get 'write' permission without 'resiz= e': " + "Image size is not a multiple of request " + "alignment"); + return -EPERM; + } + } + /* Check this node */ if (!drv) { return 0; --=20 2.25.4 From nobody Sat May 18 08:14:06 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1594909744; cv=none; d=zohomail.com; s=zohoarc; b=meqJsdpnkzQ0vMAZiSI/WJtWp8Cukt/z6hqN/h6HtFq/atd699WcdVGMzUXj189gFEw7GTus42Ti/xYcloNfxljBpCJ8OkU3zNi1Lt33L1tvvt38JBF+urMHJN70JBo/QFlMMArNqhQW5a/pdnnUw36VOFMMIwqG5r7XpMcdgSI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1594909744; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=rFOMtfrauKOkTwVYHiiz1g6uh4pzmKAKYAHQfuee8aM=; b=cmh38X0WpHn5g9hobnhSMPxJPxtCvZYNx5gtJZfupuOsoR5atSofmsKRZKKrksatm5iPCTCNTnHY/IVpjPUcjHVK0aFoVdJ8D34Pt3PqJ0GSEAbhV76V7N1/PADdvJz/zFZRPusjLx5xfoJmd/MEA42D6ZLAxwM1aKFB+C4ol7M= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1594909744657275.8632074806551; Thu, 16 Jul 2020 07:29:04 -0700 (PDT) Received: from localhost ([::1]:54644 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jw4sh-0003fK-G3 for importer@patchew.org; Thu, 16 Jul 2020 10:29:03 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:43796) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jw4qB-0001IH-J8 for qemu-devel@nongnu.org; Thu, 16 Jul 2020 10:26:27 -0400 Received: from us-smtp-delivery-1.mimecast.com ([207.211.31.120]:25395 helo=us-smtp-1.mimecast.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1jw4q9-0005bQ-NK for qemu-devel@nongnu.org; Thu, 16 Jul 2020 10:26:27 -0400 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-451-u2McWtaOMOyhr9RY6Lo1vA-1; Thu, 16 Jul 2020 10:26:23 -0400 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 054A91082B28; Thu, 16 Jul 2020 14:26:22 +0000 (UTC) Received: from linux.fritz.box.com (ovpn-114-172.ams2.redhat.com [10.36.114.172]) by smtp.corp.redhat.com (Postfix) with ESMTP id DEFB672AE1; Thu, 16 Jul 2020 14:26:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1594909584; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=rFOMtfrauKOkTwVYHiiz1g6uh4pzmKAKYAHQfuee8aM=; b=eqH6cpvWxPMhorwiYFav7cekIdLE2zNdww250mxhNAYnaLc4Ke0ATXRape4mv+NsOodRZ7 eiSu6B6qqvLlDmFBuZjWZB30naTPF0Geft9wQm1ZjXpVI08omEaa2VYyfmHb+1JunfEDMb lfFVka1P1JNt7wLug7vSOFTPq9GU8/w= X-MC-Unique: u2McWtaOMOyhr9RY6Lo1vA-1 From: Kevin Wolf To: qemu-block@nongnu.org Subject: [PATCH for-5.1 v2 2/2] file-posix: Allow byte-aligned O_DIRECT with NFS Date: Thu, 16 Jul 2020 16:26:01 +0200 Message-Id: <20200716142601.111237-3-kwolf@redhat.com> In-Reply-To: <20200716142601.111237-1-kwolf@redhat.com> References: <20200716142601.111237-1-kwolf@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=207.211.31.120; envelope-from=kwolf@redhat.com; helo=us-smtp-1.mimecast.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/07/16 04:25:38 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -40 X-Spam_score: -4.1 X-Spam_bar: ---- X-Spam_report: (-4.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-1, 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=-1, SPF_HELO_NONE=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.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, qemu-devel@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" Since commit a6b257a08e3 ('file-posix: Handle undetectable alignment'), we assume that if we open a file with O_DIRECT and alignment probing returns 1, we just couldn't find out the real alignment requirement because some filesystems make the requirement only for allocated blocks. In this case, a safe default of 4k is used. This is too strict for NFS, which does actually allow byte-aligned requests even with O_DIRECT. Because we can't distinguish both cases with generic code, let's just look at the file system magic and disable s->needs_alignment for NFS. This way, O_DIRECT can still be used on NFS for images that are not aligned to 4k. Signed-off-by: Kevin Wolf Reviewed-by: Eric Blake Reviewed-by: Max Reitz --- block/file-posix.c | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/block/file-posix.c b/block/file-posix.c index 8067e238cb..ae8190edab 100644 --- a/block/file-posix.c +++ b/block/file-posix.c @@ -62,10 +62,12 @@ #include #include #include +#include #include #include #include #include +#include #include #ifdef __s390__ #include @@ -300,6 +302,28 @@ static int probe_physical_blocksize(int fd, unsigned i= nt *blk_size) #endif } =20 +/* + * Returns true if no alignment restrictions are necessary even for files + * opened with O_DIRECT. + * + * raw_probe_alignment() probes the required alignment and assume that 1 m= eans + * the probing failed, so it falls back to a safe default of 4k. This can = be + * avoided if we know that byte alignment is okay for the file. + */ +static bool dio_byte_aligned(int fd) +{ +#ifdef __linux__ + struct statfs buf; + int ret; + + ret =3D fstatfs(fd, &buf); + if (ret =3D=3D 0 && buf.f_type =3D=3D NFS_SUPER_MAGIC) { + return true; + } +#endif + return false; +} + /* Check if read is allowed with given memory buffer and length. * * This function is used to check O_DIRECT memory buffer and request align= ment. @@ -629,7 +653,7 @@ static int raw_open_common(BlockDriverState *bs, QDict = *options, =20 s->has_discard =3D true; s->has_write_zeroes =3D true; - if ((bs->open_flags & BDRV_O_NOCACHE) !=3D 0) { + if ((bs->open_flags & BDRV_O_NOCACHE) !=3D 0 && !dio_byte_aligned(s->f= d)) { s->needs_alignment =3D true; } =20 --=20 2.25.4