|
@@ -37,15 +37,31 @@
|
|
|
/*
|
|
|
* lock for reading
|
|
|
*/
|
|
|
-static inline void
|
|
|
-__down_read (struct rw_semaphore *sem)
|
|
|
+static inline int
|
|
|
+___down_read (struct rw_semaphore *sem)
|
|
|
{
|
|
|
long result = ia64_fetchadd8_acq((unsigned long *)&sem->count.counter, 1);
|
|
|
|
|
|
- if (result < 0)
|
|
|
+ return (result < 0);
|
|
|
+}
|
|
|
+
|
|
|
+static inline void
|
|
|
+__down_read (struct rw_semaphore *sem)
|
|
|
+{
|
|
|
+ if (___down_read(sem))
|
|
|
rwsem_down_read_failed(sem);
|
|
|
}
|
|
|
|
|
|
+static inline int
|
|
|
+__down_read_killable (struct rw_semaphore *sem)
|
|
|
+{
|
|
|
+ if (___down_read(sem))
|
|
|
+ if (IS_ERR(rwsem_down_read_failed_killable(sem)))
|
|
|
+ return -EINTR;
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* lock for writing
|
|
|
*/
|
|
@@ -72,9 +88,10 @@ __down_write (struct rw_semaphore *sem)
|
|
|
static inline int
|
|
|
__down_write_killable (struct rw_semaphore *sem)
|
|
|
{
|
|
|
- if (___down_write(sem))
|
|
|
+ if (___down_write(sem)) {
|
|
|
if (IS_ERR(rwsem_down_write_failed_killable(sem)))
|
|
|
return -EINTR;
|
|
|
+ }
|
|
|
|
|
|
return 0;
|
|
|
}
|