Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

dlm: use proper C for dlm/requestqueue stuff (and fix alignment bug)

a) don't cast the pointer to dlm_header *, we use it as dlm_message *
anyway.
b) we copy the message into a queue element, then pass the pointer to
copy to dlm_receive_message_saved(); declare it properly to make sure
that we have the right alignment.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: David Teigland <teigland@redhat.com>

authored by

Al Viro and committed by
David Teigland
8b0d8e03 8af03e78

+8 -8
+1 -1
fs/dlm/lock.c
··· 3802 3802 int nodeid) 3803 3803 { 3804 3804 if (dlm_locking_stopped(ls)) { 3805 - dlm_add_requestqueue(ls, nodeid, (struct dlm_header *) ms); 3805 + dlm_add_requestqueue(ls, nodeid, ms); 3806 3806 } else { 3807 3807 dlm_wait_requestqueue(ls); 3808 3808 _receive_message(ls, ms);
+6 -6
fs/dlm/requestqueue.c
··· 20 20 struct rq_entry { 21 21 struct list_head list; 22 22 int nodeid; 23 - char request[0]; 23 + struct dlm_message request; 24 24 }; 25 25 26 26 /* ··· 30 30 * lockspace is enabled on some while still suspended on others. 31 31 */ 32 32 33 - void dlm_add_requestqueue(struct dlm_ls *ls, int nodeid, struct dlm_header *hd) 33 + void dlm_add_requestqueue(struct dlm_ls *ls, int nodeid, struct dlm_message *ms) 34 34 { 35 35 struct rq_entry *e; 36 - int length = hd->h_length; 36 + int length = ms->m_header.h_length - sizeof(struct dlm_message); 37 37 38 38 e = kmalloc(sizeof(struct rq_entry) + length, GFP_KERNEL); 39 39 if (!e) { ··· 42 42 } 43 43 44 44 e->nodeid = nodeid; 45 - memcpy(e->request, hd, length); 45 + memcpy(&e->request, ms, ms->m_header.h_length); 46 46 47 47 mutex_lock(&ls->ls_requestqueue_mutex); 48 48 list_add_tail(&e->list, &ls->ls_requestqueue); ··· 76 76 e = list_entry(ls->ls_requestqueue.next, struct rq_entry, list); 77 77 mutex_unlock(&ls->ls_requestqueue_mutex); 78 78 79 - dlm_receive_message_saved(ls, (struct dlm_message *)e->request); 79 + dlm_receive_message_saved(ls, &e->request); 80 80 81 81 mutex_lock(&ls->ls_requestqueue_mutex); 82 82 list_del(&e->list); ··· 176 176 177 177 mutex_lock(&ls->ls_requestqueue_mutex); 178 178 list_for_each_entry_safe(e, safe, &ls->ls_requestqueue, list) { 179 - ms = (struct dlm_message *) e->request; 179 + ms = &e->request; 180 180 181 181 if (purge_request(ls, ms, e->nodeid)) { 182 182 list_del(&e->list);
+1 -1
fs/dlm/requestqueue.h
··· 13 13 #ifndef __REQUESTQUEUE_DOT_H__ 14 14 #define __REQUESTQUEUE_DOT_H__ 15 15 16 - void dlm_add_requestqueue(struct dlm_ls *ls, int nodeid, struct dlm_header *hd); 16 + void dlm_add_requestqueue(struct dlm_ls *ls, int nodeid, struct dlm_message *ms); 17 17 int dlm_process_requestqueue(struct dlm_ls *ls); 18 18 void dlm_wait_requestqueue(struct dlm_ls *ls); 19 19 void dlm_purge_requestqueue(struct dlm_ls *ls);