Note: "permalinks" may not be as permanent as we would like,
direct links of old sources may well be a few messages off.
On Monday 15 June 2009 23:21:51 you wrote: > Hi, > > With the latest patch, things are not working very well at all! > > > It think the problem may lie here: > > > #define put_unaligned(val, ptr) ({ \ > + typeof(val) v; \ > + switch (sizeof(*(ptr))) { \ > + case 1: \ > + *(uint8_t *)(ptr) = (uint8_t)(val); \ > + break; \ > + case 2: \ > + case 4: \ > + case 8: \ > + v = val; \ > + memcpy(ptr, &v, sizeof(*(ptr))); \ > + break; \ > + default: \ > + __bad_unaligned_access_size(); \ > + break; \ > + } \ > + (void)0; }) > + > > > When called with > > put_unaligned(tag, tl->tag_list_cpos++); > > ptr is evaluated in the switch statement, and twice in the memcpy call, > and hence the post-increment will be done three times ....not what we want! > > Maybe an inline function, or taking a copy of ptr if safer here > Hi Nick, No, typeof(), sizeof() do not evaluate the expression at runtime. They just deliver the type or the size at compile time. But in that macro there was an error with the type conversation. I have again, attached a patch, that should fix the issue. Please verify. -- : Dipl-Ing Philipp Reisner : LINBIT | Your Way to High Availability : Tel: +43-1-8178292-50, Fax: +43-1-8178292-82 : http://www.linbit.com DRBD(R) and LINBIT(R) are registered trademarks of LINBIT, Austria. -------------- next part -------------- A non-text attachment was scrubbed... Name: fix_for_unaligned_access3.diff Type: text/x-patch Size: 1377 bytes Desc: not available URL: <http://lists.linbit.com/pipermail/drbd-user/attachments/20090616/6d468865/attachment.bin>