From 49d992fca9963ddaf9c26b0946bbbe4985f83242 Mon Sep 17 00:00:00 2001 From: Maarten Vanraes Date: Thu, 19 May 2016 00:55:59 +0200 Subject: Loop: adjust to new PartLink system --- lib/ManaTools/Shared/disk_backend/Plugin/Loop.pm | 103 +++++++++++++++++++++-- 1 file changed, 97 insertions(+), 6 deletions(-) diff --git a/lib/ManaTools/Shared/disk_backend/Plugin/Loop.pm b/lib/ManaTools/Shared/disk_backend/Plugin/Loop.pm index 3555a609..9086ac80 100644 --- a/lib/ManaTools/Shared/disk_backend/Plugin/Loop.pm +++ b/lib/ManaTools/Shared/disk_backend/Plugin/Loop.pm @@ -131,14 +131,35 @@ override ('probe', sub { return 0; } } - my @lines = $self->tool_lines('losetup', '--list', '--noheadings', '--raw', '--output', 'MAJ:MIN,NAME,SIZELIMIT,OFFSET,AUTOCLEAR,RO,BACK-MAJ:MIN,BACK-INO,BACK-FILE'); + @parts = (); + my @lines = $self->tool_lines('losetup', '--list', '--noheadings', '--raw', '--output', 'MAJ:MIN,NAME,SIZELIMIT,OFFSET,AUTOCLEAR,RO,BACK-FILE,BACK-MAJ:MIN,BACK-INO'); for my $line (@lines) { chomp($line); my @fields = split(' ', $line); - (scalar(@fields) == 9) or die('unexpected losetup output...'); + print STDERR "fields in line '$line': ". scalar(@fields) ."\n"; + (scalar(@fields) == 7 || scalar(@fields) == 9) or die('unexpected losetup output...'); my $loopfile = $self->_sanitize_string($fields[1]); my $bdfile = '/sys/block/'. basename($loopfile); - my $io = $self->parent->mkio('Disk', {id => basename($loopfile), path => $bdfile}); + + # look or create Loop part + my $p = $self->parent->trypart(ManaTools::Shared::disk_backend::Part->CurrentState, sub { + my $part = shift; + my $parameters = shift; + return ($part->devicepath() eq $parameters->{devicepath}); + }, 'Loop', {devicepath => $bdfile, plugin => $self, loaded => undef, saved => undef}); + $p->prop('sizelimit', $self->_sanitize_string($fields[2])); + $p->prop('offset', $self->_sanitize_string($fields[3])); + $p->prop('autoclear', $self->_sanitize_string($fields[4])); + $p->prop('back-file', $self->_sanitize_string($fields[6])); + $p->prop('back-dev', $self->_sanitize_string($fields[7])) if (defined $fields[7]); + $p->prop('back-ino', $self->_sanitize_string($fields[8])) if (defined $fields[8]); + push @parts, $p; + + # TODO: add sibling tags to the other parts + # TODO: parent that is filerole? if parent is create, we can do the child/first/last thing + + # io stuff + my $io = $self->parent->mkio('Disk', {id => basename($loopfile), path => $bdfile, devicepath => $bdfile}); if (!defined($io) || !$part->out_add($io)) { $err = 1; } @@ -146,11 +167,16 @@ override ('probe', sub { $io->prop('sizelimit', $self->_sanitize_string($fields[2])); $io->prop('offset', $self->_sanitize_string($fields[3])); $io->prop('autoclear', $self->_sanitize_string($fields[4])); - $io->prop('back-dev', $self->_sanitize_string($fields[6])); - $io->prop('back-ino', $self->_sanitize_string($fields[7])); - $io->prop('back-file', $self->_sanitize_string($fields[8])); + $io->prop('back-file', $self->_sanitize_string($fields[6])); + $io->prop('back-dev', $self->_sanitize_string($fields[7])) if (defined $fields[7]); + $io->prop('back-ino', $self->_sanitize_string($fields[8])) if (defined $fields[8]); } } + + # trigger changed parts + for my $p (@parts) { + $self->parent->changedpart($p, ManaTools::Shared::disk_backend::Part->CurrentState); + } return $err == 0; }); @@ -183,4 +209,69 @@ class_has '+out_restriction' => ( } ); +package ManaTools::Shared::disk_backend::Part::Loop; + +use Moose; + +extends 'ManaTools::Shared::disk_backend::Part'; + +with 'ManaTools::Shared::disk_backend::BlockDevice'; + +use MooseX::ClassAttribute; + +class_has '+type' => ( + default => 'Loop' +); + +class_has '+order' => ( + default => sub { + sub { + my $self = shift; + my $part = shift; + return ($self->devicepath() =~ s'^.+/''r cmp $part->devicepath() =~ s'^.+/''r); + } + } +); + +has '+devicepath' => ( + trigger => sub { + my $self = shift; + my $value = shift; + $self->prop_from_file('ro', $value .'/ro'); + $self->prop_from_file('removable', $value .'/removable'); + $self->prop_from_file('size', $value .'/size'); + $self->prop('present', ($self->prop('removable') == 0 || $self->prop('size') > 0) ? 1 : 0); + $self->prop_from_file('dev', $value .'/dev'); + $self->sync_majorminor(); + } +); + + +class_has '+restrictions' => ( + default => sub { + return { + parent => sub { + my $self = shift; + my $part = shift; + return $part->does('ManaTools::Shared::disk_backend::FileRole'); + }, + sibling => sub { + my $self = shift; + my $part = shift; + return $part->isa('ManaTools::Shared::disk_backend::Part::Loop'); + }, + previous => sub { + my $self = shift; + my $part = shift; + return $part->isa('ManaTools::Shared::disk_backend::Part::Loop'); + }, + next => sub { + my $self = shift; + my $part = shift; + return $part->isa('ManaTools::Shared::disk_backend::Part::Loop'); + }, + } + } +); + 1; -- cgit v1.2.1