>>From a94dae03e2064548c2532ba7786a6cbc29b7bbc9 Mon Sep 17 00:00:00 2001 From: Dmitry Monakhov Date: Fri, 17 Oct 2014 11:24:37 +0400 Subject: [PATCH] patch bh-debug.patch Signed-off-by: Dmitry Monakhov --- fs/ext4/move_extent.c | 33 ++++++++++++++++++++++++++++----- 1 files changed, 28 insertions(+), 5 deletions(-) diff --git a/fs/ext4/move_extent.c b/fs/ext4/move_extent.c index c2b2b02..84ceed1 100644 --- a/fs/ext4/move_extent.c +++ b/fs/ext4/move_extent.c @@ -239,6 +239,21 @@ out: return 0; } + +static void dump_buffers(struct page *page) +{ + struct buffer_head *head = page_buffers(page); + struct buffer_head *bh; + + printk("%s ino:%ld page:%p idx:%lx fl:%lx\n", __FUNCTION__, + page->mapping->host->i_ino, page, page->index, page->flags); + bh = head; + do { + printk("bh:%p count:%d state:%lx\n", + bh, atomic_read(&bh->b_count), bh->b_state); + bh = bh->b_this_page; + } while (bh != head); +} /** * move_extent_per_page - Move extent data per page * @@ -344,10 +359,17 @@ again: ext4_double_up_write_data_sem(orig_inode, donor_inode); goto data_copy; } - if ((page_has_private(pagep[0]) && - !try_to_release_page(pagep[0], 0)) || - (page_has_private(pagep[1]) && - !try_to_release_page(pagep[1], 0))) { + if ((page_has_private(pagep[0]) && !try_to_release_page(pagep[0], 0))) { + if (retries > 95) + dump_buffers(pagep[0]); + + *err = -EBUSY; + goto drop_data_sem; + } + if ((page_has_private(pagep[1]) && !try_to_release_page(pagep[1], 0))) { + if (retries > 95) + dump_buffers(pagep[1]); + *err = -EBUSY; goto drop_data_sem; } @@ -408,10 +430,11 @@ stop_journal: /* Buffer was busy because probably is pinned to journal transaction, * force transaction commit may help to free it. */ if (*err == -EBUSY && - (retries++ < 4 && EXT4_SB(orig_inode->i_sb)->s_journal && + (retries++ < 100 && EXT4_SB(orig_inode->i_sb)->s_journal && jbd2_journal_force_commit_nested( EXT4_SB(orig_inode->i_sb)->s_journal))) goto again; + return replaced_count; repair_branches: -- 1.7.1