All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2] bcache: safeguard a dangerous addressing in closure_queue
@ 2017-10-13  5:30 Liang Chen
  2017-10-13  5:48 ` Michael Lyle
  0 siblings, 1 reply; 2+ messages in thread
From: Liang Chen @ 2017-10-13  5:30 UTC (permalink / raw)
  To: linux-bcache; +Cc: mlyle, i, kent.overstreet, linux-kernel, Liang Chen

The use of the union reduces the size of closure struct by taking advantage
of the current size of its members. The offset of func in work_struct equals
the size of the first three members, so that work.work_func will just
reference the forth member - fn.

This is smart but dangerous. It can be broken if work_struct or the other
structs get changed, and can be a bit difficult to debug.

Signed-off-by: Liang Chen <liangchen.linux@gmail.com>
---
Replacing all occurences of closure_fn to work_func_fn seems to be an option
but that would end up with a big lenghty and error prone patch.

 drivers/md/bcache/closure.h | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/drivers/md/bcache/closure.h b/drivers/md/bcache/closure.h
index 295b7e4..00fb314 100644
--- a/drivers/md/bcache/closure.h
+++ b/drivers/md/bcache/closure.h
@@ -251,6 +251,12 @@ static inline void set_closure_fn(struct closure *cl, closure_fn *fn,
 static inline void closure_queue(struct closure *cl)
 {
 	struct workqueue_struct *wq = cl->wq;
+	/**
+	 * Changes made to closure, work_struct, or a couple of other structs
+	 * may cause work.func not pointing to the right location.
+	 */
+	BUILD_BUG_ON(offsetof(struct closure, fn)
+		     != offsetof(struct work_struct, func));
 	if (wq) {
 		INIT_WORK(&cl->work, cl->work.func);
 		BUG_ON(!queue_work(wq, &cl->work));
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH v2] bcache: safeguard a dangerous addressing in closure_queue
  2017-10-13  5:30 [PATCH v2] bcache: safeguard a dangerous addressing in closure_queue Liang Chen
@ 2017-10-13  5:48 ` Michael Lyle
  0 siblings, 0 replies; 2+ messages in thread
From: Michael Lyle @ 2017-10-13  5:48 UTC (permalink / raw)
  To: Liang Chen, linux-bcache; +Cc: i, kent.overstreet, linux-kernel

Hi Liang--

Thanks for the quick turnaround.  I've added this to bcache-for-next.

On 10/12/2017 10:30 PM, Liang Chen wrote:
> The use of the union reduces the size of closure struct by taking advantage
> of the current size of its members. The offset of func in work_struct equals
> the size of the first three members, so that work.work_func will just
> reference the forth member - fn.
> 
> This is smart but dangerous. It can be broken if work_struct or the other
> structs get changed, and can be a bit difficult to debug.
> 
> Signed-off-by: Liang Chen <liangchen.linux@gmail.com>

Reviewed-by: Michael Lyle <mlyle@lyle.org>

-Mike

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2017-10-13  5:48 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-10-13  5:30 [PATCH v2] bcache: safeguard a dangerous addressing in closure_queue Liang Chen
2017-10-13  5:48 ` Michael Lyle

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.