Skip to contentSkip to conversation

dlm: no directory option

PATCH New David Teigland 1 participant 1 message Jul 15, 2005

lore
Share & tools
lore
#0 lore raw

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.

drivers/dlm/dir.c +15 -16
Index: linux/drivers/dlm/dir.c
===================================================================
@@ -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 *l
 	return 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_ls 
 		for (;;) {
 			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
Index: linux/drivers/dlm/dir.h
===================================================================
@@ -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
Index: linux/drivers/dlm/dlm_internal.h
===================================================================
@@ -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
Index: linux/drivers/dlm/lock.h
===================================================================
@@ -26,6 +26,7 @@ int dlm_remove_from_waiters(struct dlm_l
 void 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
Index: linux/drivers/dlm/lockspace.c
===================================================================
@@ -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, int
 	memset(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, int
 	return 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
Index: linux/drivers/dlm/rcom.c
===================================================================
@@ -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
Index: linux/drivers/dlm/recoverd.c
===================================================================
@@ -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
Index: linux/drivers/dlm/util.c
===================================================================
@@ -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
Index: linux/include/linux/dlm.h
===================================================================
@@ -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

--