1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* 3 * Copyright (C) 2008 Oracle. All rights reserved. 4 */ 5 6 #ifndef BTRFS_LOCKING_H 7 #define BTRFS_LOCKING_H 8 9 #define BTRFS_WRITE_LOCK 1 10 #define BTRFS_READ_LOCK 2 11 #define BTRFS_WRITE_LOCK_BLOCKING 3 12 #define BTRFS_READ_LOCK_BLOCKING 4 13 14 void btrfs_tree_lock(struct extent_buffer *eb); 15 void btrfs_tree_unlock(struct extent_buffer *eb); 16 17 void btrfs_tree_read_lock(struct extent_buffer *eb); 18 void btrfs_tree_read_unlock(struct extent_buffer *eb); 19 void btrfs_tree_read_unlock_blocking(struct extent_buffer *eb); 20 void btrfs_set_lock_blocking_rw(struct extent_buffer *eb, int rw); 21 void btrfs_clear_lock_blocking_rw(struct extent_buffer *eb, int rw); 22 void btrfs_assert_tree_locked(struct extent_buffer *eb); 23 int btrfs_try_tree_read_lock(struct extent_buffer *eb); 24 int btrfs_try_tree_write_lock(struct extent_buffer *eb); 25 int btrfs_tree_read_lock_atomic(struct extent_buffer *eb); 26 27 28 static inline void btrfs_tree_unlock_rw(struct extent_buffer *eb, int rw) 29 { 30 if (rw == BTRFS_WRITE_LOCK || rw == BTRFS_WRITE_LOCK_BLOCKING) 31 btrfs_tree_unlock(eb); 32 else if (rw == BTRFS_READ_LOCK_BLOCKING) 33 btrfs_tree_read_unlock_blocking(eb); 34 else if (rw == BTRFS_READ_LOCK) 35 btrfs_tree_read_unlock(eb); 36 else 37 BUG(); 38 } 39 40 static inline void btrfs_set_lock_blocking(struct extent_buffer *eb) 41 { 42 btrfs_set_lock_blocking_rw(eb, BTRFS_WRITE_LOCK); 43 } 44 45 static inline void btrfs_clear_lock_blocking(struct extent_buffer *eb) 46 { 47 btrfs_clear_lock_blocking_rw(eb, BTRFS_WRITE_LOCK_BLOCKING); 48 } 49 #endif 50