FAILED: patch "[PATCH] mei: bus: fix unlink on bus in error path" failed to apply to 5.4-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 5.4-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
Possible dependencies:
a43866856125 ("mei: bus: fix unlink on bus in error path") 2cca3465147d ("mei: bus: add client dma interface") e5617d2bf549 ("mei: bus: use zero vtag for bus clients.")
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From a43866856125c3c432e2fbb6cc63cee1539ec4a7 Mon Sep 17 00:00:00 2001
From: Alexander Usyskin <[email protected]>
Date: Tue, 13 Dec 2022 00:02:46 +0200
Subject: [PATCH] mei: bus: fix unlink on bus in error path
Unconditional call to mei_cl_unlink in mei_cl_bus_dev_release leads to call of the mei_cl_unlink without corresponding mei_cl_link. This leads to miscalculation of open_handle_count (decrease without increase).
Call unlink in mei_cldev_enable fail path and remove blanket unlink from mei_cl_bus_dev_release.
drivers/misc/mei/bus.c +8 -4
@@ -702,13 +702,15 @@ void *mei_cldev_dma_map(struct mei_cl_device *cldev, u8 buffer_id, size_t size)if (cl->state ==MEI_FILE_UNINITIALIZED ) { ret =mei_cl_link (cl);if (ret) - goto out; + goto notlinked;/* update pointers */ cl->cldev = cldev; } ret =mei_cl_dma_alloc_and_map (cl,NULL , buffer_id, size); -out: +if (ret) +mei_cl_unlink (cl); +notlinked:mutex_unlock (&bus->device_lock);if (ret)return ERR_PTR (ret);
@@ -758,7 +760,7 @@ int mei_cldev_enable(struct mei_cl_device *cldev)if (cl->state ==MEI_FILE_UNINITIALIZED ) { ret =mei_cl_link (cl);if (ret) - goto out; + goto notlinked;/* update pointers */ cl->cldev = cldev; }
@@ -785,6 +787,9 @@ int mei_cldev_enable(struct mei_cl_device *cldev) } out: +if (ret) +mei_cl_unlink (cl); +notlinked:mutex_unlock (&bus->device_lock);return ret;
@@ -1277,7 +1282,6 @@ static void mei_cl_bus_dev_release(struct device *dev)mei_cl_flush_queues (cldev->cl,NULL );mei_me_cl_put (cldev->me_cl);mei_dev_bus_put (cldev->bus); -mei_cl_unlink (cldev->cl);kfree (cldev->cl);kfree (cldev); }