@@ -2794,13 +2794,19 @@ again:
if (i_size_read(inode) > 0) {
ret = btrfs_truncate_free_space_cache(root, trans, path,
inode);
- if (ret)
+ if (ret) {
+ printk(KERN_ERR "truncate free space cache failed for %llu, %d\n",
+ block_group->key.objectid, ret);
goto out_put;
+ }
}
spin_lock(&block_group->lock);
if (block_group->cached != BTRFS_CACHE_FINISHED) {
+ /* Not cached, don't bother trying to write something out */
+ block_group->disk_cache_state = BTRFS_DC_WRITTEN;
spin_unlock(&block_group->lock);
+ printk(KERN_ERR "block group %llu not cached\n", block_group->key.objectid);
goto out_put;
}
spin_unlock(&block_group->lock);
@@ -2820,13 +2826,20 @@ again:
num_pages *= PAGE_CACHE_SIZE;
ret = btrfs_check_data_free_space(inode, num_pages);
- if (ret)
+ if (ret) {
+ printk(KERN_ERR "not enough free space for cache %llu\n", block_group->key.objectid);
goto out_put;
+ }
ret = btrfs_prealloc_file_range_trans(inode, trans, 0, 0, num_pages,
num_pages, num_pages,
&alloc_hint);
btrfs_free_reserved_data_space(inode, num_pages);
+ if (!ret) {
+ spin_lock(&block_gruop->lock);
+ block_group->disk_cache_state = BTRFS_DC_SETUP;
+ spin_unlock(&block_group->lock);
+ }
out_put:
iput(inode);
out_free:
@@ -2835,8 +2848,6 @@ out:
spin_lock(&block_group->lock);
if (ret)
block_group->disk_cache_state = BTRFS_DC_ERROR;
- else
- block_group->disk_cache_state = BTRFS_DC_SETUP;
spin_unlock(&block_group->lock);
return ret;
@@ -290,7 +290,7 @@ int load_free_space_cache(struct btrfs_fs_info *fs_info,
(unsigned long long)BTRFS_I(inode)->generation,
(unsigned long long)generation,
(unsigned long long)block_group->key.objectid);
- goto out;
+ goto free_cache;
}
if (!num_entries)
@@ -511,6 +511,8 @@ int btrfs_write_out_cache(struct btrfs_root *root,
spin_lock(&block_group->lock);
if (block_group->disk_cache_state < BTRFS_DC_SETUP) {
spin_unlock(&block_group->lock);
+ printk(KERN_ERR "block group %llu, wrong dcs %d\n", block_group->key.objectid,
+ block_group->disk_cache_state);
return 0;
}
spin_unlock(&block_group->lock);
@@ -520,6 +522,13 @@ int btrfs_write_out_cache(struct btrfs_root *root,
return 0;
if (!i_size_read(inode)) {
+ printk(KERN_ERR "no allocated space for block group %llu\n", block_group->key.objectid);
+ iput(inode);
+ return 0;
+ }
+
+ node = rb_first(&block_group->free_space_offset);
+ if (!node) {
iput(inode);
return 0;
}
@@ -543,10 +552,6 @@ int btrfs_write_out_cache(struct btrfs_root *root,
*/
first_page_offset = (sizeof(u32) * num_checksums) + sizeof(u64);
- node = rb_first(&block_group->free_space_offset);
- if (!node)
- goto out_free;
-
/*
* Lock all pages first so we can lock the extent safely.
*
@@ -771,6 +776,7 @@ out_free:
block_group->disk_cache_state = BTRFS_DC_ERROR;
spin_unlock(&block_group->lock);
BTRFS_I(inode)->generation = 0;
+ printk(KERN_ERR "problem writing out block group cache for %llu\n", block_group->key.objectid);
}
kfree(checksums);
btrfs_update_inode(trans, root, inode);