On 04/22/2011 10:57 AM, Sunil Mushran wrote: > On 04/22/2011 09:40 AM, Eric Blake wrote: >> On 04/22/2011 10:28 AM, Sunil Mushran wrote: >>> while(1) { >>> read(block); >>> if (block_all_zeroes) >>> lseek(SEEK_DATA); >>> } >>> >>> What's wrong with the above? If this is the case, even SEEK_HOLE >>> is not needed but should be added as it is already in Solaris. > > Holes are an implementation detail. Nobody's arguing that. And on Solaris, a file system with no holes support tells you that up front - lseek(fd, 0, SEEK_HOLE) returns the end of the file (unless the file is 0 bytes, then it fails with ENXIO). > > cp can read whatever blocksize it chooses. If that block contains > zero, it would signal cp that maybe it should SEEK_DATA and skip > reading all those blocks. That's all. We are not trying to achieve > perfection. We are just trying to reduce cpu waste. > > If the fs supports SEEK_*, then great. If it does not, then it is no > worse than before. But providing just SEEK_DATA _is_ worse than before if you don't provide the correct SEEK_HOLE everywhere. Because then your algorithm of trying lseek(SEEK_DATA) after every run of zeros in the hopes of an optimization is a wasted syscall, since it will just return your current offset every time, so you end up with more syscalls than if you had used the single lseek(SEEK_DATA) that returns the end of the file up front, and known that the remainder of the file has no holes to even try seeking past. -- Eric Blake eblake@xxxxxxxxxx +1-801-349-2682 Libvirt virtualization library http://libvirt.org
Attachment:
signature.asc
Description: OpenPGP digital signature