[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-block] [Qemu-devel] [RFC PATCH] glusterfs: allow partial reads
From: |
Eric Blake |
Subject: |
Re: [Qemu-block] [Qemu-devel] [RFC PATCH] glusterfs: allow partial reads |
Date: |
Fri, 2 Dec 2016 13:13:28 -0600 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.4.0 |
On 12/01/2016 04:59 AM, Wolfgang Bumiller wrote:
> Fixes #1644754.
>
> Signed-off-by: Wolfgang Bumiller <address@hidden>
> ---
> I'm not sure what the original rationale was to treat both partial
> reads as well as well as writes as I/O error. (Seems to have happened
> from original glusterfs v1 to v2 series with a note but no reasoning
> for the read side as far as I could see.)
> The general direction lately seems to be to move away from sector
> based block APIs. Also eg. the NFS code allows partial reads. (It
> does, however, have an old patch (c2eb918e3) dedicated to aligning
> sizes to 512 byte boundaries for file creation for compatibility to
> other parts of qemu like qcow2. This already happens in glusterfs,
> though, but if you move a file from a different storage over to
> glusterfs you may end up with a qcow2 file with eg. the L1 table in
> the last 80 bytes of the file aligned to _begin_ at a 512 boundary,
> but not _end_ at one.)
>
> block/gluster.c | 10 +++++++++-
> 1 file changed, 9 insertions(+), 1 deletion(-)
>
> diff --git a/block/gluster.c b/block/gluster.c
> index 891c13b..3db0bf8 100644
> --- a/block/gluster.c
> +++ b/block/gluster.c
> @@ -41,6 +41,7 @@ typedef struct GlusterAIOCB {
> int ret;
> Coroutine *coroutine;
> AioContext *aio_context;
> + bool is_write;
> } GlusterAIOCB;
>
> typedef struct BDRVGlusterState {
> @@ -716,8 +717,10 @@ static void gluster_finish_aiocb(struct glfs_fd *fd,
> ssize_t ret, void *arg)
> acb->ret = 0; /* Success */
> } else if (ret < 0) {
> acb->ret = -errno; /* Read/Write failed */
> + } else if (acb->is_write) {
> + acb->ret = -EIO; /* Partial write - fail it */
> } else {
> - acb->ret = -EIO; /* Partial read/write - fail it */
> + acb->ret = 0; /* Success */
Does this properly guarantee that the portion beyond EOF reads as zero?
Would it be better to switch to byte-based interfaces rather than
continue to force gluster interaction in 512-byte sector chunks, since
gluster can obviously store files that are not 512-aligned?
--
Eric Blake eblake redhat com +1-919-301-3266
Libvirt virtualization library http://libvirt.org
signature.asc
Description: OpenPGP digital signature