From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jan Kara Subject: Re: [PATCH] direct I/O fallback sync simplification Date: Tue, 29 Sep 2009 15:08:00 +0200 Message-ID: <20090929130800.GA11573@duck.suse.cz> References: <20090923130730.GC10759@lst.de> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Cc: Al Viro , Nick Piggin , Jan Kara , linux-fsdevel@vger.kernel.org To: Christoph Hellwig Return-path: Received: from cantor2.suse.de ([195.135.220.15]:58654 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750698AbZI2NIB (ORCPT ); Tue, 29 Sep 2009 09:08:01 -0400 Content-Disposition: inline In-Reply-To: <20090923130730.GC10759@lst.de> Sender: linux-fsdevel-owner@vger.kernel.org List-ID: On Wed 23-09-09 15:07:30, Christoph Hellwig wrote: > 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 Looks much better. Acked-by: Jan Kara Honza > > 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, -- Jan Kara SUSE Labs, CR