# define __releases(x) __attribute__((context(1,0)))
 # define __acquire(x)  __context__(1)
 # define __release(x)  __context__(-1)
-# define __cond_lock(x)        ((x) ? ({ __context__(1); 1; }) : 0)
+# define __cond_lock(x,c)      ((c) ? ({ __acquire(x); 1; }) : 0)
 extern void __chk_user_ptr(void __user *);
 extern void __chk_io_ptr(void __iomem *);
 #else
 # define __releases(x)
 # define __acquire(x) (void)0
 # define __release(x) (void)0
-# define __cond_lock(x) (x)
+# define __cond_lock(x,c) (c)
 #endif
 
 #ifdef __KERNEL__
 
  * regardless of whether CONFIG_SMP or CONFIG_PREEMPT are set. The various
  * methods are defined as nops in the case they are not required.
  */
-#define spin_trylock(lock)             __cond_lock(_spin_trylock(lock))
-#define read_trylock(lock)             __cond_lock(_read_trylock(lock))
-#define write_trylock(lock)            __cond_lock(_write_trylock(lock))
+#define spin_trylock(lock)             __cond_lock(lock, _spin_trylock(lock))
+#define read_trylock(lock)             __cond_lock(lock, _read_trylock(lock))
+#define write_trylock(lock)            __cond_lock(lock, _write_trylock(lock))
 
 #define spin_lock(lock)                        _spin_lock(lock)
 
                                        _write_unlock_irqrestore(lock, flags)
 #define write_unlock_bh(lock)          _write_unlock_bh(lock)
 
-#define spin_trylock_bh(lock)          __cond_lock(_spin_trylock_bh(lock))
+#define spin_trylock_bh(lock)  __cond_lock(lock, _spin_trylock_bh(lock))
 
 #define spin_trylock_irq(lock) \
 ({ \
  */
 extern int _atomic_dec_and_lock(atomic_t *atomic, spinlock_t *lock);
 #define atomic_dec_and_lock(atomic, lock) \
-               __cond_lock(_atomic_dec_and_lock(atomic, lock))
+               __cond_lock(lock, _atomic_dec_and_lock(atomic, lock))
 
 /**
  * spin_can_lock - would spin_trylock() succeed?