rem: if (block->original == NULL) {  panic("unchanged block in transaction!"); continue; }
context: cache_abort_sub_transaction(void *_cache, int32 id){	block_cache *cache = (block_cache *)_cache;	BenaphoreLocker locker(&cache->lock);	TRACE(("cache_abort_sub_transaction(id = %ld)\n", id));	cache_transaction *transaction = lookup_transaction(cache, id);	if (transaction == NULL) {		panic("cache_abort_sub_transaction(): invalid transaction ID\n");		return B_BAD_VALUE;	}	if (!transaction->has_sub_transaction)		return B_BAD_VALUE;	// revert all changes back to the version of the parent	cached_block *block = transaction->first_block, *next;	for (; block != NULL; block = next) {		next = block->transaction_next;		if (block->original == NULL) {			// an unchanged block in the transaction?panic("unchanged block in transaction!");			continue;		}		if (block->parent_data != block->data) {			// the block has been changed and must be restored			TRACE(("cache_abort_sub_transaction(id = %ld): restored contents of block %Ld\n",				transaction->id, block->block_number));			memcpy(block->data, block->parent_data, cache->block_size);			cache->Free(block->parent_data);		}		block->parent_data = NULL;	}	// all subsequent changes will go into the main transaction	transaction->has_sub_transaction = false;	return B_OK;}