bin/imager.fuse
changeset 35 bbdb8ea3079a
parent 32 02ef2d1b190a
child 36 f361d688365c
--- 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) =