On Thu, May 06, 2010 at 04:33:21PM -0600, Eric Blake wrote: > I was getting failures of domain/103-blockdev-save-restore.t when > connecting as qemu:///session, since my uid could stat /dev/sdb but > not open it. That test now skips for unprivileged users, as well as > adds a layer of sanity checking against expected size to avoid > trashing the wrong device. > > * conf/default.cfg (host_block_devices): Document optional size. > * lib/Sys/Virt/TCK.pm (get_host_block_device): If optional size is > supplied, skip a device that does not match. Also, avoid devices > that can't be opened. > --- > > Thanks again to Jim and Daniel for the helpful feedback. > Here's the version I actually pushed, based on your feedback. > > changes from v3: > completely determine $device before moving on to $kb_blocks > early exit if $device is undef after querying cfg file > reduce scope of $match > > conf/default.cfg | 8 ++++++++ > lib/Sys/Virt/TCK.pm | 15 ++++++++++++++- > 2 files changed, 22 insertions(+), 1 deletions(-) > > diff --git a/conf/default.cfg b/conf/default.cfg > index 01f438c..d749f5f 100644 > --- a/conf/default.cfg > +++ b/conf/default.cfg > @@ -134,5 +134,13 @@ host_pci_devices = ( > # the test suite itself needs to create partitions. > # The disks should be at *least* 512 MB in size > host_block_devices = ( > +# Each block device is either a raw path > # /dev/vdb > +# or a path plus size in 1k blocks, as in /proc/partitions, to avoid > +# trashing the wrong device > +# { > +# path = /dev/disk/by-id/usb-Generic_Flash_Disk_9B46E3C5-0:0 > +# size = 989184 > +# } > +# Can list more than on block device if many are available > ) > diff --git a/lib/Sys/Virt/TCK.pm b/lib/Sys/Virt/TCK.pm > index 9cdef09..2485d0f 100644 > --- a/lib/Sys/Virt/TCK.pm > +++ b/lib/Sys/Virt/TCK.pm > @@ -33,6 +33,7 @@ use IO::Uncompress::Gunzip qw(gunzip); > use IO::Uncompress::Bunzip2 qw(bunzip2); > use XML::XPath; > use Carp qw(cluck carp); > +use Fcntl qw(O_RDONLY SEEK_END); > > use Test::Builder; > use Sub::Uplevel qw(uplevel); > @@ -833,7 +834,19 @@ sub get_host_block_device { > my $self = shift; > my $devindex = @_ ? shift : 0; > > - return $self->config("host_block_devices/[$devindex]", undef); > + my $device = ($self->config("host_block_devices/[$devindex]/path", undef) > + || $self->config("host_block_devices/[$devindex]", undef)); > + return undef unless $device; > + > + my $kb_blocks = $self->config("host_block_devices/[$devindex]/size", 0); > + > + # Filter out devices that the current user can't open. > + sysopen(BLK, $device, O_RDONLY) or return undef; > + my $match = ($kb_blocks ? sysseek(BLK, 0, SEEK_END) == $kb_blocks * 1024 > + : 1); > + close BLK; > + > + return $match ? $device : undef; > } ACK 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 :| -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list