diff options
author | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2012-06-12 11:46:58 +0800 |
---|---|---|
committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2012-06-12 11:46:58 +0800 |
commit | 66e61060d7ad9fcf61475fb836fb5987db7a7ee0 (patch) | |
tree | a0abe3fb2fa8858261dc41df9444c0e0ca85f1a6 /drivers/mtd/ubi/wl.c | |
parent | a89c3e956ae78cec8926b92f2d61b7a5b675e787 (diff) | |
parent | f242e50eee1ec7692c4854d94e8cd543991cce71 (diff) | |
download | linux-66e61060d7ad9fcf61475fb836fb5987db7a7ee0.tar.gz linux-66e61060d7ad9fcf61475fb836fb5987db7a7ee0.tar.bz2 linux-66e61060d7ad9fcf61475fb836fb5987db7a7ee0.zip |
Merge branch 'asoc-ab8500' into for-3.6
Diffstat (limited to 'drivers/mtd/ubi/wl.c')
-rw-r--r-- | drivers/mtd/ubi/wl.c | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/drivers/mtd/ubi/wl.c b/drivers/mtd/ubi/wl.c index 9df100a4ec38..b6be644e7b85 100644 --- a/drivers/mtd/ubi/wl.c +++ b/drivers/mtd/ubi/wl.c @@ -1262,11 +1262,11 @@ int ubi_wl_flush(struct ubi_device *ubi, int vol_id, int lnum) dbg_wl("flush pending work for LEB %d:%d (%d pending works)", vol_id, lnum, ubi->works_count); - down_write(&ubi->work_sem); while (found) { struct ubi_work *wrk; found = 0; + down_read(&ubi->work_sem); spin_lock(&ubi->wl_lock); list_for_each_entry(wrk, &ubi->works, list) { if ((vol_id == UBI_ALL || wrk->vol_id == vol_id) && @@ -1277,18 +1277,27 @@ int ubi_wl_flush(struct ubi_device *ubi, int vol_id, int lnum) spin_unlock(&ubi->wl_lock); err = wrk->func(ubi, wrk, 0); - if (err) - goto out; + if (err) { + up_read(&ubi->work_sem); + return err; + } + spin_lock(&ubi->wl_lock); found = 1; break; } } spin_unlock(&ubi->wl_lock); + up_read(&ubi->work_sem); } -out: + /* + * Make sure all the works which have been done in parallel are + * finished. + */ + down_write(&ubi->work_sem); up_write(&ubi->work_sem); + return err; } |