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; }; ----