From mboxrd@z Thu Jan 1 00:00:00 1970 From: Christoph Hellwig Subject: [PATCH] direct I/O fallback sync simplification Date: Wed, 23 Sep 2009 15:07:30 +0200 Message-ID: <20090923130730.GC10759@lst.de> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Cc: linux-fsdevel@vger.kernel.org To: Al Viro , Nick Piggin , Jan Kara Return-path: Received: from verein.lst.de ([213.95.11.210]:35537 "EHLO verein.lst.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751389AbZIWNH1 (ORCPT ); Wed, 23 Sep 2009 09:07:27 -0400 Content-Disposition: inline Sender: linux-fsdevel-owner@vger.kernel.org List-ID: In the case of direct I/O falling back to buffered I/O we sync data twice currently: once at the end of generic_file_buffered_write using filemap_write_and_wait_range and once a little later in __generic_file_aio_write using do_sync_mapping_range with all flags set. The wait before write of the do_sync_mapping_range call does not make any sense, so just keep the filemap_write_and_wait_range call and move it to the right spot. Signed-off-by: Christoph Hellwig Index: vfs-2.6.git/mm/filemap.c =================================================================== --- vfs-2.6.git.orig/mm/filemap.c 2009-09-22 14:20:59.917761567 -0300 +++ vfs-2.6.git/mm/filemap.c 2009-09-22 14:28:01.833832530 -0300 @@ -2265,15 +2265,6 @@ generic_file_buffered_write(struct kiocb *ppos = pos + status; } - /* - * If we get here for O_DIRECT writes then we must have fallen through - * to buffered writes (block instantiation inside i_size). So we sync - * the file data here, to try to honour O_DIRECT expectations. - */ - if (unlikely(file->f_flags & O_DIRECT) && written) - status = filemap_write_and_wait_range(mapping, - pos, pos + written - 1); - return written ? written : status; } EXPORT_SYMBOL(generic_file_buffered_write); @@ -2372,10 +2363,7 @@ ssize_t __generic_file_aio_write(struct * semantics. */ endbyte = pos + written_buffered - written - 1; - err = do_sync_mapping_range(file->f_mapping, pos, endbyte, - SYNC_FILE_RANGE_WAIT_BEFORE| - SYNC_FILE_RANGE_WRITE| - SYNC_FILE_RANGE_WAIT_AFTER); + err = filemap_write_and_wait_range(file->f_mapping, pos, endbyte); if (err == 0) { written = written_buffered; invalidate_mapping_pages(mapping,