From eeb161d0bf79a2e66cbe17356ea066d60bc0f059 Mon Sep 17 00:00:00 2001
From: Matthew Wilcox <matthew@wil.cx>
Date: Sun, 27 Jan 2008 19:25:57 -0500
Subject: [PATCH] blackfin: Implement down_killable

Signed-off-by: Matthew Wilcox <matthew@wil.cx>
---
 arch/blackfin/kernel/bfin_ksyms.c |    1 +
 include/asm-blackfin/semaphore.h  |   11 +++++++++++
 2 files changed, 12 insertions(+), 0 deletions(-)

diff --git a/arch/blackfin/kernel/bfin_ksyms.c b/arch/blackfin/kernel/bfin_ksyms.c
index 0bfbb26..260e5fe 100644
--- a/arch/blackfin/kernel/bfin_ksyms.c
+++ b/arch/blackfin/kernel/bfin_ksyms.c
@@ -46,6 +46,7 @@ EXPORT_SYMBOL(__up);
 EXPORT_SYMBOL(__down);
 EXPORT_SYMBOL(__down_trylock);
 EXPORT_SYMBOL(__down_interruptible);
+EXPORT_SYMBOL(__down_killable);
 
 EXPORT_SYMBOL(is_in_rom);
 EXPORT_SYMBOL(bfin_return_from_exception);
diff --git a/include/asm-blackfin/semaphore.h b/include/asm-blackfin/semaphore.h
index 533f90f..cc355d3 100644
--- a/include/asm-blackfin/semaphore.h
+++ b/include/asm-blackfin/semaphore.h
@@ -53,6 +53,7 @@ static inline void init_MUTEX_LOCKED(struct semaphore *sem)
 
 asmlinkage void __down(struct semaphore *sem);
 asmlinkage int __down_interruptible(struct semaphore *sem);
+asmlinkage int __down_killable(struct semaphore *sem);
 asmlinkage int __down_trylock(struct semaphore *sem);
 asmlinkage void __up(struct semaphore *sem);
 
@@ -80,6 +81,16 @@ static inline int down_interruptible(struct semaphore *sem)
 	return (ret);
 }
 
+static inline int down_killable(struct semaphore *sem)
+{
+	int ret = 0;
+
+	might_sleep();
+	if (atomic_dec_return(&sem->count) < 0)
+		ret = __down_killable(sem);
+	return (ret);
+}
+
 static inline int down_trylock(struct semaphore *sem)
 {
 	int ret = 0;
-- 
1.5.3.8


