From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from aserp1040.oracle.com ([141.146.126.69]:43055 "EHLO aserp1040.oracle.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753522Ab3COUPy (ORCPT ); Fri, 15 Mar 2013 16:15:54 -0400 Date: Fri, 15 Mar 2013 13:15:48 -0700 From: "Darrick J. Wong" To: Liu Bo Cc: linux-btrfs@vger.kernel.org, johannes.hirte@fem.tu-ilmenau.de Subject: Re: [PATCH] Btrfs: fix warning of free_extent_map Message-ID: <20130315201548.GM5313@blackbox.djwong.org> References: <1363358799-17991-1-git-send-email-bo.li.liu@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii In-Reply-To: <1363358799-17991-1-git-send-email-bo.li.liu@oracle.com> Sender: linux-btrfs-owner@vger.kernel.org List-ID: On Fri, Mar 15, 2013 at 10:46:39PM +0800, Liu Bo wrote: > Users report that an extent map's list is still linked when it's actually > going to be freed from cache. > > The story is that > > a) when we're going to drop an extent map and may split this large one into > smaller ems, and if this large one is flagged as EXTENT_FLAG_LOGGING which means > that it's on the list to be logged, then the smaller ems split from it will also > be flagged as EXTENT_FLAG_LOGGING, and this is _not_ expected. > > b) we'll keep ems from unlinking the list and freeing when they are flagged with > EXTENT_FLAG_LOGGING, because the log code holds one reference. > > The end result is the warning, but the truth is that we set the flag > EXTENT_FLAG_LOGGING only during fsync. > > So clear flag EXTENT_FLAG_LOGGING for extent maps split from a large one. > > Reported-by: Johannes Hirte > Reported-by: Darrick J. Wong > Signed-off-by: Liu Bo This seems to fix my problem, so you can add: Tested-by: Darrick J. Wong --D > --- > fs/btrfs/file.c | 1 + > 1 files changed, 1 insertions(+), 0 deletions(-) > > diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c > index 83c790d..7bdb47f 100644 > --- a/fs/btrfs/file.c > +++ b/fs/btrfs/file.c > @@ -591,6 +591,7 @@ void btrfs_drop_extent_cache(struct inode *inode, u64 start, u64 end, > } > compressed = test_bit(EXTENT_FLAG_COMPRESSED, &em->flags); > clear_bit(EXTENT_FLAG_PINNED, &em->flags); > + clear_bit(EXTENT_FLAG_LOGGING, &flags); > remove_extent_mapping(em_tree, em); > if (no_splits) > goto next; > -- > 1.7.7.6 >