From: Richard Weinberger <richard@nod.at>
To: linux-mtd@lists.infradead.org
Cc: linux-kernel@vger.kernel.org, adrian.hunter@intel.com,
Heinz.Egger@linutronix.de, thomas.wucher@linutronix.de,
shmulik.ladkani@gmail.com, tglx@linutronix.de,
tim.bird@am.sony.com, Marius.Mazarel@ugal.ro,
artem.bityutskiy@linux.intel.com,
Richard Weinberger <richard@nod.at>
Subject: [PATCH 12/22] UBI: Fastmap: Locking fixes
Date: Mon, 18 Jun 2012 18:18:55 +0200 [thread overview]
Message-ID: <1340036345-96726-13-git-send-email-richard@nod.at> (raw)
In-Reply-To: <1340036345-96726-1-git-send-email-richard@nod.at>
Add a new rw semaphore to block EBA table changes
while creating the fastmap.
Signed-off-by: Richard Weinberger <richard@nod.at>
---
drivers/mtd/ubi/eba.c | 12 ++++++++++++
drivers/mtd/ubi/fastmap.c | 2 ++
drivers/mtd/ubi/ubi.h | 2 ++
3 files changed, 16 insertions(+), 0 deletions(-)
diff --git a/drivers/mtd/ubi/eba.c b/drivers/mtd/ubi/eba.c
index d112b10..2bee8be 100644
--- a/drivers/mtd/ubi/eba.c
+++ b/drivers/mtd/ubi/eba.c
@@ -340,7 +340,9 @@ int ubi_eba_unmap_leb(struct ubi_device *ubi, struct ubi_volume *vol,
dbg_eba("erase LEB %d:%d, PEB %d", vol_id, lnum, pnum);
+ down_read(&ubi->fm_sem);
vol->eba_tbl[lnum] = UBI_LEB_UNMAPPED;
+ up_read(&ubi->fm_sem);
err = ubi_wl_put_peb(ubi, pnum, 0);
out_unlock:
@@ -549,7 +551,9 @@ retry:
mutex_unlock(&ubi->buf_mutex);
ubi_free_vid_hdr(ubi, vid_hdr);
+ down_read(&ubi->fm_sem);
vol->eba_tbl[lnum] = new_pnum;
+ up_read(&ubi->fm_sem);
ubi_wl_put_peb(ubi, pnum, 1);
ubi_msg("data was successfully recovered");
@@ -667,7 +671,9 @@ retry:
}
}
+ down_read(&ubi->fm_sem);
vol->eba_tbl[lnum] = pnum;
+ up_read(&ubi->fm_sem);
leb_write_unlock(ubi, vol_id, lnum);
ubi_free_vid_hdr(ubi, vid_hdr);
@@ -785,7 +791,9 @@ retry:
}
ubi_assert(vol->eba_tbl[lnum] < 0);
+ down_read(&ubi->fm_sem);
vol->eba_tbl[lnum] = pnum;
+ up_read(&ubi->fm_sem);
leb_write_unlock(ubi, vol_id, lnum);
ubi_free_vid_hdr(ubi, vid_hdr);
@@ -906,7 +914,9 @@ retry:
goto out_leb_unlock;
}
+ down_read(&ubi->fm_sem);
vol->eba_tbl[lnum] = pnum;
+ up_read(&ubi->fm_sem);
out_leb_unlock:
leb_write_unlock(ubi, vol_id, lnum);
@@ -1154,7 +1164,9 @@ int ubi_eba_copy_leb(struct ubi_device *ubi, int from, int to,
}
ubi_assert(vol->eba_tbl[lnum] == from);
+ down_read(&ubi->fm_sem);
vol->eba_tbl[lnum] = to;
+ up_read(&ubi->fm_sem);
out_unlock_buf:
mutex_unlock(&ubi->buf_mutex);
diff --git a/drivers/mtd/ubi/fastmap.c b/drivers/mtd/ubi/fastmap.c
index ff09fd4..33a14cf 100644
--- a/drivers/mtd/ubi/fastmap.c
+++ b/drivers/mtd/ubi/fastmap.c
@@ -1418,9 +1418,11 @@ int ubi_update_fastmap(struct ubi_device *ubi)
kfree(old_fm);
+ down_write(&ubi->fm_sem);
down_write(&ubi->work_sem);
ret = ubi_write_fastmap(ubi, new_fm);
up_write(&ubi->work_sem);
+ up_write(&ubi->fm_sem);
out_unlock:
mutex_unlock(&ubi->fm_mutex);
diff --git a/drivers/mtd/ubi/ubi.h b/drivers/mtd/ubi/ubi.h
index 8588f9c..8abbcd5 100644
--- a/drivers/mtd/ubi/ubi.h
+++ b/drivers/mtd/ubi/ubi.h
@@ -384,6 +384,7 @@ struct ubi_wl_entry;
* @fm_pool: in-memory data structure of the fastmap pool
* @fm_pool_mutex: serializes ubi_wl_get_peb()
* @fm_mutex: serializes ubi_update_fastmap()
+ * @fm_sem: allows ubi_update_fastmap() to block EBA table changes
* @attached_by_scanning: this UBI device was attached by the old scanning
* methold. All fastmap volumes have to be deleted.
*
@@ -482,6 +483,7 @@ struct ubi_device {
struct ubi_fastmap_layout *fm;
struct ubi_fm_pool fm_pool;
struct ubi_fm_pool fm_wl_pool;
+ struct rw_semaphore fm_sem;
struct mutex fm_mutex;
struct mutex fm_pool_mutex;
int attached_by_scanning;
--
1.7.6.5
next prev parent reply other threads:[~2012-06-18 16:22 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-06-18 16:18 UBI Fastmap updates Richard Weinberger
2012-06-18 16:18 ` [PATCH 01/22] UBI: Fastmap: Add EBA selfcheck Richard Weinberger
2012-06-18 16:18 ` [PATCH 02/22] UBI: Fastmap: Fix NULL pointer bug Richard Weinberger
2012-06-18 16:18 ` [PATCH 03/22] UBI: Fastmap: Keep fastmap after attaching Richard Weinberger
2012-06-18 16:18 ` [PATCH 04/22] UBI: Fastmap: Store scrub list in fastmap Richard Weinberger
2012-06-18 16:18 ` [PATCH 05/22] UBI: Fastmap: Rework ubi_wl_put_fm_peb() Richard Weinberger
2012-06-18 16:18 ` [PATCH 06/22] UBI: Fastmap: Make EBA table self check depend on chk_gen Richard Weinberger
2012-06-18 16:18 ` [PATCH 07/22] UBI: Fastmap: Fix build (a left over from the ai->fm removal) Richard Weinberger
2012-06-18 16:18 ` [PATCH 08/22] Revert "UBI: Fastmap: Check for duplicated PEBs in add_aeb()" Richard Weinberger
2012-06-18 16:18 ` [PATCH 09/22] UBI: Fastmap: Fix PEB count assert Richard Weinberger
2012-06-18 16:18 ` [PATCH 10/22] UBI: Fastmap: Remove more useless new lines Richard Weinberger
2012-06-18 16:18 ` [PATCH 11/22] UBI: Fastmap: Get rid of ubi_wl_flush() in ubi_update_fastmap() Richard Weinberger
2012-06-18 16:18 ` Richard Weinberger [this message]
2012-06-18 16:18 ` [PATCH 13/22] UBI: Fastmap: Fix EC values Richard Weinberger
2012-06-18 16:18 ` [PATCH 14/22] UBI: Fastmap: Fix copy&paste error Richard Weinberger
2012-06-18 16:18 ` [PATCH 15/22] UBI: Fastmap: Kill old fastmap in case of a failure Richard Weinberger
2012-06-18 16:18 ` [PATCH 16/22] UBI: Fastmap: Fix loglevel Richard Weinberger
2012-06-18 16:19 ` [PATCH 17/22] UBI: Fastmap: Add comments to new functions Richard Weinberger
2012-06-18 16:19 ` [PATCH 18/22] UBI: Fastmap: Rename "early PEB" to "anchor PEB" Richard Weinberger
2012-06-18 16:19 ` [PATCH 19/22] UBI: Fastmap: Init fm_sem Richard Weinberger
2012-06-18 16:19 ` [PATCH 20/22] UBI: Fastmap: Use good_peb_count in assert Richard Weinberger
2012-06-18 16:19 ` [PATCH 21/22] UBI: Fastmap: Fix and explain duplicated PEBs Richard Weinberger
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1340036345-96726-13-git-send-email-richard@nod.at \
--to=richard@nod.at \
--cc=Heinz.Egger@linutronix.de \
--cc=Marius.Mazarel@ugal.ro \
--cc=adrian.hunter@intel.com \
--cc=artem.bityutskiy@linux.intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mtd@lists.infradead.org \
--cc=shmulik.ladkani@gmail.com \
--cc=tglx@linutronix.de \
--cc=thomas.wucher@linutronix.de \
--cc=tim.bird@am.sony.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).