xref: /linux/fs/jfs/jfs_lock.h (revision 75bf465f0bc33e9b776a46d6a1b9b990f5fb7c37)
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /*
3  *   Copyright (C) International Business Machines Corp., 2000-2001
4  *   Portions Copyright (C) Christoph Hellwig, 2001-2002
5  */
6 #ifndef _H_JFS_LOCK
7 #define _H_JFS_LOCK
8 
9 #include <linux/spinlock.h>
10 #include <linux/mutex.h>
11 #include <linux/sched.h>
12 
13 /*
14  *	jfs_lock.h
15  */
16 
17 /*
18  * Conditional sleep where condition is protected by spinlock
19  *
20  * lock_cmd and unlock_cmd take and release the spinlock
21  */
22 #define __SLEEP_COND(wq, cond, lock_cmd, unlock_cmd)	\
23 do {							\
24 	DECLARE_WAITQUEUE(__wait, current);		\
25 							\
26 	add_wait_queue(&wq, &__wait);			\
27 	for (;;) {					\
28 		set_current_state(TASK_UNINTERRUPTIBLE);\
29 		if (cond)				\
30 			break;				\
31 		unlock_cmd;				\
32 		io_schedule();				\
33 		lock_cmd;				\
34 	}						\
35 	__set_current_state(TASK_RUNNING);			\
36 	remove_wait_queue(&wq, &__wait);		\
37 } while (0)
38 
39 #endif				/* _H_JFS_LOCK */
40