dlm: no directory option
PATCH 8/12 dlm: no directory option
Per-lockspace option for dlm to run without using a resource directory. What would be the directory node for a resource is statically assigned to be the master node instead.
Signed-off-by David Teigland <[email protected]>
drivers/dlm/dir.c +15 -16
@@ -72,15 +72,14 @@ void dlm_clear_free_entries(struct dlm_l* * To give the exact range wanted (0 to num_nodes-1), we apply a modulus of * num_nodes to the hash value. This value in the desired range is used as an -* offset into the sorted list of nodeid's to give the particular nodeid of the -* directory node. +* offset into the sorted list of nodeid's to give the particular nodeid. */ -int dlm_dir_name2nodeid (struct dlm_ls *ls,char *name,int length) +int dlm_hash2nodeid (struct dlm_ls *ls,uint32_t hash) {struct list_head *tmp;struct dlm_member *memb =NULL ; -uint32_t hash, node, n =0 ; +uint32_t node, n =0 ;int nodeid;if (ls->ls_num_nodes ==1 ) {
@@ -88,8 +87,6 @@ int dlm_dir_name2nodeid(struct dlm_ls *l goto out; } - hash =dlm_hash (name, length); -if (ls->ls_node_array) { node = (hash >>16 ) % ls->ls_total_weight; nodeid = ls->ls_node_array[node];
@@ -114,9 +111,9 @@ int dlm_dir_name2nodeid(struct dlm_ls *lreturn nodeid; } -int dlm_dir_nodeid (struct dlm_rsb *rsb) +int dlm_dir_nodeid (struct dlm_rsb *r) { -return dlm_dir_name2nodeid (rsb->res_ls, rsb->res_name, rsb->res_length); +return dlm_hash2nodeid (r->res_ls, r->res_hash); }static inline uint32_t dir_hash (struct dlm_ls *ls,char *name,int len)
@@ -202,12 +199,15 @@ int dlm_recover_directory(struct dlm_ls {struct dlm_member *memb;struct dlm_direntry *de; -char *b, *last_name; +char *b, *last_name =NULL ;int error = -ENOMEM , last_len, count =0 ;uint16_t namelen;log_debug (ls,"dlm_recover_directory" ); +if (dlm_no_directory (ls)) + goto out_status; +dlm_dir_clear (ls); last_name =kmalloc (DLM_RESNAME_MAXLEN ,GFP_KERNEL );
@@ -221,12 +221,12 @@ int dlm_recover_directory(struct dlm_lsfor (;;) { error =dlm_recovery_stopped (ls);if (error) - goto free_last; + goto out_free; error =dlm_rcom_names (ls, memb->nodeid, last_name, last_len);if (error) - goto free_last; + goto out_free;schedule ();
@@ -253,7 +253,7 @@ int dlm_recover_directory(struct dlm_ls error = -ENOMEM ; de =get_free_de (ls, namelen);if (!de) - goto free_last; + goto out_free; de->master_nodeid = memb->nodeid; de->length = namelen;
@@ -270,12 +270,11 @@ int dlm_recover_directory(struct dlm_ls ; } -dlm_set_recover_status (ls,DLM_RS_DIR ); + out_status: error =0 ; - +dlm_set_recover_status (ls,DLM_RS_DIR );log_debug (ls,"dlm_recover_directory %d entries" , count); - - free_last: + out_free:kfree (last_name); out:dlm_clear_free_entries (ls);
drivers/dlm/dir.h +1 -1
@@ -16,7 +16,7 @@int dlm_dir_nodeid (struct dlm_rsb *rsb); -int dlm_dir_name2nodeid (struct dlm_ls *ls,char *name,int length); +int dlm_hash2nodeid (struct dlm_ls *ls,uint32_t hash);void dlm_dir_remove_entry (struct dlm_ls *ls,int nodeid,char *name,int len);void dlm_dir_clear (struct dlm_ls *ls);void dlm_clear_free_entries (struct dlm_ls *ls);
drivers/dlm/dlm_internal.h +8 -0
@@ -270,6 +270,7 @@ struct dlm_rsb {int res_length;/* length of rsb name */ int res_nodeid;uint32_t res_lvbseq; +uint32_t res_hash;uint32_t res_bucket;/* rsbtbl */ unsigned long res_toss_time;uint32_t res_first_lkid;
@@ -364,6 +365,7 @@ struct dlm_message {uint32_t m_sbflags;uint32_t m_flags;uint32_t m_lvbseq; +uint32_t m_hash;int m_status;int m_grmode;int m_rqmode;
@@ -431,6 +433,7 @@ struct rcom_lock {struct dlm_ls {struct list_head ls_list;/* list of lockspaces */ uint32_t ls_global_id;/* global unique lockspace ID */ +uint32_t ls_exflags;int ls_lvblen;int ls_count;/* reference count */ unsigned long ls_flags;/* LSFL_ */
@@ -507,5 +510,10 @@ static inline int dlm_recovery_stopped(s return test_bit(LSFL_RECOVERY_STOP, &ls->ls_flags); } +static inline int dlm_no_directory (struct dlm_ls *ls) +{ +return (ls->ls_exflags &DLM_LSFL_NODIR ) ?1 :0 ; +} +#endif /* __DLM_INTERNAL_DOT_H__ */
drivers/dlm/lock.c +57 -7
143 lines not on this page · raw message
drivers/dlm/lock.h +1 -0
@@ -26,6 +26,7 @@ int dlm_remove_from_waiters(struct dlm_lvoid dlm_scan_rsbs (struct dlm_ls *ls);int dlm_purge_locks (struct dlm_ls *ls); +void dlm_purge_mstcpy_locks (struct dlm_rsb *r);int dlm_grant_after_purge (struct dlm_ls *ls);int dlm_recover_waiters_post (struct dlm_ls *ls);void dlm_recover_waiters_pre (struct dlm_ls *ls);
drivers/dlm/lockspace.c +5 -4
@@ -185,8 +185,8 @@ static void threads_stop(void)dlm_astd_stop (); } -static int new_lockspace (char *name,int namelen,void **lockspace,int flags, -int lvblen) +static int new_lockspace (char *name,int namelen,void **lockspace, +uint32_t flags,int lvblen) {struct dlm_ls *ls;int i, size, error = -ENOMEM ;
@@ -213,6 +213,7 @@ static int new_lockspace(char *name, intmemset (ls,0 ,sizeof (struct dlm_ls ) + namelen);memcpy (ls->ls_name, name, namelen); ls->ls_namelen = namelen; + ls->ls_exflags = flags; ls->ls_lvblen = lvblen; ls->ls_count =0 ; ls->ls_flags =0 ;
@@ -345,8 +346,8 @@ static int new_lockspace(char *name, intreturn error; } -int dlm_new_lockspace (char *name,int namelen,void **lockspace,int flags, -int lvblen) +int dlm_new_lockspace (char *name,int namelen,void **lockspace, +uint32_t flags,int lvblen) {int error =0 ;
drivers/dlm/rcom.c +7 -1
@@ -75,12 +75,18 @@ static void send_rcom(struct dlm_ls *ls,static void make_config (struct dlm_ls *ls,struct rcom_config *rf) { rf->rf_lvblen = ls->ls_lvblen; + rf->rf_lsflags = ls->ls_exflags; }static int check_config (struct dlm_ls *ls,struct rcom_config *rf) { -if (rf->rf_lvblen != ls->ls_lvblen) +if (rf->rf_lvblen != ls->ls_lvblen || + rf->rf_lsflags != ls->ls_exflags) { +log_error (ls,"config mismatch %d,%d %x,%x" , + rf->rf_lvblen, ls->ls_lvblen, + rf->rf_lsflags, ls->ls_exflags);return -EINVAL ; + }return 0 ; }
drivers/dlm/recover.c +47 -22
142 lines not on this page · raw message
drivers/dlm/recoverd.c +1 -1
@@ -122,7 +122,7 @@ static int ls_recover(struct dlm_ls *ls,if (error) goto fail; -if (neg) { +if (neg ||dlm_no_directory (ls)) {/* * Clear lkb's for departed nodes. */
drivers/dlm/requestqueue.c +51 -12
85 lines not on this page · raw message
drivers/dlm/util.c +2 -0
@@ -80,6 +80,7 @@ void dlm_message_out(struct dlm_message ms->m_sbflags =cpu_to_le32 (ms->m_sbflags); ms->m_flags =cpu_to_le32 (ms->m_flags); ms->m_lvbseq =cpu_to_le32 (ms->m_lvbseq); + ms->m_hash =cpu_to_le32 (ms->m_hash); ms->m_status =cpu_to_le32 (ms->m_status); ms->m_grmode =cpu_to_le32 (ms->m_grmode); ms->m_rqmode =cpu_to_le32 (ms->m_rqmode);
@@ -107,6 +108,7 @@ void dlm_message_in(struct dlm_message * ms->m_sbflags =le32_to_cpu (ms->m_sbflags); ms->m_flags =le32_to_cpu (ms->m_flags); ms->m_lvbseq =le32_to_cpu (ms->m_lvbseq); + ms->m_hash =le32_to_cpu (ms->m_hash); ms->m_status =le32_to_cpu (ms->m_status); ms->m_grmode =le32_to_cpu (ms->m_grmode); ms->m_rqmode =le32_to_cpu (ms->m_rqmode);
include/linux/dlm.h +3 -1
@@ -204,6 +204,8 @@ struct dlm_lksb {#ifdef __KERNEL__ +#define DLM_LSFL_NODIR 0x00000001 +/* * dlm_new_lockspace *
@@ -212,7 +214,7 @@ struct dlm_lksb {*/ int dlm_new_lockspace (char *name,int namelen,dlm_lockspace_t **lockspace, -int flags,int lvblen); +uint32_t flags,int lvblen);/* * dlm_release_lockspace
--