[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