summaryrefslogtreecommitdiffstats
path: root/fs/dlm/rcom.c
diff options
context:
space:
mode:
authorDavid Teigland <teigland@redhat.com>2006-12-13 10:37:55 -0600
committerSteven Whitehouse <swhiteho@redhat.com>2007-02-05 13:35:53 -0500
commit9e971b715dcc3cd5f4383f2815aaa7e5853d1f7b (patch)
tree9f8ad2435aef01e725c1b7bc94ef5b787ab9bdf2 /fs/dlm/rcom.c
parent38aa8b0c59c35d10d15ebf00ceee641f9ed7acba (diff)
downloadlinux-stable-9e971b715dcc3cd5f4383f2815aaa7e5853d1f7b.tar.gz
linux-stable-9e971b715dcc3cd5f4383f2815aaa7e5853d1f7b.tar.bz2
linux-stable-9e971b715dcc3cd5f4383f2815aaa7e5853d1f7b.zip
[DLM] add version check
Check if we receive a message from another lockspace member running a version of the dlm with an incompatible inter-node message protocol. Signed-off-by: David Teigland <teigland@redhat.com> Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
Diffstat (limited to 'fs/dlm/rcom.c')
-rw-r--r--fs/dlm/rcom.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/fs/dlm/rcom.c b/fs/dlm/rcom.c
index 521ad9bb47b7..54fba9bd6740 100644
--- a/fs/dlm/rcom.c
+++ b/fs/dlm/rcom.c
@@ -82,8 +82,17 @@ static void make_config(struct dlm_ls *ls, struct rcom_config *rf)
rf->rf_lsflags = ls->ls_exflags;
}
-static int check_config(struct dlm_ls *ls, struct rcom_config *rf, int nodeid)
+static int check_config(struct dlm_ls *ls, struct dlm_rcom *rc, int nodeid)
{
+ struct rcom_config *rf = (struct rcom_config *) rc->rc_buf;
+
+ if ((rc->rc_header.h_version & 0xFFFF0000) != DLM_HEADER_MAJOR) {
+ log_error(ls, "version mismatch: %x nodeid %d: %x",
+ DLM_HEADER_MAJOR | DLM_HEADER_MINOR, nodeid,
+ rc->rc_header.h_version);
+ return -EINVAL;
+ }
+
if (rf->rf_lvblen != ls->ls_lvblen ||
rf->rf_lsflags != ls->ls_exflags) {
log_error(ls, "config mismatch: %d,%x nodeid %d: %d,%x",
@@ -145,8 +154,7 @@ int dlm_rcom_status(struct dlm_ls *ls, int nodeid)
log_debug(ls, "remote node %d not ready", nodeid);
rc->rc_result = 0;
} else
- error = check_config(ls, (struct rcom_config *) rc->rc_buf,
- nodeid);
+ error = check_config(ls, rc, nodeid);
/* the caller looks at rc_result for the remote recovery status */
out:
return error;