Skip to contentSkip to conversation

mtdblock: introduce mtdblks_lock

PATCH In review Matthias Kaehlcke 2 participants 5 messages Jul 14, 2009 – Jul 15, 2009 Memory technology devices (MTD)

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 mtdblock: introduce mtdblks_lock

The mtdblks array and its content are prone to race conditions. Introduce the mutex mtdblks_lock in order to solve this.

---
 drivers/mtd/mtdblock.c |   17 ++++++++++++++++-
 1 files changed, 16 insertions(+), 1 deletions(-)
drivers/mtd/mtdblock.c +16 -1
index 208c6fa..ca0c6b8 100644
@@ -29,6 +29,8 @@ static struct mtdblk_dev {
 	enum { STATE_EMPTY, STATE_CLEAN, STATE_DIRTY } cache_state;
 } *mtdblks[MAX_MTD_DEVICES];
 
+static struct mutex mtdblks_lock;
+
 /*
  * Cache stuff...
  *
@@ -270,6 +272,8 @@ static int mtdblock_open(struct mtd_blktrans_dev *mbd)
 
 	DEBUG(MTD_DEBUG_LEVEL1,"mtdblock_open\n");
 
+	mutex_lock(&mtdblks_lock);
+
 	if (mtdblks[dev]) {
 		mtdblks[dev]->count++;
 		return 0;
@@ -277,8 +281,10 @@ static int mtdblock_open(struct mtd_blktrans_dev *mbd)
 
 	/* OK, it's not open. Create cache info for it */
 	mtdblk = kzalloc(sizeof(struct mtdblk_dev), GFP_KERNEL);
-	if (!mtdblk)
+	if (!mtdblk) {
+		mutex_unlock(&mtdblks_lock);
 		return -ENOMEM;
+	}
 
 	mtdblk->count = 1;
 	mtdblk->mtd = mtd;
@@ -292,6 +298,8 @@ static int mtdblock_open(struct mtd_blktrans_dev *mbd)
 
 	mtdblks[dev] = mtdblk;
 
+	mutex_unlock(&mtdblks_lock);
+
 	DEBUG(MTD_DEBUG_LEVEL1, "ok\n");
 
 	return 0;
@@ -304,6 +312,8 @@ static int mtdblock_release(struct mtd_blktrans_dev *mbd)
 
    	DEBUG(MTD_DEBUG_LEVEL1, "mtdblock_release\n");
 
+	mutex_lock(&mtdblks_lock);
+
 	mutex_lock(&mtdblk->cache_mutex);
 	write_cached_data(mtdblk);
 	mutex_unlock(&mtdblk->cache_mutex);
@@ -316,6 +326,9 @@ static int mtdblock_release(struct mtd_blktrans_dev *mbd)
 		vfree(mtdblk->cache_data);
 		kfree(mtdblk);
 	}
+
+	mutex_unlock(&mtdblks_lock);
+
 	DEBUG(MTD_DEBUG_LEVEL1, "ok\n");
 
 	return 0;
