On Wed, Oct 09, 2013 at 10:17:19AM -0400, John Ferlan wrote: > Commit id '532fef36' added a call to fallocate() and some error > handling based on whether or not the function existed. This new > call resulted in libvirt-cim/cimtest failures when attempting to > create a volume with "0" (zero) allocation value. The failure is > logged as: > > Oct 9 07:51:33 localhost libvirtd[8030]: cannot allocate 0 bytes in > file '/var/lib/libvirt/images/cimtest-vol.img': Invalid argument > > This can also be seen with virsh vol-create-as: > > error: Failed to create vol test > error: cannot allocate 0 bytes in file '/home/vm-images/test': Invalid > argument > > error: Failed to create vol test > error: cannot allocate 0 bytes in file '/home/vm-images/test': Invalid > argument > > It turns out fallocate() will return EINVAL when the incoming 'len' > (or allocation) value is 0 (or less). > --- > src/storage/storage_backend.c | 21 ++++++++++++--------- > 1 file changed, 12 insertions(+), 9 deletions(-) > > diff --git a/src/storage/storage_backend.c b/src/storage/storage_backend.c > index 662af32..d0580f9 100644 > --- a/src/storage/storage_backend.c > +++ b/src/storage/storage_backend.c > @@ -332,19 +332,22 @@ createRawFile(int fd, virStorageVolDefPtr vol, > /* Avoid issues with older kernel's <linux/fs.h> namespace pollution. */ > #if HAVE_FALLOCATE - 0 > /* Try to preallocate all requested disk space, but fall back to > - * other methods if this fails with ENOSYS or EOPNOTSUPP. > + * other methods if this fails with ENOSYS or EOPNOTSUPP. If allocation > + * is 0 (or less than 0), then fallocate will fail with EINVAL. > * NOTE: do not use posix_fallocate; posix_fallocate falls back > * to writing zeroes block by block in case fallocate isn't > * available, and since we're going to copy data from another > * file it doesn't make sense to write the file twice. */ > - if (fallocate(fd, 0, 0, vol->allocation) == 0) { > - need_alloc = 0; > - } else if (errno != ENOSYS && errno != EOPNOTSUPP) { > - ret = -errno; > - virReportSystemError(errno, > - _("cannot allocate %llu bytes in file '%s'"), > - vol->allocation, vol->target.path); > - goto cleanup; > + if (vol->allocation) { > + if (fallocate(fd, 0, 0, vol->allocation) == 0) { > + need_alloc = 0; > + } else if (errno != ENOSYS && errno != EOPNOTSUPP) { > + ret = -errno; > + virReportSystemError(errno, > + _("cannot allocate %llu bytes in file '%s'"), > + vol->allocation, vol->target.path); > + goto cleanup; > + } > } > #endif ACK Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :| -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list