rwsem: introduce down_write_non_owner and up_write_non_owner Introduce these two functions that allow the semaphore to be released by a different process. Signed-off-by: Mikulas Patocka --- include/linux/rwsem.h | 6 +++++- kernel/rwsem.c | 16 ++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) Index: linux-3.0-fast/include/linux/rwsem.h =================================================================== --- linux-3.0-fast.orig/include/linux/rwsem.h 2011-08-18 22:42:30.000000000 +0200 +++ linux-3.0-fast/include/linux/rwsem.h 2011-08-18 22:43:42.000000000 +0200 @@ -132,11 +132,15 @@ extern void down_write_nested(struct rw_ */ extern void down_read_non_owner(struct rw_semaphore *sem); extern void up_read_non_owner(struct rw_semaphore *sem); +extern void down_write_non_owner(struct rw_semaphore *sem); +extern void up_write_non_owner(struct rw_semaphore *sem); #else -# define down_read_nested(sem, subclass) down_read(sem) +# define down_read_nested(sem, subclass) down_read(sem) # define down_write_nested(sem, subclass) down_write(sem) # define down_read_non_owner(sem) down_read(sem) # define up_read_non_owner(sem) up_read(sem) +# define down_write_non_owner(sem) down_write(sem) +# define up_write_non_owner(sem) up_write(sem) #endif #endif /* _LINUX_RWSEM_H */ Index: linux-3.0-fast/kernel/rwsem.c =================================================================== --- linux-3.0-fast.orig/kernel/rwsem.c 2011-08-18 22:41:04.000000000 +0200 +++ linux-3.0-fast/kernel/rwsem.c 2011-08-18 22:42:26.000000000 +0200 @@ -136,6 +136,15 @@ void down_write_nested(struct rw_semapho EXPORT_SYMBOL(down_write_nested); +void down_write_non_owner(struct rw_semaphore *sem) +{ + might_sleep(); + + __down_write(sem); +} + +EXPORT_SYMBOL(down_write_non_owner); + void up_read_non_owner(struct rw_semaphore *sem) { __up_read(sem); @@ -143,6 +152,13 @@ void up_read_non_owner(struct rw_semapho EXPORT_SYMBOL(up_read_non_owner); +void up_write_non_owner(struct rw_semaphore *sem) +{ + __up_write(sem); +} + +EXPORT_SYMBOL(up_write_non_owner); + #endif