Skip to content

Commit 13ced29

Browse files
committed
logfs: take write mutex lock during fsync and sync
LogFS uses super->s_write_mutex while writing data to disk. Taking the same mutex lock in sync and fsync code path solves the following BUG: ------------[ cut here ]------------ kernel BUG at /home/prasad/logfs/dev_bdev.c:134! Pid: 2387, comm: flush-253:16 Not tainted 3.0.0+ raspberrypi#4 Bochs Bochs RIP: 0010:[<ffffffffa007deed>] [<ffffffffa007deed>] bdev_writeseg+0x25d/0x270 [logfs] Call Trace: [<ffffffffa007c381>] logfs_open_area+0x91/0x150 [logfs] [<ffffffff8128dcb2>] ? find_level.clone.9+0x62/0x100 [<ffffffffa007c49c>] __logfs_segment_write.clone.20+0x5c/0x190 [logfs] [<ffffffff810ef005>] ? mempool_kmalloc+0x15/0x20 [<ffffffff810ef383>] ? mempool_alloc+0x53/0x130 [<ffffffffa007c7a4>] logfs_segment_write+0x1d4/0x230 [logfs] [<ffffffffa0078f8e>] logfs_write_i0+0x12e/0x190 [logfs] [<ffffffffa0079300>] __logfs_write_rec+0x140/0x220 [logfs] [<ffffffffa0079444>] logfs_write_rec+0x64/0xd0 [logfs] [<ffffffffa00795b6>] __logfs_write_buf+0x106/0x110 [logfs] [<ffffffffa007a13e>] logfs_write_buf+0x4e/0x80 [logfs] [<ffffffffa0073e33>] __logfs_writepage+0x23/0x80 [logfs] [<ffffffffa007410c>] logfs_writepage+0xdc/0x110 [logfs] [<ffffffff810f5ba7>] __writepage+0x17/0x40 [<ffffffff810f6208>] write_cache_pages+0x208/0x4f0 [<ffffffff810f5b90>] ? set_page_dirty+0x70/0x70 [<ffffffff810f653a>] generic_writepages+0x4a/0x70 [<ffffffff810f75d1>] do_writepages+0x21/0x40 [<ffffffff8116b9d1>] writeback_single_inode+0x101/0x250 [<ffffffff8116bdbd>] writeback_sb_inodes+0xed/0x1c0 [<ffffffff8116c5fb>] writeback_inodes_wb+0x7b/0x1e0 [<ffffffff8116cc23>] wb_writeback+0x4c3/0x530 [<ffffffff814d984d>] ? sub_preempt_count+0x9d/0xd0 [<ffffffff8116cd6b>] wb_do_writeback+0xdb/0x290 [<ffffffff814d984d>] ? sub_preempt_count+0x9d/0xd0 [<ffffffff814d6208>] ? _raw_spin_unlock_irqrestore+0x18/0x40 [<ffffffff8105aa5a>] ? del_timer+0x8a/0x120 [<ffffffff8116cfac>] bdi_writeback_thread+0x8c/0x2e0 [<ffffffff8116cf20>] ? wb_do_writeback+0x290/0x290 [<ffffffff8106d2e6>] kthread+0x96/0xa0 [<ffffffff814de514>] kernel_thread_helper+0x4/0x10 [<ffffffff8106d250>] ? kthread_worker_fn+0x190/0x190 [<ffffffff814de510>] ? gs_change+0xb/0xb RIP [<ffffffffa007deed>] bdev_writeseg+0x25d/0x270 [logfs] ---[ end trace 0211ad60a57657c4 ]--- Reviewed-by: Joern Engel <[email protected]> Signed-off-by: Prasad Joshi <[email protected]>
1 parent 934eed3 commit 13ced29

File tree

4 files changed

+8
-4
lines changed

4 files changed

+8
-4
lines changed

fs/logfs/file.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,9 @@ int logfs_fsync(struct file *file, loff_t start, loff_t end, int datasync)
230230
return ret;
231231

232232
mutex_lock(&inode->i_mutex);
233+
logfs_get_wblocks(sb, NULL, WF_LOCK);
233234
logfs_write_anchor(sb);
235+
logfs_put_wblocks(sb, NULL, WF_LOCK);
234236
mutex_unlock(&inode->i_mutex);
235237

236238
return 0;

fs/logfs/inode.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -364,7 +364,9 @@ static void logfs_init_once(void *_li)
364364

365365
static int logfs_sync_fs(struct super_block *sb, int wait)
366366
{
367+
logfs_get_wblocks(sb, NULL, WF_LOCK);
367368
logfs_write_anchor(sb);
369+
logfs_put_wblocks(sb, NULL, WF_LOCK);
368370
return 0;
369371
}
370372

fs/logfs/logfs.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -577,6 +577,8 @@ void initialize_block_counters(struct page *page, struct logfs_block *block,
577577
__be64 *array, int page_is_empty);
578578
int logfs_exist_block(struct inode *inode, u64 bix);
579579
int get_page_reserve(struct inode *inode, struct page *page);
580+
void logfs_get_wblocks(struct super_block *sb, struct page *page, int lock);
581+
void logfs_put_wblocks(struct super_block *sb, struct page *page, int lock);
580582
extern struct logfs_block_ops indirect_block_ops;
581583

582584
/* segment.c */

fs/logfs/readwrite.c

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -244,8 +244,7 @@ static void preunlock_page(struct super_block *sb, struct page *page, int lock)
244244
* is waiting for s_write_mutex. We annotate this fact by setting PG_pre_locked
245245
* in addition to PG_locked.
246246
*/
247-
static void logfs_get_wblocks(struct super_block *sb, struct page *page,
248-
int lock)
247+
void logfs_get_wblocks(struct super_block *sb, struct page *page, int lock)
249248
{
250249
struct logfs_super *super = logfs_super(sb);
251250

@@ -260,8 +259,7 @@ static void logfs_get_wblocks(struct super_block *sb, struct page *page,
260259
}
261260
}
262261

263-
static void logfs_put_wblocks(struct super_block *sb, struct page *page,
264-
int lock)
262+
void logfs_put_wblocks(struct super_block *sb, struct page *page, int lock)
265263
{
266264
struct logfs_super *super = logfs_super(sb);
267265

0 commit comments

Comments
 (0)