From mboxrd@z Thu Jan 1 00:00:00 1970 From: Andrew Morton Subject: Re: Correct behavior on O_DIRECT sparse file writes Date: Fri, 12 Oct 2007 14:02:33 -0700 Message-ID: <20071012140233.ad7b517d.akpm@linux-foundation.org> References: <1192221567.1375.81.camel@think.oraclecorp.com> Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Cc: linux-fsdevel@vger.kernel.org To: Chris Mason Return-path: Received: from smtp2.linux-foundation.org ([207.189.120.14]:37280 "EHLO smtp2.linux-foundation.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757542AbXJLVCp (ORCPT ); Fri, 12 Oct 2007 17:02:45 -0400 In-Reply-To: <1192221567.1375.81.camel@think.oraclecorp.com> Sender: linux-fsdevel-owner@vger.kernel.org List-Id: linux-fsdevel.vger.kernel.org On Fri, 12 Oct 2007 16:39:27 -0400 Chris Mason wrote: > Hello everyone, > > The test below creates a sparse file and then fills a hole with > O_DIRECT. As far as I can tell from reading generic_osync_inode, the > filesystem metadata is only forced to disk if i_size changes during the > file write. I've tested ext3, xfs and reiserfs and they all skip the > commit when filling holes. > > I would argue that filling holes via O_DIRECT is supposed to commit the > metadata required to find those file blocks later. At least on ext3, > O_SYNC does force a commit on fill holes (haven't tested others). > > So, is the current behavior a bug or a feature? I don't think it's a bug. Sure, O_DIRECT is synchronous, but that's because it is, err, direct. Not because it provides extra data-integrity guarantees. If you want those guarantees, use O_SYNC as well. > dd if=/dev/zero of=foo bs=1M seek=1 count=1 oflag=direct > > hexdump foo | head -n 2 > 0000000 62b1 ea2d 73e8 c64f f5ef 1af5 dd09 8ccd > 0000010 75ec 9581 e0ea ae9b e28f b76d a700 4d5b > > dd if=/dev/urandom of=foo bs=4k count=1 conv=notrunc oflag=direct > reboot -nf > > (after reboot) > > hexdump foo > 0000000 0000 0000 0000 0000 0000 0000 0000 0000 > * > 0200000 > > -chris >