Re-entrancy of flash erase/write

Robert Kaiser rob at sysgo.de
Mon Feb 25 11:54:33 EST 2002



On Mon, 25 Feb 2002, Adam Wozniak wrote:

> ENABLE/DISABLE_VPP  call the map_info set_vpp function
> For the physmap_map map_info, there is no set_vpp, it is NULL
> 
> So for people who use physmap_map anyway, they won't see the behavior
> you are describing.  I suspect it is the same for other maps.


Hmm, so you are suggesting that this problem has not been noticed
because so few people have set_vpp() functions these days ?

If that is the case, may I suggest the attached patch. It solved the
problem for me.

[David, OK to apply this ?]

Rob

----------------------------------------------------------------
Robert Kaiser                          email: rkaiser at sysgo.de
SYSGO RTS GmbH
Am Pfaffenstein 14
D-55270 Klein-Winternheim / Germany    fax:   (49) 6136 9948-10
-------------- next part --------------
Index: map.h
===================================================================
RCS file: /home/cvs/mtd/include/linux/mtd/map.h,v
retrieving revision 1.27
diff -u -p -r1.27 map.h
--- map.h	2002/02/21 08:26:59	1.27
+++ map.h	2002/02/25 16:51:36
@@ -47,6 +47,7 @@ struct map_info {
 	void (*copy_to)(struct map_info *, unsigned long, const void *, ssize_t);
 
 	void (*set_vpp)(struct map_info *, int);
+	int  vpp_counter;
 	/* We put these two here rather than a single void *map_priv, 
 	   because we want mappers to be able to have quickly-accessible
 	   cache for the 'currently-mapped page' without the _extra_
@@ -90,7 +91,7 @@ static inline void map_destroy(struct mt
 	kfree(mtd);
 }
 
-#define ENABLE_VPP(map) do { if(map->set_vpp) map->set_vpp(map, 1); } while(0)
-#define DISABLE_VPP(map) do { if(map->set_vpp) map->set_vpp(map, 0); } while(0)
+#define ENABLE_VPP(map) do { if(map->set_vpp) if(++map->vpp_counter == 1) map->set_vpp(map, 1); } while(0)
+#define DISABLE_VPP(map) do { if(map->set_vpp) { if(--map->vpp_counter == 0) map->set_vpp(map, 0); else if(map->vpp_counter < 0) BUG();} } while(0)
 
 #endif /* __LINUX_MTD_MAP_H__ */


More information about the linux-mtd mailing list