@@ -376,6 +389,8 @@ static struct mtd_blktrans_ops mtdblock_tr = {
 
 static int __init init_mtdblock(void)
 {
+	mutex_init(&mtdblks_lock);
+
 	return register_mtd_blktrans(&mtdblock_tr);
 }
 
Signature · 1 line
1.6.3.1
#1 lore raw
Quoted 6 lines · Matthias Kaehlcke
drivers/mtd/mtdblock.c +2 -0
+static struct mutex mtdblks_lock;
+
 /*
  * Cache stuff...
  *

drivers/mtd/mtdblock.c static int mtdblock_open(struct mtd_blktrans_dev *mbd) · line 279

Quoted 8 lines
drivers/mtd/mtdblock.c +2 -0
@@ -270,6 +272,8 @@ static int mtdblock_open(struct mtd_blktrans_dev *mbd)
 
 	DEBUG(MTD_DEBUG_LEVEL1,"mtdblock_open\n");
 
+	mutex_lock(&mtdblks_lock);
+
 	if (mtdblks[dev]) {
 		mtdblks[dev]->count++;
 		return 0;

Now about unlocking the mutex here?

Signature · 2 lines
Best regards,
Artem Bityutskiy (Битюцкий Артём)
#2 lore raw

El Wed, Jul 15, 2009 at 10:41:54AM +0300 Artem Bityutskiy ha dit:

Quoted 10 lines · Matthias Kaehlcke
Quoted 9 lines
drivers/mtd/mtdblock.c +2 -0
+static struct mutex mtdblks_lock;
+
 /*
  * Cache stuff...
  *
@@ -270,6 +272,8 @@ static int mtdblock_open(struct mtd_blktrans_dev *mbd)
 
 	DEBUG(MTD_DEBUG_LEVEL1,"mtdblock_open\n");
 
Quoted 7 lines

drivers/mtd/mtdblock.c static int mtdblock_open(struct mtd_blktrans_dev *mbd) · line 279

Quoted 5 lines
drivers/mtd/mtdblock.c +2 -0
+	mutex_lock(&mtdblks_lock);
+
 	if (mtdblks[dev]) {
 		mtdblks[dev]->count++;
 		return 0;

Now about unlocking the mutex here?

i missed this one ...

thanks for your review. i'm going fix that and send out an updated version of the patch

Signature · 11 lines
Matthias Kaehlcke
Embedded Linux Engineer
Barcelona

        They that can give up essential liberty to obtain a little
           temporary safety deserve neither liberty nor safety
                         (Benjamin Franklin)
                                                                 .''`.
    using free software / Debian GNU/Linux | http://debian.org  : :'  :
                                                                `. `'`
gpg --keyserver pgp.mit.edu --recv-keys 47D8E5D4                  `-
#3 lore raw
Quoted 20 lines · Matthias Kaehlcke

El Wed, Jul 15, 2009 at 10:41:54AM +0300 Artem Bityutskiy ha dit:

Quoted 10 lines · Matthias Kaehlcke
Quoted 9 lines
drivers/mtd/mtdblock.c +2 -0
+static struct mutex mtdblks_lock;
+
 /*
  * Cache stuff...
  *
@@ -270,6 +272,8 @@ static int mtdblock_open(struct mtd_blktrans_dev *mbd)
 
 	DEBUG(MTD_DEBUG_LEVEL1,"mtdblock_open\n");
 
Quoted 7 lines

drivers/mtd/mtdblock.c static int mtdblock_open(struct mtd_blktrans_dev *mbd) · line 279

Quoted 5 lines
drivers/mtd/mtdblock.c +2 -0
+	mutex_lock(&mtdblks_lock);
+
 	if (mtdblks[dev]) {
 		mtdblks[dev]->count++;
 		return 0;

Now about unlocking the mutex here?

Quoted 4 lines

i missed this one ...

thanks for your review. i'm going fix that and send out an updated version of the patch

Err, I've already amended your patch and put it to my l2-mtd-2.6.git:
http://git.infradead.org/users/dedekind/l2-mtd-2.6.git?a=commit;h=2a4d4fdb6393fdcbfea546b2474baf41d434302a

Signature · 2 lines
Best regards,
Artem Bityutskiy (Битюцкий Артём)
#4 lore raw

El Wed, Jul 15, 2009 at 11:39:22AM +0300 Artem Bityutskiy ha dit:

Quoted 21 lines · Matthias Kaehlcke
Quoted 20 lines

El Wed, Jul 15, 2009 at 10:41:54AM +0300 Artem Bityutskiy ha dit:

Quoted 17 lines · Matthias Kaehlcke
Quoted 6 lines
drivers/mtd/mtdblock.c +2 -0
+static struct mutex mtdblks_lock;
+
 /*
  * Cache stuff...
  *

drivers/mtd/mtdblock.c static int mtdblock_open(struct mtd_blktrans_dev *mbd) · line 279

Quoted 8 lines
drivers/mtd/mtdblock.c +2 -0
@@ -270,6 +272,8 @@ static int mtdblock_open(struct mtd_blktrans_dev *mbd)
 
 	DEBUG(MTD_DEBUG_LEVEL1,"mtdblock_open\n");
 
+	mutex_lock(&mtdblks_lock);
+
 	if (mtdblks[dev]) {
 		mtdblks[dev]->count++;
 		return 0;

Now about unlocking the mutex here?

Quoted 7 lines
Quoted 4 lines

i missed this one ...

thanks for your review. i'm going fix that and send out an updated version of the patch

Err, I've already amended your patch and put it to my l2-mtd-2.6.git:
http://git.infradead.org/users/dedekind/l2-mtd-2.6.git?a=commit;h=2a4d4fdb6393fdcbfea546b2474baf41d434302a

ok, thx!

Signature · 11 lines
Matthias Kaehlcke
Embedded Linux Engineer
Barcelona

             If liberty means anything at all, it means the
           right to tell people what they do not want to hear
                            (George Orwell)
                                                                 .''`.
    using free software / Debian GNU/Linux | http://debian.org  : :'  :
                                                                `. `'`
gpg --keyserver pgp.mit.edu --recv-keys 47D8E5D4                  `-