On 03/07/2016 01:14 PM, Eric Blake wrote: > [adding qemu-devel; ALL patches must cc qemu-devel even when sent to > another list] > > On 03/07/2016 11:04 AM, Niels de Vos wrote: >> GlusterFS 3.8 contains support for SEEK_DATA and SEEK_HOLE. This makes >> it possible to detect sparse areas in files. >> >> Signed-off-by: Niels de Vos <nde...@redhat.com> >> >> -- >> Tested by compiling and running "qemu-img map gluster://..." with a >> build of the current master branch of glusterfs. Using a Fedora >> cloud image (in raw format) shows many SEEK procudure calls going back >> and forth over the network. The output of "qemu map" matches the output >> when run against the image on the local filesystem. >> ---
I hit a weird failure when trying to compile this on an older RHEL 6 box, where /usr/include/unistd.h is too old to include SEEK_DATA and SEEK_HOLE: block/gluster.c: In function ‘qemu_gluster_test_seek’: block/gluster.c:684: error: ‘SEEK_DATA’ undeclared (first use in this function) block/gluster.c:684: error: (Each undeclared identifier is reported only once block/gluster.c:684: error: for each function it appears in.) block/gluster.c: In function ‘find_allocation’: block/gluster.c:1202: error: ‘SEEK_DATA’ undeclared (first use in this function) block/gluster.c:1234: error: ‘SEEK_HOLE’ undeclared (first use in this function) The patch has been in place for several months (which shows how seldom I compile on that particular box), but it makes me wonder why none of the autobuilders have hit this failure. But since the code mentions that it shamelessly copies from raw-posix.c, and that file in turn has #ifdef guards to only do SEEK_HOLE optimizations if the system headers defined SEEK_HOLE in the first place, it sounds like you need to do a followup patch along those lines. >> + * >> + * (Shamefully copied from raw-posix.c, only miniscule adaptions.) >> + */ >> +static int find_allocation(BlockDriverState *bs, off_t start, >> + off_t *data, off_t *hole) >> +{ >> + BDRVGlusterState *s = bs->opaque; >> + off_t offs; >> + >> + /* >> + * SEEK_DATA cases: >> + * D1. offs == start: start is in data >> + * D2. offs > start: start is in a hole, next data at offs >> + * D3. offs < 0, errno = ENXIO: either start is in a trailing hole >> + * or start is beyond EOF >> + * If the latter happens, the file has been truncated behind >> + * our back since we opened it. All bets are off then. >> + * Treating like a trailing hole is simplest. >> + * D4. offs < 0, errno != ENXIO: we learned nothing >> + */ >> + offs = glfs_lseek(s->fd, start, SEEK_DATA); -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org
signature.asc
Description: OpenPGP digital signature