|
@@ -90,7 +90,7 @@ static inline int __down_read_trylock(struct rw_semaphore *sem)
|
|
|
/*
|
|
|
* lock for writing
|
|
|
*/
|
|
|
-static inline void __down_write(struct rw_semaphore *sem)
|
|
|
+static inline long ___down_write(struct rw_semaphore *sem)
|
|
|
{
|
|
|
signed long old, new, tmp;
|
|
|
|
|
@@ -104,10 +104,25 @@ static inline void __down_write(struct rw_semaphore *sem)
|
|
|
: "=&d" (old), "=&d" (new), "=Q" (sem->count)
|
|
|
: "Q" (sem->count), "m" (tmp)
|
|
|
: "cc", "memory");
|
|
|
- if (old != 0)
|
|
|
+
|
|
|
+ return old;
|
|
|
+}
|
|
|
+
|
|
|
+static inline void __down_write(struct rw_semaphore *sem)
|
|
|
+{
|
|
|
+ if (___down_write(sem))
|
|
|
rwsem_down_write_failed(sem);
|
|
|
}
|
|
|
|
|
|
+static inline int __down_write_killable(struct rw_semaphore *sem)
|
|
|
+{
|
|
|
+ if (___down_write(sem))
|
|
|
+ if (IS_ERR(rwsem_down_write_failed_killable(sem)))
|
|
|
+ return -EINTR;
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* trylock for writing -- returns 1 if successful, 0 if contention
|
|
|
*/
|