[lvm-devel] Re: [PATCH 2 of 10] LVM: make log_area a list

Jonathan Brassow jbrassow at redhat.com
Tue Oct 13 21:28:33 UTC 2009


On Oct 12, 2009, at 8:48 PM, malahal at us.ibm.com wrote:

> Jonathan Brassow [jbrassow at redhat.com] wrote:
>> Patch name: lvm-make-log_area-a-list.patch
>>
>> The 'alloc_handle' structure only has space for one log_area.
>> We change that to a list to allow an arbitrary number of
>> log areas.
>>
>> RFC: Jonathan Brassow <jbrassow at redhat.com>
>>
>> @@ -1061,10 +1065,14 @@ static int _find_parallel_space(struct a
>> 				continue;	/* Next PV */
>>
>> 			if (alloc != ALLOC_ANYWHERE) {
>> -				/* Don't allocate onto the log pv */
>> -				if (ah->log_count &&
>> -				    pvm->pv == ah->log_area.pv)
>> -					continue;	/* Next PV */
>> +				/* Don't allocate onto the log pvs */
>> +				dm_list_iterate_items(aa, &ah->log_areas)
>> +					if (pvm->pv == aa->pv)
>> +						skip = 1;
>
>                                       You can 'break' soon after  
> setting skip.

If I use 'break' won't that break out of the 'dm_list_iterate_items'  
and not the enclosing loop - giving an incorrect result?

>
>> @@ -1199,6 +1208,7 @@ static int _allocate(struct alloc_handle
>> 	struct dm_list *pvms;
>> 	uint32_t areas_size;
>> 	alloc_policy_t alloc;
>> +	struct alloced_area *aa;
>>
>> 	if (allocated >= new_extents && !ah->log_count) {
>> 		log_error("_allocate called with no work to do!");
>> @@ -1264,12 +1274,13 @@ static int _allocate(struct alloc_handle
>> 		goto out;
>> 	}
>>
>> -	if (ah->log_count && !ah->log_area.len) {
>> -		log_error("Insufficient extents for log allocation "
>> -			  "for logical volume %s.",
>> -			  lv ? lv->name : "");
>> -		goto out;
>> -	}
>> +	dm_list_iterate_items(aa, &ah->log_areas)
>> +		if (ah->log_count && !aa->len) {
>
> ah->log_count can be checked outside of the list iterate.

I thought the code looked ugly with three levels of indentation; but  
yes, I think that could save some cycles.  (I've changed it in my  
local patch.)

>
>> +			log_error("Insufficient extents for log allocation "
>> +				  "for logical volume %s.",
>> +				  lv ? lv->name : "");
>> +			goto out;
>> +		}
>> int lv_add_log_segment(struct alloc_handle *ah, struct  
>> logical_volume *log_lv)
>> {
>> 	struct lv_segment *seg;
>> +	struct alloced_area *log_area;
>> +
>> +	dm_list_iterate_items(log_area, &ah->log_areas)
>> +		break;
>
>        Using the list iterator to get the first element looks odd!
> 	Should we use dm_list_first and dm_list_item? Or just have
> 	dm_list_first_item()???

I thought the same thing.  :)  Perhaps I should introduce another  
patch adding that macro...

  brassow




More information about the lvm-devel mailing list