diff options
author | Al Viro <viro@ZenIV.linux.org.uk> | 2014-08-01 15:13:40 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2014-10-09 02:39:01 -0400 |
commit | 99358a1ca53e8e6ce09423500191396f0e6584d2 (patch) | |
tree | ce3dca2597219e4e0cd7fe4e308e634c86613263 /fs/jffs2 | |
parent | 4e07ad6406d8137cc5aa1317568408c461ee8ce8 (diff) |
[jffs2] kill wbuf_queued/wbuf_dwork_lock
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>
Cc: stable@vger.kernel.org
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/jffs2')
-rw-r--r-- | fs/jffs2/jffs2_fs_sb.h | 2 | ||||
-rw-r--r-- | fs/jffs2/wbuf.c | 17 |
2 files changed, 2 insertions, 17 deletions
diff --git a/fs/jffs2/jffs2_fs_sb.h b/fs/jffs2/jffs2_fs_sb.h index 413ef89c2d1b..046fee8b6e9b 100644 --- a/fs/jffs2/jffs2_fs_sb.h +++ b/fs/jffs2/jffs2_fs_sb.h | |||
@@ -134,8 +134,6 @@ struct jffs2_sb_info { | |||
134 | struct rw_semaphore wbuf_sem; /* Protects the write buffer */ | 134 | struct rw_semaphore wbuf_sem; /* Protects the write buffer */ |
135 | 135 | ||
136 | struct delayed_work wbuf_dwork; /* write-buffer write-out work */ | 136 | struct delayed_work wbuf_dwork; /* write-buffer write-out work */ |
137 | int wbuf_queued; /* non-zero delayed work is queued */ | ||
138 | spinlock_t wbuf_dwork_lock; /* protects wbuf_dwork and and wbuf_queued */ | ||
139 | 137 | ||
140 | unsigned char *oobbuf; | 138 | unsigned char *oobbuf; |
141 | int oobavail; /* How many bytes are available for JFFS2 in OOB */ | 139 | int oobavail; /* How many bytes are available for JFFS2 in OOB */ |
diff --git a/fs/jffs2/wbuf.c b/fs/jffs2/wbuf.c index a6597d60d76d..09ed55190ee2 100644 --- a/fs/jffs2/wbuf.c +++ b/fs/jffs2/wbuf.c | |||
@@ -1162,10 +1162,6 @@ static void delayed_wbuf_sync(struct work_struct *work) | |||
1162 | struct jffs2_sb_info *c = work_to_sb(work); | 1162 | struct jffs2_sb_info *c = work_to_sb(work); |
1163 | struct super_block *sb = OFNI_BS_2SFFJ(c); | 1163 | struct super_block *sb = OFNI_BS_2SFFJ(c); |
1164 | 1164 | ||
1165 | spin_lock(&c->wbuf_dwork_lock); | ||
1166 | c->wbuf_queued = 0; | ||
1167 | spin_unlock(&c->wbuf_dwork_lock); | ||
1168 | |||
1169 | if (!(sb->s_flags & MS_RDONLY)) { | 1165 | if (!(sb->s_flags & MS_RDONLY)) { |
1170 | jffs2_dbg(1, "%s()\n", __func__); | 1166 | jffs2_dbg(1, "%s()\n", __func__); |
1171 | jffs2_flush_wbuf_gc(c, 0); | 1167 | jffs2_flush_wbuf_gc(c, 0); |
@@ -1180,14 +1176,9 @@ void jffs2_dirty_trigger(struct jffs2_sb_info *c) | |||
1180 | if (sb->s_flags & MS_RDONLY) | 1176 | if (sb->s_flags & MS_RDONLY) |
1181 | return; | 1177 | return; |
1182 | 1178 | ||
1183 | spin_lock(&c->wbuf_dwork_lock); | 1179 | delay = msecs_to_jiffies(dirty_writeback_interval * 10); |
1184 | if (!c->wbuf_queued) { | 1180 | if (queue_delayed_work(system_long_wq, &c->wbuf_dwork, delay)) |
1185 | jffs2_dbg(1, "%s()\n", __func__); | 1181 | jffs2_dbg(1, "%s()\n", __func__); |
1186 | delay = msecs_to_jiffies(dirty_writeback_interval * 10); | ||
1187 | queue_delayed_work(system_long_wq, &c->wbuf_dwork, delay); | ||
1188 | c->wbuf_queued = 1; | ||
1189 | } | ||
1190 | spin_unlock(&c->wbuf_dwork_lock); | ||
1191 | } | 1182 | } |
1192 | 1183 | ||
1193 | int jffs2_nand_flash_setup(struct jffs2_sb_info *c) | 1184 | int jffs2_nand_flash_setup(struct jffs2_sb_info *c) |
@@ -1211,7 +1202,6 @@ int jffs2_nand_flash_setup(struct jffs2_sb_info *c) | |||
1211 | 1202 | ||
1212 | /* Initialise write buffer */ | 1203 | /* Initialise write buffer */ |
1213 | init_rwsem(&c->wbuf_sem); | 1204 | init_rwsem(&c->wbuf_sem); |
1214 | spin_lock_init(&c->wbuf_dwork_lock); | ||
1215 | INIT_DELAYED_WORK(&c->wbuf_dwork, delayed_wbuf_sync); | 1205 | INIT_DELAYED_WORK(&c->wbuf_dwork, delayed_wbuf_sync); |
1216 | c->wbuf_pagesize = c->mtd->writesize; | 1206 | c->wbuf_pagesize = c->mtd->writesize; |
1217 | c->wbuf_ofs = 0xFFFFFFFF; | 1207 | c->wbuf_ofs = 0xFFFFFFFF; |
@@ -1251,7 +1241,6 @@ int jffs2_dataflash_setup(struct jffs2_sb_info *c) { | |||
1251 | 1241 | ||
1252 | /* Initialize write buffer */ | 1242 | /* Initialize write buffer */ |
1253 | init_rwsem(&c->wbuf_sem); | 1243 | init_rwsem(&c->wbuf_sem); |
1254 | spin_lock_init(&c->wbuf_dwork_lock); | ||
1255 | INIT_DELAYED_WORK(&c->wbuf_dwork, delayed_wbuf_sync); | 1244 | INIT_DELAYED_WORK(&c->wbuf_dwork, delayed_wbuf_sync); |
1256 | c->wbuf_pagesize = c->mtd->erasesize; | 1245 | c->wbuf_pagesize = c->mtd->erasesize; |
1257 | 1246 | ||
@@ -1311,7 +1300,6 @@ int jffs2_nor_wbuf_flash_setup(struct jffs2_sb_info *c) { | |||
1311 | 1300 | ||
1312 | /* Initialize write buffer */ | 1301 | /* Initialize write buffer */ |
1313 | init_rwsem(&c->wbuf_sem); | 1302 | init_rwsem(&c->wbuf_sem); |
1314 | spin_lock_init(&c->wbuf_dwork_lock); | ||
1315 | INIT_DELAYED_WORK(&c->wbuf_dwork, delayed_wbuf_sync); | 1303 | INIT_DELAYED_WORK(&c->wbuf_dwork, delayed_wbuf_sync); |
1316 | 1304 | ||
1317 | c->wbuf_pagesize = c->mtd->writesize; | 1305 | c->wbuf_pagesize = c->mtd->writesize; |
@@ -1346,7 +1334,6 @@ int jffs2_ubivol_setup(struct jffs2_sb_info *c) { | |||
1346 | return 0; | 1334 | return 0; |
1347 | 1335 | ||
1348 | init_rwsem(&c->wbuf_sem); | 1336 | init_rwsem(&c->wbuf_sem); |
1349 | spin_lock_init(&c->wbuf_dwork_lock); | ||
1350 | INIT_DELAYED_WORK(&c->wbuf_dwork, delayed_wbuf_sync); | 1337 | INIT_DELAYED_WORK(&c->wbuf_dwork, delayed_wbuf_sync); |
1351 | 1338 | ||
1352 | c->wbuf_pagesize = c->mtd->writesize; | 1339 | c->wbuf_pagesize = c->mtd->writesize; |