diff options
Diffstat (limited to 'fs/btrfs/locking.c')
| -rw-r--r-- | fs/btrfs/locking.c | 25 | 
1 files changed, 6 insertions, 19 deletions
diff --git a/fs/btrfs/locking.c b/fs/btrfs/locking.c index 870528d87526..3a496b0d3d2b 100644 --- a/fs/btrfs/locking.c +++ b/fs/btrfs/locking.c @@ -325,24 +325,12 @@ struct extent_buffer *btrfs_try_read_lock_root_node(struct btrfs_root *root)   * acquire the lock.   */ -int btrfs_drew_lock_init(struct btrfs_drew_lock *lock) +void btrfs_drew_lock_init(struct btrfs_drew_lock *lock)  { -	int ret; - -	ret = percpu_counter_init(&lock->writers, 0, GFP_KERNEL); -	if (ret) -		return ret; -  	atomic_set(&lock->readers, 0); +	atomic_set(&lock->writers, 0);  	init_waitqueue_head(&lock->pending_readers);  	init_waitqueue_head(&lock->pending_writers); - -	return 0; -} - -void btrfs_drew_lock_destroy(struct btrfs_drew_lock *lock) -{ -	percpu_counter_destroy(&lock->writers);  }  /* Return true if acquisition is successful, false otherwise */ @@ -351,10 +339,10 @@ bool btrfs_drew_try_write_lock(struct btrfs_drew_lock *lock)  	if (atomic_read(&lock->readers))  		return false; -	percpu_counter_inc(&lock->writers); +	atomic_inc(&lock->writers);  	/* Ensure writers count is updated before we check for pending readers */ -	smp_mb(); +	smp_mb__after_atomic();  	if (atomic_read(&lock->readers)) {  		btrfs_drew_write_unlock(lock);  		return false; @@ -374,7 +362,7 @@ void btrfs_drew_write_lock(struct btrfs_drew_lock *lock)  void btrfs_drew_write_unlock(struct btrfs_drew_lock *lock)  { -	percpu_counter_dec(&lock->writers); +	atomic_dec(&lock->writers);  	cond_wake_up(&lock->pending_readers);  } @@ -390,8 +378,7 @@ void btrfs_drew_read_lock(struct btrfs_drew_lock *lock)  	 */  	smp_mb__after_atomic(); -	wait_event(lock->pending_readers, -		   percpu_counter_sum(&lock->writers) == 0); +	wait_event(lock->pending_readers, atomic_read(&lock->writers) == 0);  }  void btrfs_drew_read_unlock(struct btrfs_drew_lock *lock)  |