-
-extern void __up_read_locked(struct rw_semaphore *);
-extern int __down_write_trylock_locked(struct rw_semaphore *);
-
-#define rw_tryupgrade(rwp) \
-({ \
- unsigned long _flags_; \
- int _rc_ = 0; \
- \
- spl_rwsem_lock_irqsave(&SEM(rwp)->wait_lock, _flags_); \
- if ((list_empty(&SEM(rwp)->wait_list)) && \
- (SEM(rwp)->activity == 1)) { \
- __up_read_locked(SEM(rwp)); \
- VERIFY(_rc_ = __down_write_trylock_locked(SEM(rwp))); \
- (rwp)->rw_owner = current; \
- } \
- spl_rwsem_unlock_irqrestore(&SEM(rwp)->wait_lock, _flags_); \
- _rc_; \
+#define rw_tryupgrade(rwp) \
+({ \
+ int _rc_ = 0; \
+ \
+ if (RW_WRITE_HELD(rwp)) { \
+ _rc_ = 1; \
+ } else { \
+ spl_rw_lockdep_off_maybe(rwp); \
+ if ((_rc_ = rwsem_tryupgrade(SEM(rwp)))) \
+ spl_rw_set_owner(rwp); \
+ spl_rw_lockdep_on_maybe(rwp); \
+ } \
+ _rc_; \