[PATCH] alpha xchg fix

alpha xchg has to be a macro - alpha disables always_inline and if that
puppy does not get inlined, we immediately blow up on undefined reference.
Happens even on gcc3; with gcc4 that happens a _lot_.

Signed-off-by: Al Viro <viro@parcelfarce.linux.theplanet.co.uk>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

authored by Al Viro and committed by Linus Torvalds 79fb7bdc 531e5ca6

+13 -16
+13 -16
include/asm-alpha/system.h
··· 443 443 if something tries to do an invalid xchg(). */ 444 444 extern void __xchg_called_with_bad_pointer(void); 445 445 446 - static inline unsigned long 447 - __xchg(volatile void *ptr, unsigned long x, int size) 448 - { 449 - switch (size) { 450 - case 1: 451 - return __xchg_u8(ptr, x); 452 - case 2: 453 - return __xchg_u16(ptr, x); 454 - case 4: 455 - return __xchg_u32(ptr, x); 456 - case 8: 457 - return __xchg_u64(ptr, x); 458 - } 459 - __xchg_called_with_bad_pointer(); 460 - return x; 461 - } 446 + #define __xchg(ptr, x, size) \ 447 + ({ \ 448 + unsigned long __xchg__res; \ 449 + volatile void *__xchg__ptr = (ptr); \ 450 + switch (size) { \ 451 + case 1: __xchg__res = __xchg_u8(__xchg__ptr, x); break; \ 452 + case 2: __xchg__res = __xchg_u16(__xchg__ptr, x); break; \ 453 + case 4: __xchg__res = __xchg_u32(__xchg__ptr, x); break; \ 454 + case 8: __xchg__res = __xchg_u64(__xchg__ptr, x); break; \ 455 + default: __xchg_called_with_bad_pointer(); __xchg__res = x; \ 456 + } \ 457 + __xchg__res; \ 458 + }) 462 459 463 460 #define xchg(ptr,x) \ 464 461 ({ \