Skip to content

Commit

Permalink
dlm: add node slots and generation
Browse files Browse the repository at this point in the history
Slot numbers are assigned to nodes when they join the lockspace.
The slot number chosen is the minimum unused value starting at 1.
Once a node is assigned a slot, that slot number will not change
while the node remains a lockspace member.  If the node leaves
and rejoins it can be assigned a new slot number.

A new generation number is also added to a lockspace.  It is
set and incremented during each recovery along with the slot
collection/assignment.

The slot numbers will be passed to gfs2 which will use them as
journal id's.

Signed-off-by: David Teigland <[email protected]>
  • Loading branch information
teigland committed Jan 4, 2012
1 parent f95a34c commit 757a427
Show file tree
Hide file tree
Showing 7 changed files with 480 additions and 29 deletions.
48 changes: 46 additions & 2 deletions fs/dlm/dlm_internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,18 @@ struct dlm_member {
struct list_head list;
int nodeid;
int weight;
int slot;
int slot_prev;
uint32_t generation;
};

/*
* low nodeid saves array of these in ls_slots
*/

struct dlm_slot {
int nodeid;
int slot;
};

/*
Expand Down Expand Up @@ -337,7 +349,9 @@ static inline int rsb_flag(struct dlm_rsb *r, enum rsb_flags flag)
/* dlm_header is first element of all structs sent between nodes */

#define DLM_HEADER_MAJOR 0x00030000
#define DLM_HEADER_MINOR 0x00000000
#define DLM_HEADER_MINOR 0x00000001

#define DLM_HEADER_SLOTS 0x00000001

#define DLM_MSG 1
#define DLM_RCOM 2
Expand Down Expand Up @@ -425,10 +439,34 @@ union dlm_packet {
struct dlm_rcom rcom;
};

#define DLM_RSF_NEED_SLOTS 0x00000001

/* RCOM_STATUS data */
struct rcom_status {
__le32 rs_flags;
__le32 rs_unused1;
__le64 rs_unused2;
};

/* RCOM_STATUS_REPLY data */
struct rcom_config {
__le32 rf_lvblen;
__le32 rf_lsflags;
__le64 rf_unused;

/* DLM_HEADER_SLOTS adds: */
__le32 rf_flags;
__le16 rf_our_slot;
__le16 rf_num_slots;
__le32 rf_generation;
__le32 rf_unused1;
__le64 rf_unused2;
};

struct rcom_slot {
__le32 ro_nodeid;
__le16 ro_slot;
__le16 ro_unused1;
__le64 ro_unused2;
};

struct rcom_lock {
Expand All @@ -455,6 +493,7 @@ struct dlm_ls {
struct list_head ls_list; /* list of lockspaces */
dlm_lockspace_t *ls_local_handle;
uint32_t ls_global_id; /* global unique lockspace ID */
uint32_t ls_generation;
uint32_t ls_exflags;
int ls_lvblen;
int ls_count; /* refcount of processes in
Expand Down Expand Up @@ -493,6 +532,11 @@ struct dlm_ls {
int ls_total_weight;
int *ls_node_array;

int ls_slot;
int ls_num_slots;
int ls_slots_size;
struct dlm_slot *ls_slots;

struct dlm_rsb ls_stub_rsb; /* for returning errors */
struct dlm_lkb ls_stub_lkb; /* for returning errors */
struct dlm_message ls_stub_ms; /* for faking a reply */
Expand Down
5 changes: 5 additions & 0 deletions fs/dlm/lockspace.c
Original file line number Diff line number Diff line change
Expand Up @@ -525,6 +525,11 @@ static int new_lockspace(const char *name, int namelen, void **lockspace,
if (!ls->ls_recover_buf)
goto out_dirfree;

ls->ls_slot = 0;
ls->ls_num_slots = 0;
ls->ls_slots_size = 0;
ls->ls_slots = NULL;

INIT_LIST_HEAD(&ls->ls_recover_list);
spin_lock_init(&ls->ls_recover_list_lock);
ls->ls_recover_list_count = 0;
Expand Down
Loading

0 comments on commit 757a427

Please sign in to comment.