diff options
Diffstat (limited to 'fs/btrfs/inode-map.c')
| -rw-r--r-- | fs/btrfs/inode-map.c | 25 | 
1 files changed, 14 insertions, 11 deletions
diff --git a/fs/btrfs/inode-map.c b/fs/btrfs/inode-map.c index ee15d88b33d2..b1a1c929ba80 100644 --- a/fs/btrfs/inode-map.c +++ b/fs/btrfs/inode-map.c @@ -178,7 +178,7 @@ static void start_caching(struct btrfs_root *root)  	tsk = kthread_run(caching_kthread, root, "btrfs-ino-cache-%llu\n",  			  root->root_key.objectid); -	BUG_ON(IS_ERR(tsk)); +	BUG_ON(IS_ERR(tsk)); /* -ENOMEM */  }  int btrfs_find_free_ino(struct btrfs_root *root, u64 *objectid) @@ -271,7 +271,7 @@ void btrfs_unpin_free_ino(struct btrfs_root *root)  			break;  		info = rb_entry(n, struct btrfs_free_space, offset_index); -		BUG_ON(info->bitmap); +		BUG_ON(info->bitmap); /* Logic error */  		if (info->offset > root->cache_progress)  			goto free; @@ -439,17 +439,16 @@ int btrfs_save_ino_cache(struct btrfs_root *root,  	if (ret)  		goto out;  	trace_btrfs_space_reservation(root->fs_info, "ino_cache", -				      (u64)(unsigned long)trans, -				      trans->bytes_reserved, 1); +				      trans->transid, trans->bytes_reserved, 1);  again:  	inode = lookup_free_ino_inode(root, path); -	if (IS_ERR(inode) && PTR_ERR(inode) != -ENOENT) { +	if (IS_ERR(inode) && (PTR_ERR(inode) != -ENOENT || retry)) {  		ret = PTR_ERR(inode);  		goto out_release;  	}  	if (IS_ERR(inode)) { -		BUG_ON(retry); +		BUG_ON(retry); /* Logic error */  		retry = true;  		ret = create_free_ino_inode(root, trans, path); @@ -460,12 +459,17 @@ again:  	BTRFS_I(inode)->generation = 0;  	ret = btrfs_update_inode(trans, root, inode); -	WARN_ON(ret); +	if (ret) { +		btrfs_abort_transaction(trans, root, ret); +		goto out_put; +	}  	if (i_size_read(inode) > 0) {  		ret = btrfs_truncate_free_space_cache(root, trans, path, inode); -		if (ret) +		if (ret) { +			btrfs_abort_transaction(trans, root, ret);  			goto out_put; +		}  	}  	spin_lock(&root->cache_lock); @@ -502,8 +506,7 @@ out_put:  	iput(inode);  out_release:  	trace_btrfs_space_reservation(root->fs_info, "ino_cache", -				      (u64)(unsigned long)trans, -				      trans->bytes_reserved, 0); +				      trans->transid, trans->bytes_reserved, 0);  	btrfs_block_rsv_release(root, trans->block_rsv, trans->bytes_reserved);  out:  	trans->block_rsv = rsv; @@ -532,7 +535,7 @@ static int btrfs_find_highest_objectid(struct btrfs_root *root, u64 *objectid)  	ret = btrfs_search_slot(NULL, root, &search_key, path, 0, 0);  	if (ret < 0)  		goto error; -	BUG_ON(ret == 0); +	BUG_ON(ret == 0); /* Corruption */  	if (path->slots[0] > 0) {  		slot = path->slots[0] - 1;  		l = path->nodes[0];  |