/* -*- buffer-read-only: t -*- vi: set ro: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 only, * as published by the Free Software Foundation. * * Lustre is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ /** * \file lustre_dlm_flags.h * The flags and collections of flags (masks) for \see struct ldlm_lock. * * \addtogroup LDLM Lustre Distributed Lock Manager * @{ * * \name flags * The flags and collections of flags (masks) for \see struct ldlm_lock. * @{ */ #ifndef LDLM_ALL_FLAGS_MASK /** l_flags bits marked as "all_flags" bits */ #define LDLM_FL_ALL_FLAGS_MASK 0x00FFFFFFC28F932FULL /** extent, mode, or resource changed */ #define LDLM_FL_LOCK_CHANGED 0x0000000000000001ULL // bit 0 #define ldlm_is_lock_changed(_l) LDLM_TEST_FLAG(( _l), 1ULL << 0) #define ldlm_set_lock_changed(_l) LDLM_SET_FLAG(( _l), 1ULL << 0) #define ldlm_clear_lock_changed(_l) LDLM_CLEAR_FLAG((_l), 1ULL << 0) /** * Server placed lock on granted list, or a recovering client wants the * lock added to the granted list, no questions asked. */ #define LDLM_FL_BLOCK_GRANTED 0x0000000000000002ULL // bit 1 #define ldlm_is_block_granted(_l) LDLM_TEST_FLAG(( _l), 1ULL << 1) #define ldlm_set_block_granted(_l) LDLM_SET_FLAG(( _l), 1ULL << 1) #define ldlm_clear_block_granted(_l) LDLM_CLEAR_FLAG((_l), 1ULL << 1) /** * Server placed lock on conv list, or a recovering client wants the lock * added to the conv list, no questions asked. (obsoleted) */ #define LDLM_FL_BLOCK_CONV 0x0000000000000004ULL // bit 2 #define ldlm_is_block_conv(_l) LDLM_TEST_FLAG(( _l), 1ULL << 2) #define ldlm_set_block_conv(_l) LDLM_SET_FLAG(( _l), 1ULL << 2) #define ldlm_clear_block_conv(_l) LDLM_CLEAR_FLAG((_l), 1ULL << 2) /** * Server placed lock on wait list, or a recovering client wants the lock * added to the wait list, no questions asked. */ #define LDLM_FL_BLOCK_WAIT 0x0000000000000008ULL // bit 3 #define ldlm_is_block_wait(_l) LDLM_TEST_FLAG(( _l), 1ULL << 3) #define ldlm_set_block_wait(_l) LDLM_SET_FLAG(( _l), 1ULL << 3) #define ldlm_clear_block_wait(_l) LDLM_CLEAR_FLAG((_l), 1ULL << 3) /** * Lock request is speculative/asynchronous, and cannot wait for any reason. * Fail the lock request if any blocking locks are encountered. * */ #define LDLM_FL_SPECULATIVE 0x0000000000000010ULL /* bit 4 */ #define ldlm_is_speculative(_l) LDLM_TEST_FLAG((_l), 1ULL << 4) #define ldlm_set_speculative(_l) LDLM_SET_FLAG((_l), 1ULL << 4) #define ldlm_clear_specualtive_(_l) LDLM_CLEAR_FLAG((_l), 1ULL << 4) /** blocking or cancel packet was queued for sending. */ #define LDLM_FL_AST_SENT 0x0000000000000020ULL // bit 5 #define ldlm_is_ast_sent(_l) LDLM_TEST_FLAG(( _l), 1ULL << 5) #define ldlm_set_ast_sent(_l) LDLM_SET_FLAG(( _l), 1ULL << 5) #define ldlm_clear_ast_sent(_l) LDLM_CLEAR_FLAG((_l), 1ULL << 5) /** * Lock is being replayed. This could probably be implied by the fact that * one of BLOCK_{GRANTED,CONV,WAIT} is set, but that is pretty dangerous. */ #define LDLM_FL_REPLAY 0x0000000000000100ULL // bit 8 #define ldlm_is_replay(_l) LDLM_TEST_FLAG(( _l), 1ULL << 8) #define ldlm_set_replay(_l) LDLM_SET_FLAG(( _l), 1ULL << 8) #define ldlm_clear_replay(_l) LDLM_CLEAR_FLAG((_l), 1ULL << 8) /** Don't grant lock, just do intent. */ #define LDLM_FL_INTENT_ONLY 0x0000000000000200ULL // bit 9 #define ldlm_is_intent_only(_l) LDLM_TEST_FLAG(( _l), 1ULL << 9) #define ldlm_set_intent_only(_l) LDLM_SET_FLAG(( _l), 1ULL << 9) #define ldlm_clear_intent_only(_l) LDLM_CLEAR_FLAG((_l), 1ULL << 9) /** lock request has intent */ #define LDLM_FL_HAS_INTENT 0x0000000000001000ULL // bit 12 #define ldlm_is_has_intent(_l) LDLM_TEST_FLAG(( _l), 1ULL << 12) #define ldlm_set_has_intent(_l) LDLM_SET_FLAG(( _l), 1ULL << 12) #define ldlm_clear_has_intent(_l) LDLM_CLEAR_FLAG((_l), 1ULL << 12) /** flock deadlock detected */ #define LDLM_FL_FLOCK_DEADLOCK 0x0000000000008000ULL // bit 15 #define ldlm_is_flock_deadlock(_l) LDLM_TEST_FLAG(( _l), 1ULL << 15) #define ldlm_set_flock_deadlock(_l) LDLM_SET_FLAG(( _l), 1ULL << 15) #define ldlm_clear_flock_deadlock(_l) LDLM_CLEAR_FLAG((_l), 1ULL << 15) /** discard (no writeback (PW locks) or page retention (PR locks)) on cancel */ #define LDLM_FL_DISCARD_DATA 0x0000000000010000ULL // bit 16 #define ldlm_is_discard_data(_l) LDLM_TEST_FLAG(( _l), 1ULL << 16) #define ldlm_set_discard_data(_l) LDLM_SET_FLAG(( _l), 1ULL << 16) #define ldlm_clear_discard_data(_l) LDLM_CLEAR_FLAG((_l), 1ULL << 16) /** Blocked by group lock - wait indefinitely */ #define LDLM_FL_NO_TIMEOUT 0x0000000000020000ULL // bit 17 #define ldlm_is_no_timeout(_l) LDLM_TEST_FLAG(( _l), 1ULL << 17) #define ldlm_set_no_timeout(_l) LDLM_SET_FLAG(( _l), 1ULL << 17) #define ldlm_clear_no_timeout(_l) LDLM_CLEAR_FLAG((_l), 1ULL << 17) /** * Server told not to wait if blocked. For AGL, OST will not send glimpse * callback. */ #define LDLM_FL_BLOCK_NOWAIT 0x0000000000040000ULL // bit 18 #define ldlm_is_block_nowait(_l) LDLM_TEST_FLAG(( _l), 1ULL << 18) #define ldlm_set_block_nowait(_l) LDLM_SET_FLAG(( _l), 1ULL << 18) #define ldlm_clear_block_nowait(_l) LDLM_CLEAR_FLAG((_l), 1ULL << 18) /** return blocking lock */ #define LDLM_FL_TEST_LOCK 0x0000000000080000ULL // bit 19 #define ldlm_is_test_lock(_l) LDLM_TEST_FLAG(( _l), 1ULL << 19) #define ldlm_set_test_lock(_l) LDLM_SET_FLAG(( _l), 1ULL << 19) #define ldlm_clear_test_lock(_l) LDLM_CLEAR_FLAG((_l), 1ULL << 19) /** match lock only */ #define LDLM_FL_MATCH_LOCK 0x0000000000100000ULL // bit 20 /** * Immediatelly cancel such locks when they block some other locks. Send * cancel notification to original lock holder, but expect no reply. This * is for clients (like liblustre) that cannot be expected to reliably * response to blocking AST. */ #define LDLM_FL_CANCEL_ON_BLOCK 0x0000000000800000ULL // bit 23 #define ldlm_is_cancel_on_block(_l) LDLM_TEST_FLAG(( _l), 1ULL << 23) #define ldlm_set_cancel_on_block(_l) LDLM_SET_FLAG(( _l), 1ULL << 23) #define ldlm_clear_cancel_on_block(_l) LDLM_CLEAR_FLAG((_l), 1ULL << 23) /** Flag whether a lock is enqueued from a distributed transaction, and the * requesting lock mode is PW/EX, if so, it will check compatibility with COS * locks, and different from original COS semantic, transactions from the same * client is also treated as lock conflict. */ #define LDLM_FL_COS_INCOMPAT 0x0000000001000000ULL /* bit 24 */ #define ldlm_is_cos_incompat(_l) LDLM_TEST_FLAG((_l), 1ULL << 24) #define ldlm_set_cos_incompat(_l) LDLM_SET_FLAG((_l), 1ULL << 24) #define ldlm_clear_cos_incompat(_l) LDLM_CLEAR_FLAG((_l), 1ULL << 24) /* * Flag indicates that lock is being converted (downgraded) during the blocking * AST instead of cancelling. Used for IBITS locks now and drops conflicting * bits only keepeing other. */ #define LDLM_FL_CONVERTING 0x0000000002000000ULL /* bit 25 */ #define ldlm_is_converting(_l) LDLM_TEST_FLAG((_l), 1ULL << 25) #define ldlm_set_converting(_l) LDLM_SET_FLAG((_l), 1ULL << 25) #define ldlm_clear_converting(_l) LDLM_CLEAR_FLAG((_l), 1ULL << 25) /** * Part of original lockahead implementation, OBD_CONNECT_LOCKAHEAD_OLD. * Reserved temporarily to allow those implementations to keep working. * Will be removed after 2.12 release. * */ #define LDLM_FL_LOCKAHEAD_OLD_RESERVED 0x0000000010000000ULL /* bit 28 */ #define ldlm_is_do_not_expand_io(_l) LDLM_TEST_FLAG((_l), 1ULL << 28) #define ldlm_set_do_not_expand_io(_l) LDLM_SET_FLAG((_l), 1ULL << 28) #define ldlm_clear_do_not_expand_io(_l) LDLM_CLEAR_FLAG((_l), 1ULL << 28) /** * Do not expand this lock. Grant it only on the extent requested. * Used for manually requested locks from the client (LU_LADVISE_LOCKAHEAD). * */ #define LDLM_FL_NO_EXPANSION 0x0000000020000000ULL /* bit 29 */ #define ldlm_is_do_not_expand(_l) LDLM_TEST_FLAG((_l), 1ULL << 29) #define ldlm_set_do_not_expand(_l) LDLM_SET_FLAG((_l), 1ULL << 29) #define ldlm_clear_do_not_expand(_l) LDLM_CLEAR_FLAG((_l), 1ULL << 29) /** * measure lock contention and return -EUSERS if locking contention is high */ #define LDLM_FL_DENY_ON_CONTENTION 0x0000000040000000ULL // bit 30 #define ldlm_is_deny_on_contention(_l) LDLM_TEST_FLAG(( _l), 1ULL << 30) #define ldlm_set_deny_on_contention(_l) LDLM_SET_FLAG(( _l), 1ULL << 30) #define ldlm_clear_deny_on_contention(_l) LDLM_CLEAR_FLAG((_l), 1ULL << 30) /** * These are flags that are mapped into the flags and ASTs of blocking * locks Add FL_DISCARD to blocking ASTs */ #define LDLM_FL_AST_DISCARD_DATA 0x0000000080000000ULL // bit 31 #define ldlm_is_ast_discard_data(_l) LDLM_TEST_FLAG(( _l), 1ULL << 31) #define ldlm_set_ast_discard_data(_l) LDLM_SET_FLAG(( _l), 1ULL << 31) #define ldlm_clear_ast_discard_data(_l) LDLM_CLEAR_FLAG((_l), 1ULL << 31) /** * Used for marking lock as a target for -EINTR while cp_ast sleep emulation * + race with upcoming bl_ast. */ #define LDLM_FL_FAIL_LOC 0x0000000100000000ULL // bit 32 #define ldlm_is_fail_loc(_l) LDLM_TEST_FLAG(( _l), 1ULL << 32) #define ldlm_set_fail_loc(_l) LDLM_SET_FLAG(( _l), 1ULL << 32) #define ldlm_clear_fail_loc(_l) LDLM_CLEAR_FLAG((_l), 1ULL << 32) /** this lock is being destroyed */ #define LDLM_FL_CBPENDING 0x0000000400000000ULL // bit 34 #define ldlm_is_cbpending(_l) LDLM_TEST_FLAG(( _l), 1ULL << 34) #define ldlm_set_cbpending(_l) LDLM_SET_FLAG(( _l), 1ULL << 34) #define ldlm_clear_cbpending(_l) LDLM_CLEAR_FLAG((_l), 1ULL << 34) /** not a real flag, not saved in lock */ #define LDLM_FL_WAIT_NOREPROC 0x0000000800000000ULL // bit 35 #define ldlm_is_wait_noreproc(_l) LDLM_TEST_FLAG(( _l), 1ULL << 35) #define ldlm_set_wait_noreproc(_l) LDLM_SET_FLAG(( _l), 1ULL << 35) #define ldlm_clear_wait_noreproc(_l) LDLM_CLEAR_FLAG((_l), 1ULL << 35) /** cancellation callback already run */ #define LDLM_FL_CANCEL 0x0000001000000000ULL // bit 36 #define ldlm_is_cancel(_l) LDLM_TEST_FLAG(( _l), 1ULL << 36) #define ldlm_set_cancel(_l) LDLM_SET_FLAG(( _l), 1ULL << 36) #define ldlm_clear_cancel(_l) LDLM_CLEAR_FLAG((_l), 1ULL << 36) /** whatever it might mean -- never transmitted? */ #define LDLM_FL_LOCAL_ONLY 0x0000002000000000ULL // bit 37 #define ldlm_is_local_only(_l) LDLM_TEST_FLAG(( _l), 1ULL << 37) #define ldlm_set_local_only(_l) LDLM_SET_FLAG(( _l), 1ULL << 37) #define ldlm_clear_local_only(_l) LDLM_CLEAR_FLAG((_l), 1ULL << 37) /** don't run the cancel callback under ldlm_cli_cancel_unused */ #define LDLM_FL_FAILED 0x0000004000000000ULL // bit 38 #define ldlm_is_failed(_l) LDLM_TEST_FLAG(( _l), 1ULL << 38) #define ldlm_set_failed(_l) LDLM_SET_FLAG(( _l), 1ULL << 38) #define ldlm_clear_failed(_l) LDLM_CLEAR_FLAG((_l), 1ULL << 38) /** lock cancel has already been sent */ #define LDLM_FL_CANCELING 0x0000008000000000ULL // bit 39 #define ldlm_is_canceling(_l) LDLM_TEST_FLAG(( _l), 1ULL << 39) #define ldlm_set_canceling(_l) LDLM_SET_FLAG(( _l), 1ULL << 39) #define ldlm_clear_canceling(_l) LDLM_CLEAR_FLAG((_l), 1ULL << 39) /** local lock (ie, no srv/cli split) */ #define LDLM_FL_LOCAL 0x0000010000000000ULL // bit 40 #define ldlm_is_local(_l) LDLM_TEST_FLAG(( _l), 1ULL << 40) #define ldlm_set_local(_l) LDLM_SET_FLAG(( _l), 1ULL << 40) #define ldlm_clear_local(_l) LDLM_CLEAR_FLAG((_l), 1ULL << 40) /** * XXX FIXME: This is being added to b_size as a low-risk fix to the * fact that the LVB filling happens _after_ the lock has been granted, * so another thread can match it before the LVB has been updated. As a * dirty hack, we set LDLM_FL_LVB_READY only after we've done the LVB poop. * this is only needed on LOV/OSC now, where LVB is actually used and * callers must set it in input flags. * * The proper fix is to do the granting inside of the completion AST, * which can be replaced with a LVB-aware wrapping function for OSC locks. * That change is pretty high-risk, though, and would need a lot more * testing. */ #define LDLM_FL_LVB_READY 0x0000020000000000ULL // bit 41 #define ldlm_is_lvb_ready(_l) LDLM_TEST_FLAG(( _l), 1ULL << 41) #define ldlm_set_lvb_ready(_l) LDLM_SET_FLAG(( _l), 1ULL << 41) #define ldlm_clear_lvb_ready(_l) LDLM_CLEAR_FLAG((_l), 1ULL << 41) /** * A lock contributes to the known minimum size (KMS) calculation until it * has finished the part of its cancelation that performs write back on its * dirty pages. It can remain on the granted list during this whole time. * Threads racing to update the KMS after performing their writeback need * to know to exclude each other's locks from the calculation as they walk * the granted list. */ #define LDLM_FL_KMS_IGNORE 0x0000040000000000ULL // bit 42 #define ldlm_is_kms_ignore(_l) LDLM_TEST_FLAG(( _l), 1ULL << 42) #define ldlm_set_kms_ignore(_l) LDLM_SET_FLAG(( _l), 1ULL << 42) #define ldlm_clear_kms_ignore(_l) LDLM_CLEAR_FLAG((_l), 1ULL << 42) /** completion AST to be executed */ #define LDLM_FL_CP_REQD 0x0000080000000000ULL // bit 43 #define ldlm_is_cp_reqd(_l) LDLM_TEST_FLAG(( _l), 1ULL << 43) #define ldlm_set_cp_reqd(_l) LDLM_SET_FLAG(( _l), 1ULL << 43) #define ldlm_clear_cp_reqd(_l) LDLM_CLEAR_FLAG((_l), 1ULL << 43) /** cleanup_resource has already handled the lock */ #define LDLM_FL_CLEANED 0x0000100000000000ULL // bit 44 #define ldlm_is_cleaned(_l) LDLM_TEST_FLAG(( _l), 1ULL << 44) #define ldlm_set_cleaned(_l) LDLM_SET_FLAG(( _l), 1ULL << 44) #define ldlm_clear_cleaned(_l) LDLM_CLEAR_FLAG((_l), 1ULL << 44) /** * optimization hint: LDLM can run blocking callback from current context * w/o involving separate thread. in order to decrease cs rate */ #define LDLM_FL_ATOMIC_CB 0x0000200000000000ULL // bit 45 #define ldlm_is_atomic_cb(_l) LDLM_TEST_FLAG(( _l), 1ULL << 45) #define ldlm_set_atomic_cb(_l) LDLM_SET_FLAG(( _l), 1ULL << 45) #define ldlm_clear_atomic_cb(_l) LDLM_CLEAR_FLAG((_l), 1ULL << 45) /** * It may happen that a client initiates two operations, e.g. unlink and * mkdir, such that the server sends a blocking AST for conflicting locks * to this client for the first operation, whereas the second operation * has canceled this lock and is waiting for rpc_lock which is taken by * the first operation. LDLM_FL_BL_AST is set by ldlm_callback_handler() in * the lock to prevent the Early Lock Cancel (ELC) code from cancelling it. */ #define LDLM_FL_BL_AST 0x0000400000000000ULL // bit 46 #define ldlm_is_bl_ast(_l) LDLM_TEST_FLAG(( _l), 1ULL << 46) #define ldlm_set_bl_ast(_l) LDLM_SET_FLAG(( _l), 1ULL << 46) #define ldlm_clear_bl_ast(_l) LDLM_CLEAR_FLAG((_l), 1ULL << 46) /** * Set by ldlm_cancel_callback() when lock cache is dropped to let * ldlm_callback_handler() return EINVAL to the server. It is used when * ELC RPC is already prepared and is waiting for rpc_lock, too late to * send a separate CANCEL RPC. */ #define LDLM_FL_BL_DONE 0x0000800000000000ULL // bit 47 #define ldlm_is_bl_done(_l) LDLM_TEST_FLAG(( _l), 1ULL << 47) #define ldlm_set_bl_done(_l) LDLM_SET_FLAG(( _l), 1ULL << 47) #define ldlm_clear_bl_done(_l) LDLM_CLEAR_FLAG((_l), 1ULL << 47) /** * Don't put lock into the LRU list, so that it is not canceled due * to aging. Used by MGC locks, they are cancelled only at unmount or * by callback. */ #define LDLM_FL_NO_LRU 0x0001000000000000ULL // bit 48 #define ldlm_is_no_lru(_l) LDLM_TEST_FLAG(( _l), 1ULL << 48) #define ldlm_set_no_lru(_l) LDLM_SET_FLAG(( _l), 1ULL << 48) #define ldlm_clear_no_lru(_l) LDLM_CLEAR_FLAG((_l), 1ULL << 48) /** * Set for locks that failed and where the server has been notified. * * Protected by lock and resource locks. */ #define LDLM_FL_FAIL_NOTIFIED 0x0002000000000000ULL // bit 49 #define ldlm_is_fail_notified(_l) LDLM_TEST_FLAG(( _l), 1ULL << 49) #define ldlm_set_fail_notified(_l) LDLM_SET_FLAG(( _l), 1ULL << 49) #define ldlm_clear_fail_notified(_l) LDLM_CLEAR_FLAG((_l), 1ULL << 49) /** * Set for locks that were removed from class hash table and will * be destroyed when last reference to them is released. Set by * ldlm_lock_destroy_internal(). * * Protected by lock and resource locks. */ #define LDLM_FL_DESTROYED 0x0004000000000000ULL // bit 50 #define ldlm_is_destroyed(_l) LDLM_TEST_FLAG(( _l), 1ULL << 50) #define ldlm_set_destroyed(_l) LDLM_SET_FLAG(( _l), 1ULL << 50) #define ldlm_clear_destroyed(_l) LDLM_CLEAR_FLAG((_l), 1ULL << 50) /** flag whether this is a server namespace lock */ #define LDLM_FL_SERVER_LOCK 0x0008000000000000ULL // bit 51 #define ldlm_is_server_lock(_l) LDLM_TEST_FLAG(( _l), 1ULL << 51) #define ldlm_set_server_lock(_l) LDLM_SET_FLAG(( _l), 1ULL << 51) #define ldlm_clear_server_lock(_l) LDLM_CLEAR_FLAG((_l), 1ULL << 51) /** * It's set in lock_res_and_lock() and unset in unlock_res_and_lock(). * * NB: compared with check_res_locked(), checking this bit is cheaper. * Also, spin_is_locked() is deprecated for kernel code; one reason is * because it works only for SMP so user needs to add extra macros like * LASSERT_SPIN_LOCKED for uniprocessor kernels. */ #define LDLM_FL_RES_LOCKED 0x0010000000000000ULL // bit 52 #define ldlm_is_res_locked(_l) LDLM_TEST_FLAG(( _l), 1ULL << 52) #define ldlm_set_res_locked(_l) LDLM_SET_FLAG(( _l), 1ULL << 52) #define ldlm_clear_res_locked(_l) LDLM_CLEAR_FLAG((_l), 1ULL << 52) /** * It's set once we call ldlm_add_waiting_lock_res_locked() to start the * lock-timeout timer and it will never be reset. * * Protected by lock and resource locks. */ #define LDLM_FL_WAITED 0x0020000000000000ULL // bit 53 #define ldlm_is_waited(_l) LDLM_TEST_FLAG(( _l), 1ULL << 53) #define ldlm_set_waited(_l) LDLM_SET_FLAG(( _l), 1ULL << 53) #define ldlm_clear_waited(_l) LDLM_CLEAR_FLAG((_l), 1ULL << 53) /** Flag whether this is a server namespace lock. */ #define LDLM_FL_NS_SRV 0x0040000000000000ULL // bit 54 #define ldlm_is_ns_srv(_l) LDLM_TEST_FLAG(( _l), 1ULL << 54) #define ldlm_set_ns_srv(_l) LDLM_SET_FLAG(( _l), 1ULL << 54) #define ldlm_clear_ns_srv(_l) LDLM_CLEAR_FLAG((_l), 1ULL << 54) /** Flag whether this lock can be reused. Used by exclusive open. */ #define LDLM_FL_EXCL 0x0080000000000000ULL // bit 55 #define ldlm_is_excl(_l) LDLM_TEST_FLAG(( _l), 1ULL << 55) #define ldlm_set_excl(_l) LDLM_SET_FLAG(( _l), 1ULL << 55) #define ldlm_clear_excl(_l) LDLM_CLEAR_FLAG((_l), 1ULL << 55) /** Flag whether a lock is found on server for re-sent RPC. */ #define LDLM_FL_RESENT 0x0100000000000000ULL // bit 56 /** Flag whether Commit-on-Sharing is enabled, if LDLM_FL_COS_INCOMPAT is set * this flag may not be set because once the former is set this flag won't be * checked, and for cross-MDT lock COS_INCOMPAT is always set but ast handle is * in ldlm context which doesn't know whether COS is enabled or not. */ #define LDLM_FL_COS_ENABLED 0x0200000000000000ULL /* bit 57 */ #define ldlm_is_cos_enabled(_l) LDLM_TEST_FLAG((_l), 1ULL << 57) #define ldlm_set_cos_enabled(_l) LDLM_SET_FLAG((_l), 1ULL << 57) /** * This flags means to use non-delay RPC to send dlm request RPC. */ #define LDLM_FL_NDELAY 0x0400000000000000ULL /* bit 58 */ #define ldlm_is_ndelay(_l) LDLM_TEST_FLAG((_l), 1ULL << 58) #define ldlm_set_ndelay(_l) LDLM_SET_FLAG((_l), 1ULL << 58) /** * LVB from this lock is cached in osc object */ #define LDLM_FL_LVB_CACHED 0x0800000000000000ULL /* bit 59 */ #define ldlm_is_lvb_cached(_l) LDLM_TEST_FLAG((_l), 1ULL << 59) #define ldlm_set_lvb_cached(_l) LDLM_SET_FLAG((_l), 1ULL << 59) #define ldlm_clear_lvb_cached(_l) LDLM_CLEAR_FLAG((_l), 1ULL << 59) /** l_flags bits marked as "ast" bits */ #define LDLM_FL_AST_MASK (LDLM_FL_FLOCK_DEADLOCK |\ LDLM_FL_DISCARD_DATA) /** l_flags bits marked as "blocked" bits */ #define LDLM_FL_BLOCKED_MASK (LDLM_FL_BLOCK_GRANTED |\ LDLM_FL_BLOCK_WAIT) /** l_flags bits marked as "gone" bits */ #define LDLM_FL_GONE_MASK (LDLM_FL_DESTROYED |\ LDLM_FL_FAILED) /** l_flags bits marked as "inherit" bits * Flags inherited from wire on enqueue/reply between client/server. * CANCEL_ON_BLOCK so server will not grant if a blocking lock is found * NO_TIMEOUT flag to force ldlm_lock_match() to wait with no timeout. * TEST_LOCK flag to not let TEST lock to be granted. * NO_EXPANSION to tell server not to expand extent of lock request */ #define LDLM_FL_INHERIT_MASK (LDLM_FL_CANCEL_ON_BLOCK |\ LDLM_FL_NO_TIMEOUT |\ LDLM_FL_TEST_LOCK |\ LDLM_FL_NO_EXPANSION) /** flags returned in @flags parameter on ldlm_lock_enqueue, * to be re-constructed on re-send */ #define LDLM_FL_SRV_ENQ_MASK (LDLM_FL_LOCK_CHANGED |\ LDLM_FL_BLOCKED_MASK |\ LDLM_FL_NO_TIMEOUT) /** test for ldlm_lock flag bit set */ #define LDLM_TEST_FLAG(_l, _b) (((_l)->l_flags & (_b)) != 0) /** multi-bit test: are any of mask bits set? */ #define LDLM_HAVE_MASK(_l, _m) (((_l)->l_flags & LDLM_FL_##_m##_MASK) != 0) /** set a ldlm_lock flag bit */ #define LDLM_SET_FLAG(_l, _b) ((_l)->l_flags |= (_b)) /** clear a ldlm_lock flag bit */ #define LDLM_CLEAR_FLAG(_l, _b) ((_l)->l_flags &= ~(_b)) /** @} subgroup */ /** @} group */ #endif /* LDLM_ALL_FLAGS_MASK */