--- /dev/null
+The Lustre Distributed Lock Manager
+-----------------------------------
+[[ldlm]]
+
+The discussion of the LDLM is deferred for now. We'll get into it soon
+enough.
+
+LDLM Structures
+~~~~~~~~~~~~~~~
+
+Lock Modes
+^^^^^^^^^^
+
+----
+typedef enum {
+ LCK_MINMODE = 0,
+ LCK_EX = 1,
+ LCK_PW = 2,
+ LCK_PR = 4,
+ LCK_CW = 8,
+ LCK_CR = 16,
+ LCK_NL = 32,
+ LCK_GROUP = 64,
+ LCK_COS = 128,
+ LCK_MAXMODE
+} ldlm_mode_t;
+----
+
+LDLM Extent
+^^^^^^^^^^^
+
+----
+struct ldlm_extent {
+ __u64 start;
+ __u64 end;
+ __u64 gid;
+};
+----
+
+LDLM Flock Wire
+^^^^^^^^^^^^^^^
+
+----
+struct ldlm_flock_wire {
+ __u64 lfw_start;
+ __u64 lfw_end;
+ __u64 lfw_owner;
+ __u32 lfw_padding;
+ __u32 lfw_pid;
+};
+----
+
+LDLM Inode Bits
+^^^^^^^^^^^^^^^
+
+----
+struct ldlm_inodebits {
+ __u64 bits;
+};
+----
+
+LDLM Wire Policy Data
+^^^^^^^^^^^^^^^^^^^^^
+
+----
+typedef union {
+ struct ldlm_extent l_extent;
+ struct ldlm_flock_wire l_flock;
+ struct ldlm_inodebits l_inodebits;
+} ldlm_wire_policy_data_t;
+----
+
+Resource Descriptor
+^^^^^^^^^^^^^^^^^^^
+
+----
+struct ldlm_resource_desc {
+ ldlm_type_t lr_type;
+ __u32 lr_padding; /* also fix lustre_swab_ldlm_resource_desc */
+ struct ldlm_res_id lr_name;
+};
+----
+
+The 'ldlm_type_t' is given by one of these values:
+----
+typedef enum {
+ LDLM_PLAIN = 10,
+ LDLM_EXTENT = 11,
+ LDLM_FLOCK = 12,
+ LDLM_IBITS = 13
+} ldlm_type_t;
+----
+
+Lock Descriptor
+^^^^^^^^^^^^^^^
+
+----
+struct ldlm_lock_desc {
+ struct ldlm_resource_desc l_resource;
+ ldlm_mode_t l_req_mode;
+ ldlm_mode_t l_granted_mode;
+ ldlm_wire_policy_data_t l_policy_data;
+};
+----
+
+Lock Request
+^^^^^^^^^^^^
+
+----
+#define LDLM_LOCKREQ_HANDLES 2
+struct ldlm_request {
+ __u32 lock_flags;
+ __u32 lock_count;
+ struct ldlm_lock_desc lock_desc;
+ struct lustre_handle lock_handle[LDLM_LOCKREQ_HANDLES];
+};
+----
+
+Lock Reply
+^^^^^^^^^^
+
+----
+struct ldlm_reply {
+ __u32 lock_flags;
+ __u32 lock_padding; /* also fix lustre_swab_ldlm_reply */
+ struct ldlm_lock_desc lock_desc;
+ struct lustre_handle lock_handle;
+ __u64 lock_policy_res1;
+ __u64 lock_policy_res2;
+};
+----
+
+Lock Value Block
+^^^^^^^^^^^^^^^^
+
+A lock value block is part of reply messages from servers when an
+LDLM_ENQUEUE command has been issued. There are two varieties. Which
+is chosen depends on the target.
+
+----
+struct ost_lvb_v1 {
+ __u64 lvb_size;
+ obd_time lvb_mtime;
+ obd_time lvb_atime;
+ obd_time lvb_ctime;
+ __u64 lvb_blocks;
+};
+struct ost_lvb {
+ __u64 lvb_size;
+ obd_time lvb_mtime;
+ obd_time lvb_atime;
+ obd_time lvb_ctime;
+ __u64 lvb_blocks;
+ __u32 lvb_mtime_ns;
+ __u32 lvb_atime_ns;
+ __u32 lvb_ctime_ns;
+ __u32 lvb_padding;
+};
+----