• J
    block/gluster: glfs_lseek() workaround · 223a23c1
    Jeff Cody 提交于
    On current released versions of glusterfs, glfs_lseek() will sometimes
    return invalid values for SEEK_DATA or SEEK_HOLE.  For SEEK_DATA and
    SEEK_HOLE, the returned value should be >= the passed offset, or < 0 in
    the case of error:
    
    LSEEK(2):
    
        off_t lseek(int fd, off_t offset, int whence);
    
        [...]
    
        SEEK_HOLE
                  Adjust  the file offset to the next hole in the file greater
                  than or equal to offset.  If offset points into the middle of
                  a hole, then the file offset is set to offset.  If there is no
                  hole past offset, then the file offset is adjusted to the end
                  of the file (i.e., there is  an implicit hole at the end of
                  any file).
    
        [...]
    
        RETURN VALUE
                  Upon  successful  completion,  lseek()  returns  the resulting
                  offset location as measured in bytes from the beginning of the
                  file.  On error, the value (off_t) -1 is returned and errno is
                  set to indicate the error
    
    However, occasionally glfs_lseek() for SEEK_HOLE/DATA will return a
    value less than the passed offset, yet greater than zero.
    
    For instance, here are example values observed from this call:
    
        offs = glfs_lseek(s->fd, start, SEEK_HOLE);
        if (offs < 0) {
            return -errno;          /* D1 and (H3 or H4) */
        }
    
    start == 7608336384
    offs == 7607877632
    
    This causes QEMU to abort on the assert test.  When this value is
    returned, errno is also 0.
    
    This is a reported and known bug to glusterfs:
    https://bugzilla.redhat.com/show_bug.cgi?id=1425293
    
    Although this is being fixed in gluster, we still should work around it
    in QEMU, given that multiple released versions of gluster behave this
    way.
    
    This patch treats the return case of (offs < start) the same as if an
    error value other than ENXIO is returned; we will assume we learned
    nothing, and there are no holes in the file.
    Signed-off-by: NJeff Cody <jcody@redhat.com>
    Reviewed-by: NEric Blake <eblake@redhat.com>
    Reviewed-by: NNiels de Vos <ndevos@redhat.com>
    Message-id: 87c0140e9407c08f6e74b04131b610f2e27c014c.1495560397.git.jcody@redhat.com
    Signed-off-by: NJeff Cody <jcody@redhat.com>
    223a23c1
gluster.c 46.3 KB