aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMaarten Vanraes <alien@mageia.org>2016-05-19 00:55:59 +0200
committerMaarten Vanraes <alien@mageia.org>2016-05-19 00:55:59 +0200
commit49d992fca9963ddaf9c26b0946bbbe4985f83242 (patch)
treeec7fa98e2db828be796300e5e7966d2277164ce5
parent8ba467985f3236abe9a3993dbabcafcf4a6d13df (diff)
downloadmanatools-49d992fca9963ddaf9c26b0946bbbe4985f83242.tar
manatools-49d992fca9963ddaf9c26b0946bbbe4985f83242.tar.gz
manatools-49d992fca9963ddaf9c26b0946bbbe4985f83242.tar.bz2
manatools-49d992fca9963ddaf9c26b0946bbbe4985f83242.tar.xz
manatools-49d992fca9963ddaf9c26b0946bbbe4985f83242.zip
Loop: adjust to new PartLink system
-rw-r--r--lib/ManaTools/Shared/disk_backend/Plugin/Loop.pm103
1 files 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;