* [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.