if (ret)
                goto fail_tree_roots;
 
+       /*
+        * If we have a uuid root and we're not being told to rescan we need to
+        * check the generation here so we can set the
+        * BTRFS_FS_UPDATE_UUID_TREE_GEN bit.  Otherwise we could commit the
+        * transaction during a balance or the log replay without updating the
+        * uuid generation, and then if we crash we would rescan the uuid tree,
+        * even though it was perfectly fine.
+        */
+       if (fs_info->uuid_root && !btrfs_test_opt(fs_info, RESCAN_UUID_TREE) &&
+           fs_info->generation == btrfs_super_uuid_tree_generation(disk_super))
+               set_bit(BTRFS_FS_UPDATE_UUID_TREE_GEN, &fs_info->flags);
+
        ret = btrfs_verify_dev_extents(fs_info);
        if (ret) {
                btrfs_err(fs_info,
                        close_ctree(fs_info);
                        return ret;
                }
-       } else {
-               set_bit(BTRFS_FS_UPDATE_UUID_TREE_GEN, &fs_info->flags);
        }
        set_bit(BTRFS_FS_OPEN, &fs_info->flags);