[Ocfs2-devel] [PATCH 1/1] OCFS2: don't leave free'd mle attached to hb events
Wengang Wang
wen.gang.wang at oracle.com
Mon Dec 7 17:43:51 PST 2009
Hi Sunil,
Sunil Mushran wrote:
> NAK
>
> wengang wang wrote:
>> don't leave free'd mle attached to hb events.
>> in dlm_add_migration_mle() the mle is attched to "heartbeat
>> events" anyway no
>> matter there is an existing mle with same name(returns -EEXIST).
>> dlm_migrate_lockres() calls dlm_add_migration_mle(). in case the later
>> function
>> returning -EEXIST, dlm_migrate_lockres() frees the (new) mle without
>> detaching
>> it from "hb events". so that later "hb events" related operations
>> could improperly
>> operate against wrong mle objects or against an invalid memory address.
>
> The mle is attached to hb events in dlm_init_mle() which is not called
> if it returns -EEXIST. When it returns -EEXIST, oldmle is set to the
> existing mle and its refcounting is handled correctly. mle is not touched
> and thus only needs to be freed.
>
Maybe I am wrong. but are you sure dlm_init_mle() is not called when it
returns -EEXIST?
in code, it doesn't return immediately after setting ret with -EEXIST,
but continue to call
dlm_init_mle();
and then
mle->new_master = new_master;
Maybe I am wrong somewhere?
simplified code pasted here:
3098 static int dlm_add_migration_mle(struct dlm_ctxt *dlm,
3099 struct dlm_lock_resource *res,
3100 struct dlm_master_list_entry *mle,
3101 struct dlm_master_list_entry **oldmle,
3102 const char *name, unsigned int
namelen,
3103 u8 new_master, u8 master)
3104 {
3116 found = dlm_find_mle(dlm, oldmle, (char *)name, namelen);
3117 if (found) {
3118 struct dlm_master_list_entry *tmp = *oldmle;
3120 if (tmp->type == DLM_MLE_MIGRATION) {
3121 if (master == dlm->node_num) {
3126 ret = -EEXIST;
3127 } else {
3136 BUG();
3137 }
3138 } else {
....
3151 }
3153 }
3154
3156 dlm_init_mle(mle, DLM_MLE_MIGRATION, dlm, res, name, namelen);
3157 mle->new_master = new_master;
......
3163 __dlm_insert_mle(dlm, mle);
3164
3165 return ret;
3166 }
regards,
wengang.
More information about the Ocfs2-devel
mailing list