[parted-devel] Possible Race Condition using test code, libparted, and Fedora 12

Curtis Gedak gedakc at gmail.com
Thu Jan 28 16:11:41 UTC 2010


Hi Petr,

Petr Uzel wrote:
> On Wed, Jan 27, 2010 at 01:51:11PM -0700, Curtis Gedak wrote:
>   
>> diff --git a/libparted/arch/linux.c b/libparted/arch/linux.c
>> index aefe788..1147b1e 100644
>> --- a/libparted/arch/linux.c
>> +++ b/libparted/arch/linux.c
>> @@ -2518,12 +2518,14 @@ static int
>> _kernel_reread_part_table (PedDevice* dev)
>> {
>>         LinuxSpecific*  arch_specific = LINUX_SPECIFIC (dev);
>> -        int             retry_count = 5;
>> +        int             retry_count = 9;
>>
>>         sync();
>>         while (ioctl (arch_specific->fd, BLKRRPART)) {
>>                 retry_count--;
>>                 sync();
>> +                if (retry_count == 3)
>>     
>
>                    ^^^^^^^^^^^^^^^^^^^^^
> Don't you mean something like 'if (retry_count % 3 == 0)' 
> instead? That would pause on the 3rd, 6th and 9th (last) iteration.
>   

My original patch did try to do something like you suggest.  After 
analyzing the patch, I realized that it only paused once in all of the 
10 iterations.  This single pause was sufficient to catch all of the 
"failed to inform kernel of partition changes" problems that occurred 
during my testing.

Hence this time I did intend that the code only pause once for 1 
second.  :-)

My thoughts are that 1 second is a very long time for a computer.  If 
more than an single 1 second pause is used, then in my opinion this 
would unnecessarily increase the amount of time required until the call 
would finally fail.  For example this function call would still fail 
when used on a device with at least one partition mounted.  I did not 
want this to creep up to 2 or 3 seconds without significant benefits to 
the user.

In many ways this patch is a balancing act between having the system do 
the right thing, and not making a user wait unnecessarily.

>   
>> +                        sleep(1); /* Pause to allow system to settle */
>>                 if (!retry_count) {
>>                         ped_exception_throw (
>>                                 PED_EXCEPTION_WARNING,
>>
>>     
Regards,
Curtis Gedak



More information about the parted-devel mailing list