btrfs-image: fix reading the super block on big metadata blocks
authorChris Mason <chris.mason@fusionio.com>
Fri, 3 May 2013 20:18:46 +0000 (16:18 -0400)
committerChris Mason <chris.mason@fusionio.com>
Fri, 3 May 2013 20:18:46 +0000 (16:18 -0400)
btrfs-image is assuming that every metadata block is the same size.  The
super is a special snowflake though.  It's 4K even on 64K filesystems.

Signed-off-by: Chris Mason <chris.mason@fusionio.com>
btrfs-image.c

index 188291c..739ae35 100644 (file)
@@ -506,7 +506,8 @@ static int flush_pending(struct metadump_struct *md, int done)
                }
 
                while (!md->data && size > 0) {
-                       eb = read_tree_block(md->root, start, blocksize, 0);
+                       u64 this_read = min(blocksize, size);
+                       eb = read_tree_block(md->root, start, this_read, 0);
                        if (!eb) {
                                free(async->buffer);
                                free(async);
@@ -516,9 +517,9 @@ static int flush_pending(struct metadump_struct *md, int done)
                        }
                        copy_buffer(async->buffer + offset, eb);
                        free_extent_buffer(eb);
-                       start += blocksize;
-                       offset += blocksize;
-                       size -= blocksize;
+                       start += this_read;
+                       offset += this_read;
+                       size -= this_read;
                }
 
                md->pending_start = (u64)-1;