/*
* Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
+ *
+ * Copyright (c) 2010 Whamcloud, Inc
+ *
*/
/*
* This file is part of Lustre, http://www.lustre.org/
#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,
* list. */
#define LDLM_FL_KMS_IGNORE 0x200000
+/* 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 0x400000
+
/* 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
* Limit size of nolock requests, in bytes.
*/
unsigned ns_max_nolock_size;
+
+ /**
+ * Limit of parallel AST RPC count.
+ */
+ unsigned ns_max_parallel_ast;
+
/* callback to cancel locks before replaying it during recovery */
ldlm_cancel_for_recovery ns_cancel_for_recovery;
/**
* ldlm lock stats
*/
struct lprocfs_stats *ns_stats;
+
+ unsigned ns_stopping:1; /* namespace cleanup */
};
static inline int ns_is_client(struct ldlm_namespace *ns)
* in the same RPC */
} ldlm_cancel_flags_t;
+struct ldlm_flock {
+ __u64 start;
+ __u64 end;
+ __u64 owner;
+ __u64 blocking_owner;
+ void *blocking_export;
+ __u32 pid;
+};
+
+typedef union {
+ struct ldlm_extent l_extent;
+ struct ldlm_flock l_flock;
+ struct ldlm_inodebits l_inodebits;
+} ldlm_policy_data_t;
+
+void ldlm_convert_policy_to_wire(ldlm_type_t type,
+ const ldlm_policy_data_t *lpolicy,
+ ldlm_wire_policy_data_t *wpolicy);
+void ldlm_convert_policy_to_local(ldlm_type_t type,
+ const ldlm_wire_policy_data_t *wpolicy,
+ ldlm_policy_data_t *lpolicy);
+
struct ldlm_lock {
/**
* Must be first in the structure.
struct ldlm_interval_tree lr_itree[LCK_MODE_NUM]; /* interval trees*/
/* Server-side-only lock value block elements */
+ /** to serialize lvbo_init */
cfs_semaphore_t lr_lvb_sem;
__u32 lr_lvb_len;
+ /** protect by lr_lock */
void *lr_lvb_data;
/* when the resource was considered as contended */
void *ei_cb_gl; /* lock glimpse callback */
void *ei_cb_wg; /* lock weigh callback */
void *ei_cbdata; /* Data to be passed into callbacks. */
- short ei_async:1; /* async request */
};
extern struct obd_ops ldlm_obd_ops;
struct ldlm_lock *__ldlm_handle2lock(const struct lustre_handle *, int flags);
void ldlm_cancel_callback(struct ldlm_lock *);
int ldlm_lock_remove_from_lru(struct ldlm_lock *);
+int ldlm_lock_set_data(struct lustre_handle *, void *);
static inline struct ldlm_lock *ldlm_handle2lock(const struct lustre_handle *h)
{
const struct ldlm_res_id *, ldlm_type_t type,
ldlm_policy_data_t *, ldlm_mode_t mode,
struct lustre_handle *, int unref);
+ldlm_mode_t ldlm_revalidate_lock_handle(struct lustre_handle *lockh,
+ __u64 *bits);
struct ldlm_resource *ldlm_lock_convert(struct ldlm_lock *lock, int new_mode,
__u32 *flags);
void ldlm_lock_downgrade(struct ldlm_lock *lock, int new_mode);