Btrfs puts the filesystem metadata into its own address space, and
somehow the block device address space isn't getting onto disk properly
before a mount.  The end result is that a loop of mkfs and mounting the
filesystem will sometimes find stale or incorrect data.
This commit should fix it by sprinkling fdatawrites and invalidate_bdev
calls around.  This is a short term measure to make sure it is fixed.
The block devices really should be flushed and cleaned up higher in the
stack.
Signed-off-by: Chris Mason <chris.mason@oracle.com>
        __setup_root(4096, 4096, 4096, 4096, tree_root,
                     fs_info, BTRFS_ROOT_TREE_OBJECTID);
 
+       invalidate_bdev(fs_devices->latest_bdev);
        bh = btrfs_read_dev_super(fs_devices->latest_bdev);
        if (!bh) {
                err = -EINVAL;
 
                        printk(KERN_INFO "open %s failed\n", device->name);
                        goto error;
                }
+               filemap_write_and_wait(bdev->bd_inode->i_mapping);
+               invalidate_bdev(bdev);
                set_blocksize(bdev, 4096);
 
                bh = btrfs_read_dev_super(bdev);
                }
 
                set_blocksize(bdev, 4096);
+               invalidate_bdev(bdev);
                bh = btrfs_read_dev_super(bdev);
                if (!bh) {
                        ret = -EINVAL;