diff options
author | Takashi Iwai <tiwai@suse.de> | 2014-12-08 11:33:24 +0100 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2014-12-08 11:33:24 +0100 |
commit | 77de61c3975da6f2200935c341e84018ece6ce36 (patch) | |
tree | 36508cf93ef62a80c988fa18c86eda1274e03877 /fs/btrfs/locking.c | |
parent | 66139a48cee1530c91f37c145384b4ee7043f0b7 (diff) | |
parent | 048184540171672a724ab8f8bada7fcc0762f5c6 (diff) |
Merge branch 'for-next' into for-linus
Diffstat (limited to 'fs/btrfs/locking.c')
-rw-r--r-- | fs/btrfs/locking.c | 24 |
1 files changed, 21 insertions, 3 deletions
diff --git a/fs/btrfs/locking.c b/fs/btrfs/locking.c index 5665d2149249..f8229ef1b46d 100644 --- a/fs/btrfs/locking.c +++ b/fs/btrfs/locking.c @@ -128,6 +128,26 @@ again: } /* + * take a spinning read lock. + * returns 1 if we get the read lock and 0 if we don't + * this won't wait for blocking writers + */ +int btrfs_tree_read_lock_atomic(struct extent_buffer *eb) +{ + if (atomic_read(&eb->blocking_writers)) + return 0; + + read_lock(&eb->lock); + if (atomic_read(&eb->blocking_writers)) { + read_unlock(&eb->lock); + return 0; + } + atomic_inc(&eb->read_locks); + atomic_inc(&eb->spinning_readers); + return 1; +} + +/* * returns 1 if we get the read lock and 0 if we don't * this won't wait for blocking writers */ @@ -158,9 +178,7 @@ int btrfs_try_tree_write_lock(struct extent_buffer *eb) atomic_read(&eb->blocking_readers)) return 0; - if (!write_trylock(&eb->lock)) - return 0; - + write_lock(&eb->lock); if (atomic_read(&eb->blocking_writers) || atomic_read(&eb->blocking_readers)) { write_unlock(&eb->lock); |