1*1a59d1b8SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */ 21da177e4SLinus Torvalds /* 363f83c9fSDave Kleikamp * Copyright (C) International Business Machines Corp., 2000-2001 463f83c9fSDave Kleikamp * Portions Copyright (C) Christoph Hellwig, 2001-2002 51da177e4SLinus Torvalds */ 61da177e4SLinus Torvalds #ifndef _H_JFS_LOCK 71da177e4SLinus Torvalds #define _H_JFS_LOCK 81da177e4SLinus Torvalds 91da177e4SLinus Torvalds #include <linux/spinlock.h> 101de87444SIngo Molnar #include <linux/mutex.h> 111da177e4SLinus Torvalds #include <linux/sched.h> 121da177e4SLinus Torvalds 131da177e4SLinus Torvalds /* 141da177e4SLinus Torvalds * jfs_lock.h 151da177e4SLinus Torvalds */ 161da177e4SLinus Torvalds 171da177e4SLinus Torvalds /* 181da177e4SLinus Torvalds * Conditional sleep where condition is protected by spinlock 191da177e4SLinus Torvalds * 201da177e4SLinus Torvalds * lock_cmd and unlock_cmd take and release the spinlock 211da177e4SLinus Torvalds */ 221da177e4SLinus Torvalds #define __SLEEP_COND(wq, cond, lock_cmd, unlock_cmd) \ 231da177e4SLinus Torvalds do { \ 241da177e4SLinus Torvalds DECLARE_WAITQUEUE(__wait, current); \ 251da177e4SLinus Torvalds \ 261da177e4SLinus Torvalds add_wait_queue(&wq, &__wait); \ 271da177e4SLinus Torvalds for (;;) { \ 281da177e4SLinus Torvalds set_current_state(TASK_UNINTERRUPTIBLE);\ 291da177e4SLinus Torvalds if (cond) \ 301da177e4SLinus Torvalds break; \ 311da177e4SLinus Torvalds unlock_cmd; \ 324aa0d230SDave Kleikamp io_schedule(); \ 331da177e4SLinus Torvalds lock_cmd; \ 341da177e4SLinus Torvalds } \ 353cbb1c8eSMilind Arun Choudhary __set_current_state(TASK_RUNNING); \ 361da177e4SLinus Torvalds remove_wait_queue(&wq, &__wait); \ 371da177e4SLinus Torvalds } while (0) 381da177e4SLinus Torvalds 391da177e4SLinus Torvalds #endif /* _H_JFS_LOCK */ 40