rem: if (block->original == NULL) {  panic("unchanged block in transaction!"); continue; }
context: cache_start_sub_transaction(void *_cache, int32 id){	block_cache *cache = (block_cache *)_cache;	BenaphoreLocker locker(&cache->lock);	TRACE(("cache_start_sub_transaction(id = %ld)\n", id));	cache_transaction *transaction = lookup_transaction(cache, id);	if (transaction == NULL) {		panic("cache_start_sub_transaction(): invalid transaction ID\n");		return B_BAD_VALUE;	}	// move all changed blocks up to 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 (transaction->has_sub_transaction && block->parent_data != block->data) {			// there already is an older sub transaction - we acknowledge			// its changes and move its blocks up to the parent			cache->Free(block->parent_data);		}		// we "allocate" the parent data lazily, that means, we don't copy		// the data (and allocate memory for it) until we need to		block->parent_data = block->data;	}	// all subsequent changes will go into the sub transaction	transaction->has_sub_transaction = true;	transaction->sub_num_blocks = 0;	return B_OK;}