diff -u --recursive --new-file pre5/linux/fs/buffer.c linux/fs/buffer.c --- pre5/linux/fs/buffer.c Mon Jul 9 21:34:02 2001 +++ linux/fs/buffer.c Mon Jul 9 21:33:29 2001 @@ -71,8 +71,16 @@ #define BH_ENTRY(list) list_entry((list), struct buffer_head, b_inode_buffers) -#define get_bh(bh) atomic_inc(&(bh)->b_count) -#define put_bh(bh) atomic_dec(&(bh)->b_count) +static inline void get_bh(struct buffer_head * bh) +{ + atomic_inc(&(bh)->b_count); +} + +static inline void put_bh(struct buffer_head *bh) +{ + smp_mb__before_atomic_dec(); + atomic_dec(&bh->b_count); +} /* * Hash table gook.. diff -u --recursive --new-file pre5/linux/include/asm-alpha/atomic.h linux/include/asm-alpha/atomic.h --- pre5/linux/include/asm-alpha/atomic.h Sun Nov 12 19:27:11 2000 +++ linux/include/asm-alpha/atomic.h Mon Jul 9 21:27:45 2001 @@ -106,4 +106,9 @@ #define atomic_inc(v) atomic_add(1,(v)) #define atomic_dec(v) atomic_sub(1,(v)) +#define smp_mb__before_atomic_dec() smp_mb() +#define smp_mb__after_atomic_dec() smp_mb() +#define smp_mb__before_atomic_inc() smp_mb() +#define smp_mb__after_atomic_inc() smp_mb() + #endif /* _ALPHA_ATOMIC_H */ diff -u --recursive --new-file pre5/linux/include/asm-i386/atomic.h linux/include/asm-i386/atomic.h --- pre5/linux/include/asm-i386/atomic.h Tue Jul 3 15:42:54 2001 +++ linux/include/asm-i386/atomic.h Mon Jul 9 21:32:02 2001 @@ -195,4 +195,10 @@ __asm__ __volatile__(LOCK "orl %0,%1" \ : : "r" (mask),"m" (*addr) : "memory") +/* Atomic operations are already serializing on x86 */ +#define smp_mb__before_atomic_dec() barrier() +#define smp_mb__after_atomic_dec() barrier() +#define smp_mb__before_atomic_inc() barrier() +#define smp_mb__after_atomic_inc() barrier() + #endif diff -u --recursive --new-file pre5/linux/include/asm-ia64/atomic.h linux/include/asm-ia64/atomic.h --- pre5/linux/include/asm-ia64/atomic.h Mon Oct 9 17:54:57 2000 +++ linux/include/asm-ia64/atomic.h Mon Jul 9 21:30:19 2001 @@ -91,4 +91,10 @@ #define atomic_inc(v) atomic_add(1, (v)) #define atomic_dec(v) atomic_sub(1, (v)) +/* Atomic operations are already serializing */ +#define smp_mb__before_atomic_dec() barrier() +#define smp_mb__after_atomic_dec() barrier() +#define smp_mb__before_atomic_inc() barrier() +#define smp_mb__after_atomic_inc() barrier() + #endif /* _ASM_IA64_ATOMIC_H */ diff -u --recursive --new-file pre5/linux/include/asm-m68k/atomic.h linux/include/asm-m68k/atomic.h --- pre5/linux/include/asm-m68k/atomic.h Fri Nov 20 11:43:55 1998 +++ linux/include/asm-m68k/atomic.h Mon Jul 9 21:30:19 2001 @@ -49,4 +49,10 @@ #define atomic_set_mask(mask, v) \ __asm__ __volatile__("orl %1,%0" : "=m" (*v) : "id" (mask),"0"(*v)) +/* Atomic operations are already serializing */ +#define smp_mb__before_atomic_dec() barrier() +#define smp_mb__after_atomic_dec() barrier() +#define smp_mb__before_atomic_inc() barrier() +#define smp_mb__after_atomic_inc() barrier() + #endif /* __ARCH_M68K_ATOMIC __ */ diff -u --recursive --new-file pre5/linux/include/asm-mips/atomic.h linux/include/asm-mips/atomic.h --- pre5/linux/include/asm-mips/atomic.h Mon Jul 2 13:56:40 2001 +++ linux/include/asm-mips/atomic.h Mon Jul 9 21:30:19 2001 @@ -272,6 +272,12 @@ * Currently not implemented for MIPS. */ +/* Atomic operations are already serializing */ +#define smp_mb__before_atomic_dec() barrier() +#define smp_mb__after_atomic_dec() barrier() +#define smp_mb__before_atomic_inc() barrier() +#define smp_mb__after_atomic_inc() barrier() + #endif /* defined(__KERNEL__) */ #endif /* __ASM_ATOMIC_H */ diff -u --recursive --new-file pre5/linux/include/asm-mips64/atomic.h linux/include/asm-mips64/atomic.h --- pre5/linux/include/asm-mips64/atomic.h Mon Jul 9 21:34:02 2001 +++ linux/include/asm-mips64/atomic.h Mon Jul 9 21:30:19 2001 @@ -183,6 +183,12 @@ * atomic_add_negative is currently not implemented for mips64. */ +/* Atomic operations are already serializing */ +#define smp_mb__before_atomic_dec() barrier() +#define smp_mb__after_atomic_dec() barrier() +#define smp_mb__before_atomic_inc() barrier() +#define smp_mb__after_atomic_inc() barrier() + #endif /* defined(__KERNEL__) */ #endif /* _ASM_ATOMIC_H */ diff -u --recursive --new-file pre5/linux/include/asm-ppc/atomic.h linux/include/asm-ppc/atomic.h --- pre5/linux/include/asm-ppc/atomic.h Mon May 21 15:02:06 2001 +++ linux/include/asm-ppc/atomic.h Mon Jul 9 21:27:13 2001 @@ -111,4 +111,9 @@ return t; } +#define smp_mb__before_atomic_dec() smp_mb() +#define smp_mb__after_atomic_dec() smp_mb() +#define smp_mb__before_atomic_inc() smp_mb() +#define smp_mb__after_atomic_inc() smp_mb() + #endif /* _ASM_PPC_ATOMIC_H_ */ diff -u --recursive --new-file pre5/linux/include/asm-s390/atomic.h linux/include/asm-s390/atomic.h --- pre5/linux/include/asm-s390/atomic.h Wed Apr 11 19:02:28 2001 +++ linux/include/asm-s390/atomic.h Mon Jul 9 21:27:45 2001 @@ -170,5 +170,10 @@ atomic_set(where,(to));\ } +#define smp_mb__before_atomic_dec() smp_mb() +#define smp_mb__after_atomic_dec() smp_mb() +#define smp_mb__before_atomic_inc() smp_mb() +#define smp_mb__after_atomic_inc() smp_mb() + #endif /* __ARCH_S390_ATOMIC __ */ diff -u --recursive --new-file pre5/linux/include/asm-s390x/atomic.h linux/include/asm-s390x/atomic.h --- pre5/linux/include/asm-s390x/atomic.h Wed Apr 11 19:02:29 2001 +++ linux/include/asm-s390x/atomic.h Mon Jul 9 21:27:45 2001 @@ -170,5 +170,9 @@ atomic_set(where,(to));\ } -#endif /* __ARCH_S390_ATOMIC __ */ +#define smp_mb__before_atomic_dec() smp_mb() +#define smp_mb__after_atomic_dec() smp_mb() +#define smp_mb__before_atomic_inc() smp_mb() +#define smp_mb__after_atomic_inc() smp_mb() +#endif /* __ARCH_S390_ATOMIC __ */ diff -u --recursive --new-file pre5/linux/include/asm-sparc/atomic.h linux/include/asm-sparc/atomic.h --- pre5/linux/include/asm-sparc/atomic.h Sun Mar 25 18:14:21 2001 +++ linux/include/asm-sparc/atomic.h Mon Jul 9 21:32:02 2001 @@ -100,6 +100,12 @@ #define atomic_add_negative(i, v) (__atomic_add((i), (v)) < 0) +/* Atomic operations are already serializing */ +#define smp_mb__before_atomic_dec() barrier() +#define smp_mb__after_atomic_dec() barrier() +#define smp_mb__before_atomic_inc() barrier() +#define smp_mb__after_atomic_inc() barrier() + #endif /* !(__KERNEL__) */ #endif /* !(__ARCH_SPARC_ATOMIC__) */ diff -u --recursive --new-file pre5/linux/include/asm-sparc64/atomic.h linux/include/asm-sparc64/atomic.h --- pre5/linux/include/asm-sparc64/atomic.h Tue Oct 10 10:33:52 2000 +++ linux/include/asm-sparc64/atomic.h Mon Jul 9 21:32:02 2001 @@ -29,4 +29,10 @@ #define atomic_inc(v) ((void)__atomic_add(1, v)) #define atomic_dec(v) ((void)__atomic_sub(1, v)) +/* Atomic operations are already serializing */ +#define smp_mb__before_atomic_dec() barrier() +#define smp_mb__after_atomic_dec() barrier() +#define smp_mb__before_atomic_inc() barrier() +#define smp_mb__after_atomic_inc() barrier() + #endif /* !(__ARCH_SPARC64_ATOMIC__) */