Btrfs: check for a null fs root when writing to the backup root log
authorChris Mason <chris.mason@oracle.com>
Sun, 6 Nov 2011 23:50:56 +0000 (18:50 -0500)
committerChris Mason <chris.mason@oracle.com>
Sun, 6 Nov 2011 23:50:56 +0000 (18:50 -0500)
During log replay, can commit the transaction before the fs_root
pointers are setup, so we have to make sure they are not null before
trying to use them.

Signed-off-by: Chris Mason <chris.mason@oracle.com>
fs/btrfs/disk-io.c

index e532892..e53a5bb 100644 (file)
@@ -1754,11 +1754,18 @@ static void backup_super_roots(struct btrfs_fs_info *info)
        btrfs_set_backup_extent_root_level(root_backup,
                               btrfs_header_level(info->extent_root->node));
 
-       btrfs_set_backup_fs_root(root_backup, info->fs_root->node->start);
-       btrfs_set_backup_fs_root_gen(root_backup,
+       /*
+        * we might commit during log recovery, which happens before we set
+        * the fs_root.  Make sure it is valid before we fill it in.
+        */
+       if (info->fs_root && info->fs_root->node) {
+               btrfs_set_backup_fs_root(root_backup,
+                                        info->fs_root->node->start);
+               btrfs_set_backup_fs_root_gen(root_backup,
                               btrfs_header_generation(info->fs_root->node));
-       btrfs_set_backup_fs_root_level(root_backup,
+               btrfs_set_backup_fs_root_level(root_backup,
                               btrfs_header_level(info->fs_root->node));
+       }
 
        btrfs_set_backup_dev_root(root_backup, info->dev_root->node->start);
        btrfs_set_backup_dev_root_gen(root_backup,