[PATCH] Target::LibVirt: Don't truncate a volume when opening it
perl's '>' open mode truncates by default, and will create a new file if necessary. We don't want to truncate an existing volume when writing to it, and it's an error if the volume doesn't already exist. Use sysopen to be explicit about this. --- lib/Sys/VirtV2V/Target/LibVirt.pm | 6 +++++- 1 files changed, 5 insertions(+), 1 deletions(-) diff --git a/lib/Sys/VirtV2V/Target/LibVirt.pm b/lib/Sys/VirtV2V/Target/LibVirt.pm index c8802ac..99a1ad2 100644 --- a/lib/Sys/VirtV2V/Target/LibVirt.pm +++ b/lib/Sys/VirtV2V/Target/LibVirt.pm @@ -20,6 +20,8 @@ use warnings; package Sys::VirtV2V::Target::LibVirt::Vol; +use POSIX; + use Sys::VirtV2V::UserMessage qw(user_message); sub _new @@ -106,7 +108,9 @@ sub open my $self = shift; my $path = $self->get_path(); - open(my $fd, '>', $path) + + # We want to open the existing volume without truncating it + sysopen(my $fd, $path, O_WRONLY) or die(user_message(__x("Error opening storage volume {path} ". "for writing: {error}", error => $!))); -- 1.6.6.1
On Wed, Apr 07, 2010 at 12:05:37PM +0100, Matthew Booth wrote:
perl's '>' open mode truncates by default, and will create a new file if necessary. We don't want to truncate an existing volume when writing to it, and it's an error if the volume doesn't already exist. Use sysopen to be explicit about this. --- lib/Sys/VirtV2V/Target/LibVirt.pm | 6 +++++- 1 files changed, 5 insertions(+), 1 deletions(-)
diff --git a/lib/Sys/VirtV2V/Target/LibVirt.pm b/lib/Sys/VirtV2V/Target/LibVirt.pm index c8802ac..99a1ad2 100644 --- a/lib/Sys/VirtV2V/Target/LibVirt.pm +++ b/lib/Sys/VirtV2V/Target/LibVirt.pm @@ -20,6 +20,8 @@ use warnings;
package Sys::VirtV2V::Target::LibVirt::Vol;
+use POSIX; + use Sys::VirtV2V::UserMessage qw(user_message);
sub _new @@ -106,7 +108,9 @@ sub open my $self = shift;
my $path = $self->get_path(); - open(my $fd, '>', $path) + + # We want to open the existing volume without truncating it + sysopen(my $fd, $path, O_WRONLY)
NB There's no need to switch to sysopen. You can use '>>' instead of '>' if you want to append instead of truncate Daniel -- |: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :| |: http://libvirt.org -o- http://virt-manager.org -o- http://deltacloud.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|
On 07/04/10 12:07, Daniel P. Berrange wrote:
On Wed, Apr 07, 2010 at 12:05:37PM +0100, Matthew Booth wrote:
perl's '>' open mode truncates by default, and will create a new file if necessary. We don't want to truncate an existing volume when writing to it, and it's an error if the volume doesn't already exist. Use sysopen to be explicit about this. --- lib/Sys/VirtV2V/Target/LibVirt.pm | 6 +++++- 1 files changed, 5 insertions(+), 1 deletions(-)
diff --git a/lib/Sys/VirtV2V/Target/LibVirt.pm b/lib/Sys/VirtV2V/Target/LibVirt.pm index c8802ac..99a1ad2 100644 --- a/lib/Sys/VirtV2V/Target/LibVirt.pm +++ b/lib/Sys/VirtV2V/Target/LibVirt.pm @@ -20,6 +20,8 @@ use warnings;
package Sys::VirtV2V::Target::LibVirt::Vol;
+use POSIX; + use Sys::VirtV2V::UserMessage qw(user_message);
sub _new @@ -106,7 +108,9 @@ sub open my $self = shift;
my $path = $self->get_path(); - open(my $fd, '>', $path) + + # We want to open the existing volume without truncating it + sysopen(my $fd, $path, O_WRONLY)
NB There's no need to switch to sysopen. You can use '>>' instead of '>' if you want to append instead of truncate
I need to write from the beginning, not append. Matt -- Matthew Booth, RHCA, RHCSS Red Hat Engineering, Virtualisation Team M: +44 (0)7977 267231 GPG ID: D33C3490 GPG FPR: 3733 612D 2D05 5458 8A8A 1600 3441 EA19 D33C 3490
On Wed, Apr 07, 2010 at 12:05:37PM +0100, Matthew Booth wrote:
perl's '>' open mode truncates by default, and will create a new file if necessary. We don't want to truncate an existing volume when writing to it, and it's an error if the volume doesn't already exist. Use sysopen to be explicit about this.
Yes, looks fine. ACK. Rich. -- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones libguestfs lets you edit virtual machines. Supports shell scripting, bindings from many languages. http://et.redhat.com/~rjones/libguestfs/ See what it can do: http://et.redhat.com/~rjones/libguestfs/recipes.html
participants (3)
-
Daniel P. Berrange -
Matthew Booth -
Richard W.M. Jones