| From 99358a1ca53e8e6ce09423500191396f0e6584d2 Mon Sep 17 00:00:00 2001 |
| From: Al Viro <viro@ZenIV.linux.org.uk> |
| Date: Fri, 1 Aug 2014 20:13:40 +0100 |
| Subject: [jffs2] kill wbuf_queued/wbuf_dwork_lock |
| |
| From: Al Viro <viro@ZenIV.linux.org.uk> |
| |
| commit 99358a1ca53e8e6ce09423500191396f0e6584d2 upstream. |
| |
| schedule_delayed_work() happening when the work is already pending is |
| a cheap no-op. Don't bother with ->wbuf_queued logics - it's both |
| broken (cancelling ->wbuf_dwork leaves it set, as spotted by Jeff Harris) |
| and pointless. It's cheaper to let schedule_delayed_work() handle that |
| case. |
| |
| Reported-by: Jeff Harris <jefftharris@gmail.com> |
| Tested-by: Jeff Harris <jefftharris@gmail.com> |
| Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| fs/jffs2/jffs2_fs_sb.h | 2 -- |
| fs/jffs2/wbuf.c | 17 ++--------------- |
| 2 files changed, 2 insertions(+), 17 deletions(-) |
| |
| --- a/fs/jffs2/jffs2_fs_sb.h |
| +++ b/fs/jffs2/jffs2_fs_sb.h |
| @@ -134,8 +134,6 @@ struct jffs2_sb_info { |
| struct rw_semaphore wbuf_sem; /* Protects the write buffer */ |
| |
| struct delayed_work wbuf_dwork; /* write-buffer write-out work */ |
| - int wbuf_queued; /* non-zero delayed work is queued */ |
| - spinlock_t wbuf_dwork_lock; /* protects wbuf_dwork and and wbuf_queued */ |
| |
| unsigned char *oobbuf; |
| int oobavail; /* How many bytes are available for JFFS2 in OOB */ |
| --- a/fs/jffs2/wbuf.c |
| +++ b/fs/jffs2/wbuf.c |
| @@ -1162,10 +1162,6 @@ static void delayed_wbuf_sync(struct wor |
| struct jffs2_sb_info *c = work_to_sb(work); |
| struct super_block *sb = OFNI_BS_2SFFJ(c); |
| |
| - spin_lock(&c->wbuf_dwork_lock); |
| - c->wbuf_queued = 0; |
| - spin_unlock(&c->wbuf_dwork_lock); |
| - |
| if (!(sb->s_flags & MS_RDONLY)) { |
| jffs2_dbg(1, "%s()\n", __func__); |
| jffs2_flush_wbuf_gc(c, 0); |
| @@ -1180,14 +1176,9 @@ void jffs2_dirty_trigger(struct jffs2_sb |
| if (sb->s_flags & MS_RDONLY) |
| return; |
| |
| - spin_lock(&c->wbuf_dwork_lock); |
| - if (!c->wbuf_queued) { |
| + delay = msecs_to_jiffies(dirty_writeback_interval * 10); |
| + if (queue_delayed_work(system_long_wq, &c->wbuf_dwork, delay)) |
| jffs2_dbg(1, "%s()\n", __func__); |
| - delay = msecs_to_jiffies(dirty_writeback_interval * 10); |
| - queue_delayed_work(system_long_wq, &c->wbuf_dwork, delay); |
| - c->wbuf_queued = 1; |
| - } |
| - spin_unlock(&c->wbuf_dwork_lock); |
| } |
| |
| int jffs2_nand_flash_setup(struct jffs2_sb_info *c) |
| @@ -1211,7 +1202,6 @@ int jffs2_nand_flash_setup(struct jffs2_ |
| |
| /* Initialise write buffer */ |
| init_rwsem(&c->wbuf_sem); |
| - spin_lock_init(&c->wbuf_dwork_lock); |
| INIT_DELAYED_WORK(&c->wbuf_dwork, delayed_wbuf_sync); |
| c->wbuf_pagesize = c->mtd->writesize; |
| c->wbuf_ofs = 0xFFFFFFFF; |
| @@ -1251,7 +1241,6 @@ int jffs2_dataflash_setup(struct jffs2_s |
| |
| /* Initialize write buffer */ |
| init_rwsem(&c->wbuf_sem); |
| - spin_lock_init(&c->wbuf_dwork_lock); |
| INIT_DELAYED_WORK(&c->wbuf_dwork, delayed_wbuf_sync); |
| c->wbuf_pagesize = c->mtd->erasesize; |
| |
| @@ -1311,7 +1300,6 @@ int jffs2_nor_wbuf_flash_setup(struct jf |
| |
| /* Initialize write buffer */ |
| init_rwsem(&c->wbuf_sem); |
| - spin_lock_init(&c->wbuf_dwork_lock); |
| INIT_DELAYED_WORK(&c->wbuf_dwork, delayed_wbuf_sync); |
| |
| c->wbuf_pagesize = c->mtd->writesize; |
| @@ -1346,7 +1334,6 @@ int jffs2_ubivol_setup(struct jffs2_sb_i |
| return 0; |
| |
| init_rwsem(&c->wbuf_sem); |
| - spin_lock_init(&c->wbuf_dwork_lock); |
| INIT_DELAYED_WORK(&c->wbuf_dwork, delayed_wbuf_sync); |
| |
| c->wbuf_pagesize = c->mtd->writesize; |