[libvirt] [PATCH 8/9] Simplified version of volume wiping based on feedback from the list.

Laine Stump laine at laine.org
Wed Mar 17 14:49:43 UTC 2010


On 03/17/2010 10:13 AM, Daniel Veillard wrote:
> On Mon, Mar 15, 2010 at 10:13:30PM -0400, David Allan wrote:
>    
>> ---
>>   src/storage/storage_driver.c |  224 ++++++++++++++++++++++++++++++++++++++++++
>>   1 files changed, 224 insertions(+), 0 deletions(-)
>>
>>
>>      
[...]
>    
>> +    char errbuf[64];
>>      
>    While the 1024 used many places in the code is probably a bit too
> much, 64 chars might be a bit small for an errno return description
> I would bump it to 128,
>    


Actually, you shouldn't need the errbuf at all - see my comments on the 
use of errbuf below.


>    
>> +    ret = ftruncate(fd, 0);
>> +    if (ret == -1) {
>> +        virReportSystemError(ret,
>> +                             _("Failed to truncate volume with "
>> +                               "path '%s' to 0 bytes: '%s'"),
>> +                             vol->target.path,
>> +                             virStrerror(errno, errbuf, sizeof(errbuf)));
>>      

Since ftruncate returns a -1 on failure, and you're sending that return 
value to virRerportSystemError (which would barf on the -1) and then 
manually printing out the strerror(). Instead, this should be changed to:


                virReportSystemError(errno,

                              _("Failed to truncate volume with "
                              "path '%s' to 0 bytes"),
                              vol->target.path);


>> +        goto out;
>> +    }
>> +
>> +    ret = ftruncate(fd, size);
>> +    if (ret == -1) {
>> +        virReportSystemError(ret,
>> +                             _("Failed to truncate volume with "
>> +                               "path '%s' to %ju bytes: '%s'\n"),
>> +                             vol->target.path, (intmax_t)size,
>> +                             virStrerror(errno, errbuf, sizeof(errbuf)));
>>      

Likewise, this should be:

          virReportSystemError(errno,
                               _("Failed to truncate volume with "
                              "path '%s' to %ju bytes),
                              vol->target.path, (intmax_t)size);
                              virStrerror(errno, errbuf, sizeof(errbuf)));



>> +    }
>> +
>> +out:
>> +    return ret;
>> +}
>> +
>> +
>> +static int
>> +storageWipeExtent(virStorageVolDefPtr vol,
>> +                  int fd,
>> +                  off_t extent_start,
>> +                  off_t extent_length,
>> +                  char *writebuf,
>> +                  size_t writebuf_length,
>> +                  size_t *bytes_wiped)
>> +{
>> +    int ret = -1, written = 0;
>>      
>    no need to initialize ret here
>
>    
>> +    off_t remaining = 0;
>> +    size_t write_size = 0;
>> +    char errbuf[64];
>>      
>    same 128 vs 64
>    

Again, you shouldn't need errbuf at all.

>    
>> +    VIR_DEBUG("extent logical start: %ju len: %ju",
>> +              (intmax_t)extent_start, (intmax_t)extent_length);
>> +
>> +    if ((ret = lseek(fd, extent_start, SEEK_SET))<  0) {
>> +        virReportSystemError(ret,
>> +                             _("Failed to seek to position %ju in volume "
>> +                               "with path '%s': '%s'"),
>> +                             (intmax_t)extent_start, vol->target.path,
>> +                             virStrerror(errno, errbuf, sizeof(errbuf)));
>>      

Same comment: lseek returns -1, not an errno. replace "ret" with errno, 
remove the final %s, and get rid of the virStrerror() arg.

>> +        goto out;
>> +    }
>> +
>> +    remaining = extent_length;
>> +    while (remaining>  0) {
>> +
>> +        write_size = (writebuf_length<  remaining) ? writebuf_length : remaining;
>> +        written = safewrite(fd, writebuf, write_size);
>> +        if (written<  0) {
>> +            virReportSystemError(written,
>> +                                 _("Failed to write to storage volume with "
>> +                                   "path '%s': '%s' "
>> +                                   "(attempted to write %zu bytes)"),
>> +                                 vol->target.path,
>> +                                 virStrerror(errno, errbuf, sizeof(errbuf)),
>> +                                 write_size);
>>      

Again - safewrite returns # of bytes written, or -1, not an errno. 
Replace "written" with errno, and get rid of virStrError() and the extra %s.


>> +            goto out;
>> +        }
>> +
>> +        *bytes_wiped += written;
>> +        remaining -= written;
>> +    }
>> +
>> +    VIR_DEBUG("Wrote %zu bytes to volume with path '%s'",
>> +              *bytes_wiped, vol->target.path);
>> +
>> +    ret = 0;
>> +
>> +out:
>> +    return ret;
>> +}
>> +
>> +
>> +static int
>> +storageVolumeWipeInternal(virStorageVolDefPtr def)
>> +{
>> +    int ret = -1, fd = -1;
>> +    char errbuf[64];
>>      

You don't need errbuf.

>> +    struct stat st;
>> +    char *writebuf = NULL;
>> +    size_t bytes_wiped = 0;
>> +
>> +    VIR_DEBUG("Wiping volume with path '%s'", def->target.path);
>> +
>> +    fd = open(def->target.path, O_RDWR);
>> +    if (fd == -1) {
>> +        VIR_ERROR("Failed to open storage volume with path '%s': '%s'",
>> +                  def->target.path,
>> +                  virStrerror(errno, errbuf, sizeof(errbuf)));
>>      

Not sure why you're using VIR_ERROR() + manually adding virStrerror() - 
isn't this the same thing as virReportSystemError?
>> +        goto out;
>> +    }
>> +
>> +    if (fstat(fd,&st) == -1) {
>> +        VIR_ERROR("Failed to stat storage volume with path '%s': '%s'",
>> +                  def->target.path,
>> +                  virStrerror(errno, errbuf, sizeof(errbuf)));
>>      

And again.





More information about the libvir-list mailing list