[Ocfs2-tools-devel] [PATCH 2/2] looped chain - Break loop in fsck

tristan ye tristan.ye at oracle.com
Fri Mar 5 16:31:21 PST 2010



Goldwyn Rodrigues wrote:
> Hi Tristan,
>
>
> On Fri, Mar 5, 2010 at 8:44 AM, tristan ye <tristan.ye at oracle.com> wrote:
>
> <snip>
>
>   
>>> Now you are trying to cover up your mistake ;)
>>>
>>>       
>> Yes, the previous codes has not been tested well, it's nothing realistic but
>> a  concept I guess. while the latest one I pasted last time is workable
>> under testing, is there still any mistakes?
>>
>>     
>
> No, there are no mistakes that I can tell in the linked list implementation.
>   

Hi Goldwyn,

Yeah, the attachment of codes I pasted was trial, it however, is 
runnable for testing things, though was not based on ocfs2-tools:)

>
>   
>>> I fully understand the algorithm and the algorithm posted on the
>>> various internet sites are correct. For that matter, if you know the
>>> loop is large enough, using relatively prime number of hops will help
>>> you achieve the "meeting point" faster.
>>>
>>> It is *your implementation* of the algorithm I am not willing to agree
>>> with.
>>>
>>>       
>> Hi Goldwyn,
>>
>> Thanks for your patient follow-up on this issue:)
>>
>> I admit that previous code skeleton pasted by has mistakes, it's just a
>> rough solution to illustrate my general idea against the algorithm. and I've
>> not tested it in a real env. However, the last code I pasted was feasible
>> under testing by your cases. Do you think it's still a unrealistic one?
>>
>>     
>
> No. For that matter, I never thought or stated it was unrealistic. I
> was pointing out flaws in your implementation (which I misstated as
> your algorithm)
>   

Thank you so much for finding out the flaws in my previous mail.

>
>   
>> Let me know if you have some other suggestions on it.
>>     
>>>       
>>>> The code skeleton works for me now as follows:
>>>>
>>>> int detect_loop(struct link_node *head, int breakage)
>>>> {
>>>>      struct link_node *fast, *slow, *prev;
>>>>      int looped = 0;
>>>>
>>>>      prev = fast = slow = head;
>>>>
>>>>      while (1) {
>>>>              if (fast && fast->next)
>>>>                      fast = fast->next->next;
>>>>              else
>>>>                      return looped;
>>>>
>>>>              prev = slow;
>>>>              slow = slow->next;
>>>>
>>>>              if (fast == slow) {
>>>>                      looped = 1;
>>>>                      break;
>>>>              }
>>>>      }
>>>>
>>>>      if (looped && breakage) {
>>>>
>>>>              fast = head;
>>>>              while (fast != slow) {
>>>>                      prev = slow;
>>>>                      slow = slow->next;
>>>>                      fast = fast->next;
>>>>              }
>>>>
>>>>         
>>> You have changed (corrected) this! In analogy  to your previous
>>> posting, fast=slow->next, which is causing the infinite loop.
>>>
>>> For your convenince, I will paste it again:
>>>
>>>
>>>       
>>>>>>>>  while (blkno != slow) {
>>>>>>>>   blkno = get_group_desc_next(ost, blkno, buf);
>>>>>>>>   slow = get_group_desc_next(ost, blkno, buf);
>>>>>>>>  }
>>>>>>>>
>>>>>>>>                 
>>> I would appreciate if you would post the correct implementation for
>>> the good audit.
>>> I understand what you are trying to do and I agree the algorithm is
>>> much better with respect to time and space efficiency. However, if it
>>> does not run correctly, it is not acceptable.
>>>
>>> Please post the final patch with respect to ocfs2-tools.
>>>
>>>       
>> I can post the final patch regarding ocfs2-tools if you have no objection
>> against my above algorithm which is feasible in a experimental env.
>>     
>
> I have no objections to the algorithm, I might have to the implementation ;)
>   

Cool, waiting for your next patch, thank you for the hard work again:)



Tristan.

>
>   



More information about the Ocfs2-tools-devel mailing list