aboutsummaryrefslogtreecommitdiffstats
path: root/fs/dlm
diff options
context:
space:
mode:
authorDavid Teigland <teigland@redhat.com>2006-12-13 11:38:45 -0500
committerSteven Whitehouse <swhiteho@redhat.com>2007-02-05 13:35:56 -0500
commitda49f36f4f64feb281d7663be99e779b2aecc607 (patch)
tree53e2a66d70eac2d2d3ab4ff9ced6a2d674c0c815 /fs/dlm
parent9e971b715dcc3cd5f4383f2815aaa7e5853d1f7b (diff)
[DLM] fix send_args() lvb copying
The send_args() function is used to copy parameters into a message for a number different message types. Only some of those types are set up beforehand (in create_message) to include space for sending lvb data. send_args was wrongly copying the lvb for all message types as long as the lock had an lvb. This means that the lvb data was being written past the end of the message into unknown space. Signed-off-by: David Teigland <teigland@redhat.com> Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
Diffstat (limited to 'fs/dlm')
-rw-r--r--fs/dlm/lock.c20
1 files changed, 16 insertions, 4 deletions
diff --git a/fs/dlm/lock.c b/fs/dlm/lock.c
index 69ada5887078..cdf2cb9297fd 100644
--- a/fs/dlm/lock.c
+++ b/fs/dlm/lock.c
@@ -2144,12 +2144,24 @@ static void send_args(struct dlm_rsb *r, struct dlm_lkb *lkb,
2144 if (lkb->lkb_astaddr) 2144 if (lkb->lkb_astaddr)
2145 ms->m_asts |= AST_COMP; 2145 ms->m_asts |= AST_COMP;
2146 2146
2147 if (ms->m_type == DLM_MSG_REQUEST || ms->m_type == DLM_MSG_LOOKUP) 2147 /* compare with switch in create_message; send_remove() doesn't
2148 memcpy(ms->m_extra, r->res_name, r->res_length); 2148 use send_args() */
2149 2149
2150 else if (lkb->lkb_lvbptr) 2150 switch (ms->m_type) {
2151 case DLM_MSG_REQUEST:
2152 case DLM_MSG_LOOKUP:
2153 memcpy(ms->m_extra, r->res_name, r->res_length);
2154 break;
2155 case DLM_MSG_CONVERT:
2156 case DLM_MSG_UNLOCK:
2157 case DLM_MSG_REQUEST_REPLY:
2158 case DLM_MSG_CONVERT_REPLY:
2159 case DLM_MSG_GRANT:
2160 if (!lkb->lkb_lvbptr)
2161 break;
2151 memcpy(ms->m_extra, lkb->lkb_lvbptr, r->res_ls->ls_lvblen); 2162 memcpy(ms->m_extra, lkb->lkb_lvbptr, r->res_ls->ls_lvblen);
2152 2163 break;
2164 }
2153} 2165}
2154 2166
2155static int send_common(struct dlm_rsb *r, struct dlm_lkb *lkb, int mstype) 2167static int send_common(struct dlm_rsb *r, struct dlm_lkb *lkb, int mstype)