[Ocfs2-devel] ocfs2: bug in dlm_process_recovery_data()

Dan Carpenter error27 at gmail.com
Wed Feb 10 02:01:14 PST 2010


On Tue, Feb 09, 2010 at 09:53:01AM -0800, Sunil Mushran wrote:
> Dan Carpenter wrote:
>> I noticed a change was merged to dlm_process_recovery_data() so I  
>> thought you might want to fix this as well.
>>
>> fs/ocfs2/dlm/dlmrecovery.c
>>   1788                                  list_for_each_entry(lock, tmpq, list) {
>>   1789                                          if (lock->ml.cookie != ml->cookie)
>>   1790                                                  lock = NULL;
>>
>> 	We dereference lock in list_for_each_entry().  Maybe you want  
>> 	list_for_each_entry_safe() or something?
>>
>>   1791                                          else
>>   1792                                                  break;
>>   1793                                  }
>>   1794                                  if (lock)
>>   1795                                          break;
>>   
>
> Why? That's only required if we are deleting a list entry.

list_for_each() is defined in include/linux/list.h

/**
 * list_for_each_entry  -       iterate over list of given type
 * @pos:        the type * to use as a loop cursor.
 * @head:       the head for your list.
 * @member:     the name of the list_struct within the struct.
 */
#define list_for_each_entry(pos, head, member)                          \
        for (pos = list_entry((head)->next, typeof(*pos), member);      \
             prefetch(pos->member.next), &pos->member != (head);        \
             pos = list_entry(pos->member.next, typeof(*pos), member))
                              ^^^^^^^^^^^^^^^^

In this case "pos" is "lock" so the code basically is doing this:
lock = NULL;
lock = list_entry(lock->member.next, typeof(*lock), member));
                  ^^^^^^^^^^^^^^^^^
regards,
dan carpenter



More information about the Ocfs2-devel mailing list