--- a/bin/imager.fuse Fri Jul 29 14:53:40 2011 +0200
+++ b/bin/imager.fuse Fri Jul 29 15:52:09 2011 +0200
@@ -27,11 +27,16 @@
my ($DATA, $IDX);
sub tie_vars;
-sub min { (sort {$a <=> $b} @_)[0] }
-sub max { (sort {$a <=> $b} @_)[-1] }
+
+sub min {
+ (sort { $a <=> $b } @_)[0];
+}
+
+sub max {
+ (sort { $a <=> $b } @_)[-1];
+}
my $debug = sub { print STDERR @_ };
- $debug = sub { };
-
+$debug = sub { };
#$SIG{INT} = sub { warn "Got ^C or INT signal\n"; exit 1; };
@@ -79,7 +84,7 @@
open => \&openfile,
read => \&readbuffer,
write => \&writebuffer,
- release => \&release,
+ release => \&release,
);
exit;
@@ -143,10 +148,10 @@
}
sub release {
- my $path = $IDX . shift;
- return 0 if not exists $IMAGE{$path};
- $debug->("Currently we have " . keys(%DIRTY) . " dirty blocks\n");
- return 0;
+ my $path = $IDX . shift;
+ return 0 if not exists $IMAGE{$path};
+ $debug->("Currently we have " . keys(%DIRTY) . " dirty blocks\n");
+ return 0;
}
sub readbuffer {
@@ -165,65 +170,69 @@
sub _readblock {
my ($finfo, $size, $offset) = @_;
- my ($block, $blockoffset, $length);
+ my ($block, $blockoffset, $length);
- $debug->("<<< block offset:$offset size:$size\n");
- $debug->( " block @{[int($offset/BS)]} + @{[$offset % BS]}\n");
+ $debug->("<<< block offset:$offset size:$size\n");
+ $debug->(" block @{[int($offset/BS)]} + @{[$offset % BS]}\n");
- # first check if it's an dirty block
- $block = int($offset / BS);
+ # first check if it's an dirty block
+ $block = int($offset / BS);
if (exists $DIRTY{ $finfo . $block }) {
- $blockoffset = $offset % BS;
- $length = min(BS - $blockoffset, $size);
+ $blockoffset = $offset % BS;
+ $length = min(BS - $blockoffset, $size);
- $debug->("+++ dirty offset:$block*@{[BS]} + $blockoffset size:$length\n");
+ $debug->(
+ "+++ dirty offset:$block*@{[BS]} + $blockoffset size:$length\n"
+ );
return substr $DIRTY{ $finfo . $block }, $blockoffset, $length;
}
-
- # if not dirty, we've to find it on disk
+ # if not dirty, we've to find it on disk
- $block = int($offset / $finfo->{meta}{blocksize});
- $blockoffset = $offset % $finfo->{meta}{blocksize};
- $length = min($finfo->{meta}{blocksize} - $blockoffset, $size);
+ $block = int($offset / $finfo->{meta}{blocksize});
+ $blockoffset = $offset % $finfo->{meta}{blocksize};
+ $length = min($finfo->{meta}{blocksize} - $blockoffset, $size);
- # find the max length we can satisfy w/o colliding
- # with dirty blocks
- for (my $l = BS; $l < $length; $l += BS) {
- my $b = int(($offset + $l)/BS);
- if ($DIRTY{$finfo . $b}) {
- $length = $l;
- last;
- }
- }
+ # find the max length we can satisfy w/o colliding
+ # with dirty blocks
+ for (my $l = BS ; $l < $length ; $l += BS) {
+ my $b = int(($offset + $l) / BS);
+ if ($DIRTY{ $finfo . $b }) {
+ $length = $l;
+ last;
+ }
+ }
- $debug->("=== $length\n");
- $debug->("+++ disk offset:$block*$finfo->{meta}{blocksize} + $blockoffset size:$length\n");
+ $debug->("=== $length\n");
+ $debug->(
+"+++ disk offset:$block*$finfo->{meta}{blocksize} + $blockoffset size:$length\n"
+ );
my $fn = "$DATA/" . $finfo->{blocklist}{$block};
- state %cache;
- if (not defined $cache{fn}
- or ($cache{fn} ne $fn)) {
+ state %cache;
+ if (not defined $cache{fn}
+ or ($cache{fn} ne $fn))
+ {
- if (-e $fn) {
- open(my $fh => $fn);
- binmode($fh);
- local $/ = undef;
- $cache{data} = <$fh>;
- }
- elsif (-e "$fn.gz") {
- open(my $fh => "$fn.gz");
- binmode($fh);
- gunzip($fh => \$cache{data})
- or die $GunzipError;
- }
- $cache{fn} = $fn;
- }
+ if (-e $fn) {
+ open(my $fh => $fn);
+ binmode($fh);
+ local $/ = undef;
+ $cache{data} = <$fh>;
+ }
+ elsif (-e "$fn.gz") {
+ open(my $fh => "$fn.gz");
+ binmode($fh);
+ gunzip($fh => \$cache{data})
+ or die $GunzipError;
+ }
+ $cache{fn} = $fn;
+ }
- return substr($cache{data}, $blockoffset, $size);
- die "$fn: $!\n";
-
+ return substr($cache{data}, $blockoffset, $size);
+ die "$fn: $!\n";
+
}
sub writebuffer {
@@ -246,20 +255,19 @@
sub _writeblock {
my ($finfo, $buffer, $offset) = @_;
- my ($block, $blockoffset, $length);
+ my ($block, $blockoffset, $length);
my $size = length($buffer);
- $block = int($offset / BS);
- $blockoffset = $offset % BS;
- $length = min(BS - $blockoffset, $size);
+ $block = int($offset / BS);
+ $blockoffset = $offset % BS;
+ $length = min(BS - $blockoffset, $size);
- $debug->(">>> offset:$offset size:$length of $size\n");
- $debug->(" block @{[int($offset/BS)]} + @{[$offset % BS]}\n");
+ $debug->(">>> offset:$offset size:$length of $size\n");
+ $debug->(" block @{[int($offset/BS)]} + @{[$offset % BS]}\n");
if (not exists $DIRTY{ $finfo . $block }) {
- $debug->("+++ missing $block+$blockoffset\n");
- $DIRTY{ $finfo . $block } = _readblock(
- $finfo, BS, $block * BS);
+ $debug->("+++ missing $block+$blockoffset\n");
+ $DIRTY{ $finfo . $block } = _readblock($finfo, BS, $block * BS);
}
substr($DIRTY{ $finfo . $block }, $blockoffset, $length) =