From mboxrd@z Thu Jan 1 00:00:00 1970 From: Sonny Rao Subject: Re: [Ext2-devel] Bufferheads & page-cache reference Date: Mon, 14 Feb 2005 14:31:53 -0500 Message-ID: <20050214193153.GA3057@kevlar.burdell.org> References: <1108409415.20053.1278.camel@dyn318077bld.beaverton.ibm.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Cc: linux-fsdevel@vger.kernel.org, ext2-devel , Andrew Morton Received: from dsl027-162-124.atl1.dsl.speakeasy.net ([216.27.162.124]:21429 "EHLO kevlar.burdell.org") by vger.kernel.org with ESMTP id S261544AbVBNTpc (ORCPT ); Mon, 14 Feb 2005 14:45:32 -0500 To: Badari Pulavarty Content-Disposition: inline In-Reply-To: <1108409415.20053.1278.camel@dyn318077bld.beaverton.ibm.com> Sender: linux-fsdevel-owner@vger.kernel.org List-Id: linux-fsdevel.vger.kernel.org On Mon, Feb 14, 2005 at 11:30:16AM -0800, Badari Pulavarty wrote: > Hi,, > > I am trying to understand interactions between filesystem pagecache > pages & bufferhead associated with them. > > I was wondering if someone could help me clarify this.. > > I see that as part of bufferheads to page association, we get a > ref. on the page. > > create_empty_buffers() -> attach_page_buffers() -> page_cache_get() > > I also see that this reference get dropped by .. > > shrink_list() -> try_to_release_page() -> > try_to_free_buffers() -> drop_buffers() -> > __clear_page_buffers()-> page_cache_release(); > > So, it looks like we drop the reference on the page and disassociate > bufferheads from the page when VM wants to re-use the page. Only other > path, I see this can happen is through invalidate_mapping_pages(). > Is this true ? > > If I do fsync(), we flush the data - still leave the page & bufferhead > association. If I see lots of bufferheads even after fsync() is normal. > Correct ? Also Badari, a minor addition in the same vein, if a_ops->releasepage gets called journal_try_to_free_buffers() will be called by ext3_releasepage, which may actually release the buffers before try_to_free_buffers() does. I believe this should happen in the shrink_list->try_to_release_page case. I can't find any other place where the buffers would be released after a normal ext3 write. Here's a list of the callers of try_to_free_buffers: release_buffer_page: fs/jbd/commit.c:72 journal_try_to_free_bufers: fs/jbd/transaction.c:1633 mpage_writepage: fs/mpage.c:563 try_to_release_page: fs/buffer.c:1584 grow_dev_page: fs/buffer.c:1137 XFS only linvfs_release_page: fs/xfs/linux-2.6/xfs_aops.c:1250 I looked at all of these and callers to "free_buffer_head" but didn't see any obvious freeing until we release the whole page under memory pressure, etc. Sonny