Messages in this thread Patch in this message | | | From | Sean Nyekjaer <> | Subject | [PATCH v5 2/4] mtd: mtdconcat: don't use mtd_{suspend,resume}() | Date | Tue, 2 Nov 2021 12:02:02 +0100 |
| |
From: Boris Brezillon <boris.brezillon@collabora.com>
The MTD suspend logic will soon be adjusted to automatically wait for device wake-up before issuing IOs. In order to do that a new read-write lock will be added and taken in write-mode in the mtd_{suspend,resume}() path. Since mtdconcat.c itself is an MTD device, calling mtd_suspend/resume() on subdevices from the mtdconcat ->_{suspend,resume}() hook will lead to a nested lock, which lockdep will complain about if we don't add a proper annotation. Let's keep things simple and replace those mtd_{suspend,resume}(subdev) calls by subdev->_{suspend,resume}() ones to avoid this situation.
Tested-by: Sean Nyekjaer <sean@geanix.com> Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com> Signed-off-by: Sean Nyekjaer <sean@geanix.com> --- drivers/mtd/mtdconcat.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-)
diff --git a/drivers/mtd/mtdconcat.c b/drivers/mtd/mtdconcat.c index f685a581df48..f4a4274489b4 100644 --- a/drivers/mtd/mtdconcat.c +++ b/drivers/mtd/mtdconcat.c @@ -566,9 +566,15 @@ static int concat_suspend(struct mtd_info *mtd) for (i = 0; i < concat->num_subdev; i++) { struct mtd_info *subdev = concat->subdev[i]; - if ((rc = mtd_suspend(subdev)) < 0) + /* + * Call the MTD hook directly to avoid a nested lock + * on ->suspend_lock. + */ + rc = subdev->_suspend ? subdev->_suspend(subdev) : 0; + if (rc < 0) return rc; } + return rc; } @@ -579,7 +585,12 @@ static void concat_resume(struct mtd_info *mtd) for (i = 0; i < concat->num_subdev; i++) { struct mtd_info *subdev = concat->subdev[i]; - mtd_resume(subdev); + /* + * Call the MTD hook directly to avoid a nested lock + * on ->resume_lock. + */ + if (subdev->_resume) + subdev->_resume(subdev); } } -- 2.33.0
| |