GNU Linux-libre 5.19-rc6-gnu
[releases.git] / fs / jfs / jfs_lock.h
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 */