[PATCH] Fix oops on reboot in physmap

Jörn Engel joern at logfs.org
Thu Mar 13 04:22:24 EDT 2008


On Thu, 13 March 2008 09:42:42 +0100, Arnaud Patard wrote:
> 
> I sent this patch to David Woodhouse, but I forgot to put the list in
> CC: (and I'm not even sure that I used the right email address :( ). So,
> I'm sending the patch here so everyone can have my fix.

There were various small errors in it, afaics.  Does this patch achieve
the same result for you?

Added dwmw2 on Cc:.  This could be material for -stable.

Jörn

-- 
Prosperity makes friends, adversity tries them.
-- Publilius Syrus

Commit df66e7167ac756baf14d2b8ea7a2cfa056600a93 is adding support for multiple
resources in physmap. On shutdown/supend/resume, it's suspending all resources
by calling mtd[]->suspend() without checking the mtd[] is not null.
This makes oopsing my kernel.

Signed-off-by: Arnaud Patard <arnaud.patard at rtp-net.org>
Signed-Off-By: Joern Engel <joern at logfs.org>

diff --git a/drivers/mtd/maps/physmap.c b/drivers/mtd/maps/physmap.c
index f00e04e..1abecd5 100644
--- a/drivers/mtd/maps/physmap.c
+++ b/drivers/mtd/maps/physmap.c
@@ -204,7 +204,8 @@ static int physmap_flash_suspend(struct platform_device *dev, pm_message_t state
 
 	if (info)
 		for (i = 0; i < MAX_RESOURCES; i++)
-			ret |= info->mtd[i]->suspend(info->mtd[i]);
+			if (info->mtd[i])
+				ret |= info->mtd[i]->suspend(info->mtd[i]);
 
 	return ret;
 }
@@ -216,7 +217,8 @@ static int physmap_flash_resume(struct platform_device *dev)
 
 	if (info)
 		for (i = 0; i < MAX_RESOURCES; i++)
-			info->mtd[i]->resume(info->mtd[i]);
+			if (info->mtd[i])
+				info->mtd[i]->resume(info->mtd[i]);
 	return 0;
 }
 
@@ -225,9 +227,10 @@ static void physmap_flash_shutdown(struct platform_device *dev)
 	struct physmap_flash_info *info = platform_get_drvdata(dev);
 	int i;
 
-	for (i = 0; i < MAX_RESOURCES; i++)
-		if (info && info->mtd[i]->suspend(info->mtd[i]) == 0)
-			info->mtd[i]->resume(info->mtd[i]);
+	if (info)
+		for (i = 0; i < MAX_RESOURCES; i++)
+			if (info->mtd[i] && info->mtd[i]->suspend(info->mtd[i]) == 0)
+				info->mtd[i]->resume(info->mtd[i]);
 }
 #else
 #define physmap_flash_suspend NULL



More information about the linux-mtd mailing list