From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:35386) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RPtL6-0001pk-UE for qemu-devel@nongnu.org; Mon, 14 Nov 2011 05:00:33 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1RPtL1-0004Xa-8e for qemu-devel@nongnu.org; Mon, 14 Nov 2011 05:00:32 -0500 Received: from mtagate3.uk.ibm.com ([194.196.100.163]:57178) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RPtL1-0004Wv-0V for qemu-devel@nongnu.org; Mon, 14 Nov 2011 05:00:27 -0500 Received: from d06nrmr1806.portsmouth.uk.ibm.com (d06nrmr1806.portsmouth.uk.ibm.com [9.149.39.193]) by mtagate3.uk.ibm.com (8.13.1/8.13.1) with ESMTP id pAEA0OhE023518 for ; Mon, 14 Nov 2011 10:00:24 GMT Received: from d06av01.portsmouth.uk.ibm.com (d06av01.portsmouth.uk.ibm.com [9.149.37.212]) by d06nrmr1806.portsmouth.uk.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id pAEA0NoE2248750 for ; Mon, 14 Nov 2011 10:00:23 GMT Received: from d06av01.portsmouth.uk.ibm.com (loopback [127.0.0.1]) by d06av01.portsmouth.uk.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id pAEA0NBU008644 for ; Mon, 14 Nov 2011 03:00:23 -0700 Date: Mon, 14 Nov 2011 10:00:22 +0000 From: Stefan Hajnoczi Message-ID: <20111114100022.GA25870@stefanha-thinkpad.localdomain> References: <4EB78CE9.4030305@linux.vnet.ibm.com> <4EB89ED1.90307@linux.vnet.ibm.com> <4EC0AB7D.2020807@linux.vnet.ibm.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4EC0AB7D.2020807@linux.vnet.ibm.com> Subject: Re: [Qemu-devel] I have some questions in block , can anyone help me, thank you! List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Zhi Hui Li Cc: QEMU-devel , Markus Armbruster On Mon, Nov 14, 2011 at 01:47:41PM +0800, Zhi Hui Li wrote: > 1) In qcow2.c, in function: qcow2_co_readv > In qcow2.h, in struct BDRVQcowState > I want to know the relations between sector_num in function > qcow2_co_readv and cluster_sectors in struct BDRVQcowState ? sector_num is the starting offset of the I/O request. For example, sector_num=10 means that the read begins at 10 * 512 = 5120 bytes. cluster_sectors is the number of sectors in a qcow2 cluster. (The qcow2 format manages space in "clusters" instead of sectors. They are typically many sectors large, e.g. 128.) > 2) In qcow2.c, in function; qcow2_co_writev > at line 547: > > index_in_cluster = sector_num & (s->cluster_sectors - 1); > How to understand it ? cluster_sectors is a power of 2, e.g. 1024, 2048, 4096, and so on. So this expression is the same as: index_in_cluster = sector_num % cluster_sectors It calculates the offset from the start of the cluster. For example: sector_num = 130 cluster_sectors = 128 cluster = sector_num / cluster_sectors = 1 index_in_cluster = sector_num % cluster_sectors = 2 We can get back to the original sector_num value like this: sector_num = cluster * cluster_sectors + index_in_cluster = 1 * 128 + 2 = 130 So this is about managing space in "clusters". It's similar to how memory is managed in pages instead of bytes by the memory management unit. > 3) In qcow2.c, in the function : qcow2_co_readv and qcow2_co_writev > I want to know the least unit that it was read by the function. > for example: > BDRVQcowState s; > Is s->cluster_size or 512 ? The block layer minimum I/O size is BDRV_SECTOR_SIZE. For convenience there is the bdrv_pread()/bdrv_pwrite() interface which allows byte-granularity access but uses bounce buffers underneath. s->cluster_size is the number of bytes per cluster. A cluster is typically 64 KB but the value can be set in the image file. Qcow2 internally manages space in cluster but the I/O granularity is BDRV_SECTOR_SIZE (512). Stefan