|
@@ -3208,6 +3208,8 @@ static int cache_save_setup(struct btrfs_block_group_cache *block_group,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+ if (trans->aborted)
|
|
|
+ return 0;
|
|
|
again:
|
|
|
inode = lookup_free_space_inode(root, block_group, path);
|
|
|
if (IS_ERR(inode) && PTR_ERR(inode) != -ENOENT) {
|
|
@@ -3243,6 +3245,20 @@ again:
|
|
|
*/
|
|
|
BTRFS_I(inode)->generation = 0;
|
|
|
ret = btrfs_update_inode(trans, root, inode);
|
|
|
+ if (ret) {
|
|
|
+ /*
|
|
|
+ * So theoretically we could recover from this, simply set the
|
|
|
+ * super cache generation to 0 so we know to invalidate the
|
|
|
+ * cache, but then we'd have to keep track of the block groups
|
|
|
+ * that fail this way so we know we _have_ to reset this cache
|
|
|
+ * before the next commit or risk reading stale cache. So to
|
|
|
+ * limit our exposure to horrible edge cases lets just abort the
|
|
|
+ * transaction, this only happens in really bad situations
|
|
|
+ * anyway.
|
|
|
+ */
|
|
|
+ btrfs_abort_transaction(trans, root, ret);
|
|
|
+ goto out_put;
|
|
|
+ }
|
|
|
WARN_ON(ret);
|
|
|
|
|
|
if (i_size_read(inode) > 0) {
|