From patchwork Tue Nov 18 16:15:53 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ekaterina Tumanova X-Patchwork-Id: 412078 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 1CF0914010F for ; Wed, 19 Nov 2014 03:16:47 +1100 (AEDT) Received: from localhost ([::1]:53988 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XqlSP-00066W-6O for incoming@patchwork.ozlabs.org; Tue, 18 Nov 2014 11:16:45 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:41155) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XqlRn-00059q-GS for qemu-devel@nongnu.org; Tue, 18 Nov 2014 11:16:16 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1XqlRe-000502-B0 for qemu-devel@nongnu.org; Tue, 18 Nov 2014 11:16:07 -0500 Received: from e06smtp17.uk.ibm.com ([195.75.94.113]:49626) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XqlRe-0004zg-3I for qemu-devel@nongnu.org; Tue, 18 Nov 2014 11:15:58 -0500 Received: from /spool/local by e06smtp17.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Tue, 18 Nov 2014 16:15:57 -0000 Received: from d06dlp02.portsmouth.uk.ibm.com (9.149.20.14) by e06smtp17.uk.ibm.com (192.168.101.147) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Tue, 18 Nov 2014 16:15:54 -0000 Received: from b06cxnps4076.portsmouth.uk.ibm.com (d06relay13.portsmouth.uk.ibm.com [9.149.109.198]) by d06dlp02.portsmouth.uk.ibm.com (Postfix) with ESMTP id 7968C2190046 for ; Tue, 18 Nov 2014 16:15:27 +0000 (GMT) Received: from d06av04.portsmouth.uk.ibm.com (d06av04.portsmouth.uk.ibm.com [9.149.37.216]) by b06cxnps4076.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id sAIGFsQ154198382 for ; Tue, 18 Nov 2014 16:15:54 GMT Received: from d06av04.portsmouth.uk.ibm.com (localhost [127.0.0.1]) by d06av04.portsmouth.uk.ibm.com (8.14.4/8.14.4/NCO v10.0 AVout) with ESMTP id sAIGFr9C019964 for ; Tue, 18 Nov 2014 09:15:53 -0700 Received: from [9.156.34.39] (tumanova.moscow-rstl.ru.ibm.com [9.156.34.39] (may be forged)) by d06av04.portsmouth.uk.ibm.com (8.14.4/8.14.4/NCO v10.0 AVin) with ESMTP id sAIGFrbZ019950 for ; Tue, 18 Nov 2014 09:15:53 -0700 Message-ID: <546B70B9.9010102@linux.vnet.ibm.com> Date: Tue, 18 Nov 2014 19:15:53 +0300 From: Ekaterina Tumanova User-Agent: Mozilla/5.0 (X11; Linux i686; rv:31.0) Gecko/20100101 Thunderbird/31.2.0 MIME-Version: 1.0 To: qemu-devel References: <1416327001-22278-3-git-send-email-tumanova@linux.vnet.ibm.com> In-Reply-To: <1416327001-22278-3-git-send-email-tumanova@linux.vnet.ibm.com> X-Forwarded-Message-Id: <1416327001-22278-3-git-send-email-tumanova@linux.vnet.ibm.com> X-TM-AS-MML: disable X-Content-Scanned: Fidelis XPS MAILER x-cbid: 14111816-0029-0000-0000-000001BAAF52 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 195.75.94.113 Subject: [Qemu-devel] Fwd: [PATCH v2 2/6] geometry: Detect blocksize via ioctls in separate static functions X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org copying to mail list -------- Forwarded Message -------- Subject: [PATCH v2 2/6] geometry: Detect blocksize via ioctls in separate static functions Date: Tue, 18 Nov 2014 17:09:57 +0100 From: Ekaterina Tumanova To: armbru@redhat.com, pbonzini@redhat.com, stefanha@redhat.com, kwolf@redhat.com CC: borntraeger@de.ibm.com, cornelia.huck@de.ibm.com, dahi@linux.vnet.ibm.com, mihajlov@linux.vnet.ibm.com, Ekaterina Tumanova Move the IOCTL calls that detect logical blocksize from raw_probe_alignment into separate function (probe_logical_blocksize). Introduce function which detect physical blocksize via IOCTL (probe_physical_blocksize). Both functions will be used in the next patch. Signed-off-by: Ekaterina Tumanova --- block/raw-posix.c | 58 +++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 39 insertions(+), 19 deletions(-) size_t align; diff --git a/block/raw-posix.c b/block/raw-posix.c index e100ae2..45f1d79 100644 --- a/block/raw-posix.c +++ b/block/raw-posix.c @@ -223,50 +223,70 @@ static int raw_normalize_devicepath(const char **filename) } #endif -static void raw_probe_alignment(BlockDriverState *bs, int fd, Error **errp) +static unsigned int probe_logical_blocksize(BlockDriverState *bs, int fd) { - BDRVRawState *s = bs->opaque; - char *buf; - unsigned int sector_size; - - /* For /dev/sg devices the alignment is not really used. - With buffered I/O, we don't have any restrictions. */ - if (bs->sg || !s->needs_alignment) { - bs->request_alignment = 1; - s->buf_align = 1; - return; - } + unsigned int sector_size = 0; /* Try a few ioctls to get the right size */ - bs->request_alignment = 0; - s->buf_align = 0; - #ifdef BLKSSZGET if (ioctl(fd, BLKSSZGET, §or_size) >= 0) { - bs->request_alignment = sector_size; + return sector_size; } #endif #ifdef DKIOCGETBLOCKSIZE if (ioctl(fd, DKIOCGETBLOCKSIZE, §or_size) >= 0) { - bs->request_alignment = sector_size; + return sector_size; } #endif #ifdef DIOCGSECTORSIZE if (ioctl(fd, DIOCGSECTORSIZE, §or_size) >= 0) { - bs->request_alignment = sector_size; + return sector_size; } #endif #ifdef CONFIG_XFS if (s->is_xfs) { struct dioattr da; if (xfsctl(NULL, fd, XFS_IOC_DIOINFO, &da) >= 0) { - bs->request_alignment = da.d_miniosz; + sector_size = da.d_miniosz; /* The kernel returns wrong information for d_mem */ /* s->buf_align = da.d_mem; */ + return sector_size; } } #endif + return 0; +} + +static unsigned int probe_physical_blocksize(BlockDriverState *bs, int fd) +{ + unsigned int blk_size = 0; +#ifdef BLKPBSZGET + if (ioctl(fd, BLKPBSZGET, &blk_size) >= 0) { + return blk_size; + } +#endif + + return 0; +} + +static void raw_probe_alignment(BlockDriverState *bs, int fd, Error **errp) +{ + BDRVRawState *s = bs->opaque; + char *buf; + + /* For /dev/sg devices the alignment is not really used. + With buffered I/O, we don't have any restrictions. */ + if (bs->sg || !s->needs_alignment) { + bs->request_alignment = 1; + s->buf_align = 1; + return; + } + + s->buf_align = 0; + /* Let's try to use the logical blocksize for the alignment. */ + bs->request_alignment = probe_logical_blocksize(bs, fd); + /* If we could not get the sizes so far, we can only guess them */ if (!s->buf_align) {