#endif
#define LDLM_DEFAULT_MAX_ALIVE (cfs_time_seconds(36000))
#define LDLM_CTIME_AGE_LIMIT (10)
+#define LDLM_DEFAULT_PARALLEL_AST_LIMIT 1024
typedef enum {
ELDLM_OK = 0,
#define LDLM_FL_HAS_INTENT 0x001000 /* lock request has intent */
#define LDLM_FL_CANCELING 0x002000 /* lock cancel has already been sent */
#define LDLM_FL_LOCAL 0x004000 /* local lock (ie, no srv/cli split) */
-/* was LDLM_FL_WARN until 2.0.0 0x008000 */
#define LDLM_FL_DISCARD_DATA 0x010000 /* discard (no writeback) on cancel */
#define LDLM_FL_NO_TIMEOUT 0x020000 /* Blocked by group lock - wait
* indefinitely */
/* file & record locking */
-#define LDLM_FL_BLOCK_NOWAIT 0x040000 // server told not to wait if blocked
+#define LDLM_FL_BLOCK_NOWAIT 0x040000 /* server told not to wait if blocked.
+ * For AGL, OST will not send glimpse
+ * callback. */
#define LDLM_FL_TEST_LOCK 0x080000 // return blocking lock
/* XXX FIXME: This is being added to b_size as a low-risk fix to the fact that
* w/o involving separate thread. in order to decrease cs rate */
#define LDLM_FL_ATOMIC_CB 0x4000000
-/* was LDLM_FL_ASYNC until 2.0.0 0x8000000 */
-
/* It may happen that a client initiate 2 operations, e.g. unlink and mkdir,
* such that server send blocking ast for conflict locks to this client for
* the 1st operation, whereas the 2nd operation has canceled this lock and
__u64 l_flags;
__u32 l_readers;
__u32 l_writers;
- /*
- * 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.
- */
- __u8 l_destroyed;
- /**
- * flag whether this is a server namespace lock
- */
- __u8 l_ns_srv;
/**
* If the lock is granted, a process sleeps on this waitq to learn when
* it's no longer in use. If the lock is not granted, a process sleeps
struct ldlm_extent l_req_extent;
+ unsigned int l_failed:1,
+ /*
+ * 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.
+ */
+ l_destroyed:1,
+ /**
+ * flag whether this is a server namespace lock.
+ */
+ l_ns_srv:1;
+
/*
* Client-side-only members.
*/
*/
__u32 l_pid;
+ int l_bl_ast_run;
/**
* For ldlm_add_ast_work_item().
*/
cfs_list_t l_rk_ast;
struct ldlm_lock *l_blocking_lock;
- int l_bl_ast_run;
/**
* Protected by lr_lock, linkages to "skip lists".
/** referenced export object */
struct obd_export *l_exp_refs_target;
#endif
+ /** export blocking dlm lock list, protected by
+ * l_export->exp_bl_list_lock.
+ * Lock order of waiting_lists_spinlock, exp_bl_list_lock and res lock
+ * is: res lock -> exp_bl_list_lock -> wanting_lists_spinlock. */
+ cfs_list_t l_exp_list;
};
struct ldlm_resource {
int ldlm_lock_addref_try(struct lustre_handle *lockh, __u32 mode);
void ldlm_lock_decref(struct lustre_handle *lockh, __u32 mode);
void ldlm_lock_decref_and_cancel(struct lustre_handle *lockh, __u32 mode);
+void ldlm_lock_fail_match_locked(struct ldlm_lock *lock);
+void ldlm_lock_fail_match(struct ldlm_lock *lock);
void ldlm_lock_allow_match(struct ldlm_lock *lock);
void ldlm_lock_allow_match_locked(struct ldlm_lock *lock);
ldlm_mode_t ldlm_lock_match(struct ldlm_namespace *ns, int flags,