From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Aneesh Kumar K.V" Subject: __fsync_super and inode dirty pages Date: Tue, 5 Aug 2008 23:24:39 +0530 Message-ID: <20080805175439.GA17772@skywalker> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Cc: "linux-fsdevel@vger.kernel.org" To: Christoph Hellwig , Alexander Viro , Andrew Morton Return-path: Received: from e28smtp02.in.ibm.com ([59.145.155.2]:45512 "EHLO e28esmtp02.in.ibm.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1756706AbYHERyt (ORCPT ); Tue, 5 Aug 2008 13:54:49 -0400 Received: from d28relay02.in.ibm.com (d28relay02.in.ibm.com [9.184.220.59]) by e28esmtp02.in.ibm.com (8.13.1/8.13.1) with ESMTP id m75HskbB025076 for ; Tue, 5 Aug 2008 23:24:46 +0530 Received: from d28av04.in.ibm.com (d28av04.in.ibm.com [9.184.220.66]) by d28relay02.in.ibm.com (8.13.8/8.13.8/NCO v9.0) with ESMTP id m75HskUQ1765448 for ; Tue, 5 Aug 2008 23:24:46 +0530 Received: from d28av04.in.ibm.com (loopback [127.0.0.1]) by d28av04.in.ibm.com (8.13.1/8.13.3) with ESMTP id m75Hsjol029183 for ; Tue, 5 Aug 2008 23:24:46 +0530 Content-Disposition: inline Sender: linux-fsdevel-owner@vger.kernel.org List-ID: Hi, I am trying to understand the expectation on filesystem writepages by __fsync_super -> generic_sync_sb_inodes call path. __fsync_super make two calls to generic_sync_sb_inodes and the second call is made with WB_SYNC_ALL. The problem is, i am finding multiple ways we may 'break' from the generic_sync_sb_inodes while (!list_empty(&sb->s_io)) loop. For ex: a) When wbc->nr_to_write <=0 This should normally indicate that we wrote more than we requested That means we have more dirty pages . So why break from loop ? This may be ok for nr_to_write limited writeback. But is it ok for __fsync_super ? b) pages_skipped != wbc->pages_skipped. That means writepages was not able to write some of the pages and it redirtied the same. We add such inode to s_dirty list. But we don't loop through the s_dirty list later trying to write the dirty pages. We actually call generic_sync_sb_inodes again. That can actually cause s_dirty list content to move to s_io once via queue_io. But then we can have pages skipped again in the second call to generic_sync_sb_inodes ? Shouldn't we have a variant that actually loop trough s_dirty and s_more_io list MULTIPLE times and make sure we force all the dirty pages to disk before __fsync_super returns ? Or is there an expectation from file system writepages that would make sure calling generic_sync_sb_inodes TWICE would guarantee that ? -aneesh