From mboxrd@z Thu Jan 1 00:00:00 1970 From: Edward Shishkin Subject: Re: [PATCH 3/3] reiser4: in our own sync writes, mark pages dirty before marking them writeback. Date: Thu, 15 Oct 2015 19:20:17 +0200 Message-ID: <561FE051.3000104@gmail.com> References: <1444389417-14929-1-git-send-email-intelfx100@gmail.com> <1444389417-14929-4-git-send-email-intelfx100@gmail.com> <5617C0C1.6060806@gmail.com> <1444398642.6030.3.camel@gmail.com> <5617D55D.2040908@gmail.com> <1444410842.2213.5.camel@gmail.com> <56182257.7060304@gmail.com> <1444473863.4257.10.camel@gmail.com> <561B7857.1030000@gmail.com> <1444817147.5346.10.camel@gmail.com> <1444820148.4077.1.camel@gmail.com> <1444849590.13210.3.camel@gmail.com> Mime-Version: 1.0 Content-Transfer-Encoding: 7bit Return-path: DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=message-id:date:from:user-agent:mime-version:to:cc:subject :references:in-reply-to:content-type:content-transfer-encoding; bh=N6xd1Yb12eZyeWLGJDnWwXyqGU4PlMEkGZJPIJCmCqg=; b=scxeogeIt3ylLQsENoApoP3BUF6r2gBPRChzsLZmzc1DTMIsmqt0TnWzbw4K9A/DaN lr327xyKIN6rOmXGYu3LnGiI9Cp/Lqi57F7xQbW6cKs1oB0xbILOMYFTiMmn81r0IlJs 0h2AhuldQvbMDnBjZFERCf0tBSX4G4uFY/vljhgeJcxpONr/bB7FnciCU260fsgH2+tp fm0kvOmjCO369yFmRZ61MWYONSQaFr4nBf0CbKX59xEJuE49ttap2lHfmS9MHfV2BRqS rMSu7vmXY0nlmJeWElVmL+WL7ANVuMS+6TDtyzxLuAo43R9td6BnDgG+FXYTXGXUfXQc hEDw== In-Reply-To: <1444849590.13210.3.camel@gmail.com> Sender: reiserfs-devel-owner@vger.kernel.org List-ID: Content-Type: text/plain; charset="us-ascii"; format="flowed" To: Ivan Shapovalov Cc: Oleg Drokin , reiserfs-devel@vger.kernel.org Hello, So the tail conversion is the culprit? It's quite realistic... I am currently on vacations, I'll take a look at this at the end of October more carefully. Thanks! Edward. On 10/14/2015 09:06 PM, Ivan Shapovalov wrote: > On 2015-10-14 at 13:55 +0300, Ivan Shapovalov wrote: >> On 2015-10-14 at 13:05 +0300, Ivan Shapovalov wrote: >>> On 2015-10-12 at 11:07 +0200, Edward Shishkin wrote: >>>> [...] >>> So, I've added three non-fatal checks right before >>> set_page_writeback(): >>> - PageDirty(pg) >>> - JF_ISSET(cur, JNODE_DIRTY) >>> - pg->mapping->host->i_wb != NULL >>> >>> In almost all times when either of the checks is triggered, >>> the first two checks are triggered at once (i. e. neither page nor >>> jnode is dirty, but i_wb is not NULL). This happens with both >>> formatted >>> nodes (jnode_is_znode), unformatted nodes (jnode_is_unformatted) >>> and >>> other nodes. >>> >>> And, finally, there are very few warnings where jnode _is_ dirty, >>> but >>> the page _isn't_. On the first such warning i_wb is also NULL. And, >>> just as you've suspected, this happens with an unformatted node. >>> >>> I'll try to add a backtrace buffer into struct jnode and generate a >>> backtrace there on each jnode dirtying attempt... and then print it >>> for >>> the problematic jnode. >>> >> So, here it is. On all occurrences the backtrace is the same. >> >> [...] > > Hmm. This obvious fix "works", but causes an assertion on rootfs unmount: > > "list_empty(&get_super_private(super)->all_jnodes)" in init_super.c:55 (no maintainer-id). > > Why? > > --- > fs/reiser4/plugin/file/tail_conversion.c | 1 + > 1 file changed, 1 insertion(+) > > diff --git a/fs/reiser4/plugin/file/tail_conversion.c b/fs/reiser4/plugin/file/tail_conversion.c > index 6ffa900..3b4e77d 100644 > --- a/fs/reiser4/plugin/file/tail_conversion.c > +++ b/fs/reiser4/plugin/file/tail_conversion.c > @@ -175,6 +175,7 @@ static int replace(struct inode *inode, struct page **pages, unsigned nr_pages, > i_mapping)); > if (result) > break; > + set_page_dirty_notag(pages[i]); > unlock_page(pages[i]); > result = find_or_create_extent(pages[i]); > if (result) {