diff -r 136d6b9b5a67 -r 8c2cc26d45fc bin/imager.fuse --- a/bin/imager.fuse Mon Jun 18 16:55:10 2012 +0200 +++ b/bin/imager.fuse Mon Aug 27 15:51:22 2012 +0200 @@ -14,6 +14,7 @@ use DB_File; use File::Basename; use Imager; +use Smart::Comments; my %o = ( debug => undef, @@ -38,8 +39,11 @@ sub max { (sort { $a <=> $b } @_)[-1]; } -my $debug = sub { print STDERR @_ }; -$debug = sub { }; + +sub nop_debug { } +sub yes_debug { print STDERR @_ } + +*{main::debug} = \&nop_debug; #$SIG{INT} = sub { warn "Got ^C or INT signal\n"; exit 1; }; @@ -47,7 +51,7 @@ GetOptions( "d|debug!" => \$o{debug}, - "detach!" => \$o{detach}, + "detach!" => \$o{detach}, "tmp:s" => sub { $o{tmp} = length $_[1] ? $_[1] : $ENV{TMP} // "/tmp" }, "h|help" => sub { pod2usage(-verbose => 1, -exit => 0) }, "p|pass=s" => \$o{pass}, @@ -62,6 +66,11 @@ and @ARGV == 2 or pod2usage; + if ($o{debug}) { + undef &{main::debug}; + *{main::debug} = \&yes_debug; + } + my ($src, $mp) = @ARGV; $DATA = "$src/data"; @@ -82,13 +91,14 @@ Fuse::main( mountpoint => $mp, - debug => $o{debug} // 0, - getattr => \&getattr, - getdir => \&getdir, - open => \&openfile, - read => \&readbuffer, - write => \&writebuffer, - release => \&release, + + # debug => $o{debug} // 0, + getattr => \&getattr, + getdir => \&getdir, + open => \&openfile, + read => \&readbuffer, + write => \&writebuffer, + release => \&release, ); exit; @@ -154,7 +164,7 @@ sub release { my $path = $IDX . shift; return 0 if not exists $IMAGE{$path}; - $debug->("Currently we have " . keys(%DIRTY) . " dirty blocks\n"); + debug("Currently we have " . keys(%DIRTY) . " dirty blocks\n"); return 0; } @@ -164,11 +174,16 @@ my $finfo = $IMAGE{$path} or die "File $path is not opened!"; return "" if $offset >= $finfo->{meta}{devsize}; + debug("<<< REQUESTED: offset:$offset size:$size\n"); + my $buffer = ""; for (my $need = $size ; $need > 0 ; $need = $size - length($buffer)) { + debug("<<< offset:@{[$offset + length($buffer)]} size:$need\n"); $buffer .= _readblock($finfo, $need, $offset + length($buffer)); + debug("<<< missing: ", $size - length($buffer), "\n") if $size - length($buffer); } + debug("<<< SENDING " . length($buffer) . "\n\n"); return $buffer; } @@ -176,8 +191,9 @@ my ($finfo, $size, $offset) = @_; my ($block, $blockoffset, $length); - $debug->("<<< block offset:$offset size:$size\n"); - $debug->(" block @{[int($offset/BS)]} + @{[$offset % BS]}\n"); + debug("<<< requested: offset:$offset size:$size" + . "\tfrom $finfo->{meta}{filesystem}\n"); + debug(" mapped to: block:@{[int($offset/BS)]}+@{[$offset % BS]}\n"); # first check if it's an dirty block $block = int($offset / BS); @@ -185,7 +201,7 @@ $blockoffset = $offset % BS; $length = min(BS - $blockoffset, $size); - $debug->( + debug( "+++ dirty offset:$block*@{[BS]} + $blockoffset size:$length\n" ); return substr $DIRTY{ $finfo . $block }, $blockoffset, $length; @@ -207,18 +223,19 @@ } } - $debug->("=== $length\n"); - $debug->( -"+++ disk offset:$block*$finfo->{meta}{blocksize} + $blockoffset size:$length\n" - ); + debug("+++ disk offset:$block*$finfo->{meta}{blocksize}" + . " + $blockoffset size:$length\n"); + +# die if $blockoffset == 417792; my $fn = "$DATA/" . $finfo->{blocklist}{$block}; + debug(" fn:$fn\n"); state %cache; if (not defined $cache{fn} or ($cache{fn} ne $fn)) { - Imager::get_block("$fn*" => \$cache{data}); + Imager::get_block("$fn*" => \$cache{data}); $cache{fn} = $fn; } @@ -253,11 +270,11 @@ $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"); + debug("+++ missing $block+$blockoffset\n"); $DIRTY{ $finfo . $block } = _readblock($finfo, BS, $block * BS); } @@ -274,11 +291,12 @@ while (<$fh>) { last if /^$/; /^(?\S+):\s+(?:(?\d+)|(?.*?))\s*$/ - and do { - # na sowas, die Zeitstempel dürfen nicht als Zeichenkette reinkommen! - $meta{ $+{k} } = defined $+{n} ? (0+$+{n}) : $+{v}; - next; - }; + and do { + + # na sowas, die Zeitstempel dürfen nicht als Zeichenkette reinkommen! + $meta{ $+{k} } = defined $+{n} ? (0 + $+{n}) : $+{v}; + next; + }; } return %meta; }