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 #include "extent_io.h" 10 11 #define BTRFS_WRITE_LOCK 1 12 #define BTRFS_READ_LOCK 2 13 #define BTRFS_WRITE_LOCK_BLOCKING 3 14 #define BTRFS_READ_LOCK_BLOCKING 4 15 16 void btrfs_tree_lock(struct extent_buffer *eb); 17 void btrfs_tree_unlock(struct extent_buffer *eb); 18 19 void btrfs_tree_read_lock(struct extent_buffer *eb); 20 void btrfs_tree_read_unlock(struct extent_buffer *eb); 21 void btrfs_tree_read_unlock_blocking(struct extent_buffer *eb); 22 void btrfs_set_lock_blocking_read(struct extent_buffer *eb); 23 void btrfs_set_lock_blocking_write(struct extent_buffer *eb); 24 int btrfs_try_tree_read_lock(struct extent_buffer *eb); 25 int btrfs_try_tree_write_lock(struct extent_buffer *eb); 26 int btrfs_tree_read_lock_atomic(struct extent_buffer *eb); 27 28 #ifdef CONFIG_BTRFS_DEBUG 29 static inline void btrfs_assert_tree_locked(struct extent_buffer *eb) { 30 BUG_ON(!eb->write_locks); 31 } 32 #else 33 static inline void btrfs_assert_tree_locked(struct extent_buffer *eb) { } 34 #endif 35 36 void btrfs_set_path_blocking(struct btrfs_path *p); 37 void btrfs_unlock_up_safe(struct btrfs_path *path, int level); 38 39 static inline void btrfs_tree_unlock_rw(struct extent_buffer *eb, int rw) 40 { 41 if (rw == BTRFS_WRITE_LOCK || rw == BTRFS_WRITE_LOCK_BLOCKING) 42 btrfs_tree_unlock(eb); 43 else if (rw == BTRFS_READ_LOCK_BLOCKING) 44 btrfs_tree_read_unlock_blocking(eb); 45 else if (rw == BTRFS_READ_LOCK) 46 btrfs_tree_read_unlock(eb); 47 else 48 BUG(); 49 } 50 51 #endif 52