[Linux-cluster] [PATCH] Fix hang of gfs2 mount if older dlm_controld is used

Goldwyn Rodrigues rgoldwyn at gmail.com
Thu Sep 26 17:24:49 UTC 2013


This folds ops_results and error into one. This enables the
error code to trickle all the way to the calling function and the gfs2
mount fails if older dlm_controld is used.

Signed-off-by: Goldwyn Rodrigues <rgoldwyn at suse.com>

--- 
diff --git a/fs/dlm/lockspace.c b/fs/dlm/lockspace.c
index 88556dc..8c8327a 100644
--- a/fs/dlm/lockspace.c
+++ b/fs/dlm/lockspace.c
@@ -409,7 +409,7 @@ static void threads_stop(void)
 static int new_lockspace(const char *name, const char *cluster,
 			 uint32_t flags, int lvblen,
 			 const struct dlm_lockspace_ops *ops, void *ops_arg,
-			 int *ops_result, dlm_lockspace_t **lockspace)
+			 dlm_lockspace_t **lockspace)
 {
 	struct dlm_ls *ls;
 	int i, size, error;
@@ -431,11 +431,9 @@ static int new_lockspace(const char *name, const char *cluster,
 		goto out;
 	}
 
-	if (ops && ops_result) {
-	       	if (!dlm_config.ci_recover_callbacks)
-			*ops_result = -EOPNOTSUPP;
-		else
-			*ops_result = 0;
+	if (ops && (!dlm_config.ci_recover_callbacks)) {
+			error = -EOPNOTSUPP;
+			goto out;
 	}
 
 	if (dlm_config.ci_recover_callbacks && cluster &&
@@ -679,7 +677,7 @@ static int new_lockspace(const char *name, const char *cluster,
 int dlm_new_lockspace(const char *name, const char *cluster,
 		      uint32_t flags, int lvblen,
 		      const struct dlm_lockspace_ops *ops, void *ops_arg,
-		      int *ops_result, dlm_lockspace_t **lockspace)
+		      dlm_lockspace_t **lockspace)
 {
 	int error = 0;
 
@@ -690,7 +688,7 @@ int dlm_new_lockspace(const char *name, const char *cluster,
 		goto out;
 
 	error = new_lockspace(name, cluster, flags, lvblen, ops, ops_arg,
-			      ops_result, lockspace);
+			      lockspace);
 	if (!error)
 		ls_count++;
 	if (error > 0)
diff --git a/fs/dlm/user.c b/fs/dlm/user.c
index 8121491..a29dd09 100644
--- a/fs/dlm/user.c
+++ b/fs/dlm/user.c
@@ -393,7 +393,7 @@ static int device_create_lockspace(struct dlm_lspace_params *params)
 		return -EPERM;
 
 	error = dlm_new_lockspace(params->name, NULL, params->flags,
-				  DLM_USER_LVB_LEN, NULL, NULL, NULL,
+				  DLM_USER_LVB_LEN, NULL, NULL,
 				  &lockspace);
 	if (error)
 		return error;
diff --git a/fs/gfs2/lock_dlm.c b/fs/gfs2/lock_dlm.c
index c8423d6..2043544 100644
--- a/fs/gfs2/lock_dlm.c
+++ b/fs/gfs2/lock_dlm.c
@@ -1190,7 +1190,7 @@ static int gdlm_mount(struct gfs2_sbd *sdp, const char *table)
 	char cluster[GFS2_LOCKNAME_LEN];
 	const char *fsname;
 	uint32_t flags;
-	int error, ops_result;
+	int error;
 
 	/*
 	 * initialize everything
@@ -1232,24 +1232,13 @@ static int gdlm_mount(struct gfs2_sbd *sdp, const char *table)
 	 */
 
 	error = dlm_new_lockspace(fsname, cluster, flags, GDLM_LVB_SIZE,
-				  &gdlm_lockspace_ops, sdp, &ops_result,
+				  &gdlm_lockspace_ops, sdp,
 				  &ls->ls_dlm);
 	if (error) {
 		fs_err(sdp, "dlm_new_lockspace error %d\n", error);
 		goto fail_free;
 	}
 
-	if (ops_result < 0) {
-		/*
-		 * dlm does not support ops callbacks,
-		 * old dlm_controld/gfs_controld are used, try without ops.
-		 */
-		fs_info(sdp, "dlm lockspace ops not used\n");
-		free_recover_size(ls);
-		set_bit(DFL_NO_DLM_OPS, &ls->ls_recover_flags);
-		return 0;
-	}
-
 	if (!test_bit(SDF_NOJOURNALID, &sdp->sd_flags)) {
 		fs_err(sdp, "dlm lockspace ops disallow jid preset\n");
 		error = -EINVAL;
diff --git a/fs/ocfs2/stack_user.c b/fs/ocfs2/stack_user.c
index 286edf1..6546a6b 100644
--- a/fs/ocfs2/stack_user.c
+++ b/fs/ocfs2/stack_user.c
@@ -828,7 +828,7 @@ static int user_cluster_connect(struct ocfs2_cluster_connection *conn)
 	}
 
 	rc = dlm_new_lockspace(conn->cc_name, NULL, DLM_LSFL_FS, DLM_LVB_LEN,
-			       NULL, NULL, NULL, &fsdlm);
+			       NULL, NULL, &fsdlm);
 	if (rc) {
 		ocfs2_live_connection_drop(control);
 		goto out;
diff --git a/include/linux/dlm.h b/include/linux/dlm.h
index d02da2c..9522b25 100644
--- a/include/linux/dlm.h
+++ b/include/linux/dlm.h
@@ -85,7 +85,7 @@ struct dlm_lockspace_ops {
 int dlm_new_lockspace(const char *name, const char *cluster,
 		      uint32_t flags, int lvblen,
 		      const struct dlm_lockspace_ops *ops, void *ops_arg,
-		      int *ops_result, dlm_lockspace_t **lockspace);
+		      dlm_lockspace_t **lockspace);
 
 /*
  * dlm_release_lockspace




More information about the Linux-cluster mailing list