From: "Austin S. Hemmelgarn" <ahferroin7@gmail.com>
To: bo.li.liu@oracle.com
Cc: "Darrick J. Wong" <darrick.wong@oracle.com>,
linux-api@vger.kernel.org, xfs@oss.sgi.com,
Christoph Hellwig <hch@infradead.org>,
linux-fsdevel <linux-fsdevel@vger.kernel.org>,
linux-btrfs <linux-btrfs@vger.kernel.org>
Subject: Re: fallocate mode flag for "unshare blocks"?
Date: Thu, 31 Mar 2016 07:38:49 -0400 [thread overview]
Message-ID: <56FD0C49.7040308@gmail.com> (raw)
In-Reply-To: <56FD079F.3060606@gmail.com>
On 2016-03-31 07:18, Austin S. Hemmelgarn wrote:
> On 2016-03-30 20:32, Liu Bo wrote:
>> On Wed, Mar 30, 2016 at 11:27:55AM -0700, Darrick J. Wong wrote:
>>> Hi all,
>>>
>>> Christoph and I have been working on adding reflink and CoW support to
>>> XFS recently. Since the purpose of (mode 0) fallocate is to make sure
>>> that future file writes cannot ENOSPC, I extended the XFS fallocate
>>> handler to unshare any shared blocks via the copy on write mechanism I
>>> built for it. However, Christoph shared the following concerns with
>>> me about that interpretation:
>>>
>>>> I know that I suggested unsharing blocks on fallocate, but it turns out
>>>> this is causing problems. Applications expect falloc to be a fast
>>>> metadata operation, and copying a potentially large number of blocks
>>>> is against that expextation. This is especially bad for the NFS
>>>> server, which should not be blocked for a long time in a synchronous
>>>> operation.
>>>>
>>>> I think we'll have to remove the unshare and just fail the fallocate
>>>> for a reflinked region for now. I still think it makes sense to expose
>>>> an unshare operation, and we probably should make that another
>>>> fallocate mode.
>>
>> I'm expecting fallocate to be fast, too.
>>
>> Well, btrfs fallocate doesn't allocate space if it's a shared one
>> because it thinks the space is already allocated. So a later overwrite
>> over this shared extent may hit enospc errors.
> And this _really_ should get fixed, otherwise glibc will add a check for
> running posix_fallocate against BTRFS and force emulation, and people
> _will_ complain about performance.
>
Thinking a bit further about this, how hard would it be to add the
ability to have unwritten extents point somewhere else for reads? Then
when we get an fallocate call, we create the unwritten extents, and add
the metadata to make them read from the shared region. Then, when a
write gets issued to that extent, the parts that aren't being written in
that block get copied, the write happens, and then the link for that
block gets removed. This way, fallocate would still provide the correct
semantics, it would be relatively fast (still not quite as fast as it is
now, but it wouldn't be anywhere near as slow as copying the data), and
the cost of copying gets amortized across writes (we may not need to
copy everything, but we'll still copy less than we would for just
un-sharing the extent). This would of course need to be an incompat
feature, but I would personally say that's not as much of an issue, as
things are subtly broken in the common use-case right now (at this point
I'm just thinking BTRFS, as what Darrick suggested for XFS seems to be a
better solution there at least short term).
_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs
next prev parent reply other threads:[~2016-03-31 11:38 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20160302155007.GB7125@infradead.org>
[not found] ` <20160302155007.GB7125-wEGCiKHe2LqWVfeAwA7xHQ@public.gmane.org>
2016-03-30 18:27 ` fallocate mode flag for "unshare blocks"? Darrick J. Wong
2016-03-30 18:58 ` Austin S. Hemmelgarn
2016-03-31 7:58 ` Christoph Hellwig
2016-03-31 11:13 ` Austin S. Hemmelgarn
[not found] ` <20160330182755.GC2236-PTl6brltDGh4DFYR7WNSRA@public.gmane.org>
2016-03-31 0:32 ` Liu Bo
2016-03-31 7:55 ` Christoph Hellwig
[not found] ` <20160331075529.GB4209-wEGCiKHe2LqWVfeAwA7xHQ@public.gmane.org>
2016-03-31 15:31 ` Andreas Dilger
2016-03-31 15:43 ` Austin S. Hemmelgarn
[not found] ` <3E147309-67EA-4B29-B4E0-883BA03B7BFC-m1MBpc4rdrD3fQ9qLvQP4Q@public.gmane.org>
2016-03-31 16:47 ` Henk Slager
2016-03-31 11:18 ` Austin S. Hemmelgarn
2016-03-31 11:38 ` Austin S. Hemmelgarn [this message]
[not found] ` <56FD079F.3060606-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2016-03-31 19:52 ` Liu Bo
2016-03-31 1:18 ` Dave Chinner
2016-03-31 7:54 ` Christoph Hellwig
2016-03-31 11:18 ` Dave Chinner
2016-03-31 18:08 ` J. Bruce Fields
2016-03-31 18:19 ` Darrick J. Wong
[not found] ` <20160331180821.GD22462-uC3wQj2KruNg9hUCZPvPmw@public.gmane.org>
2016-03-31 19:47 ` Andreas Dilger
[not found] ` <779E9BCF-8224-44FE-8AAE-E0341A7B475C-m1MBpc4rdrD3fQ9qLvQP4Q@public.gmane.org>
2016-03-31 22:20 ` Dave Chinner
2016-03-31 22:34 ` J. Bruce Fields
2016-04-01 0:33 ` Dave Chinner
2016-04-01 2:00 ` J. Bruce Fields
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=56FD0C49.7040308@gmail.com \
--to=ahferroin7@gmail.com \
--cc=bo.li.liu@oracle.com \
--cc=darrick.wong@oracle.com \
--cc=hch@infradead.org \
--cc=linux-api@vger.kernel.org \
--cc=linux-btrfs@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=xfs@oss.sgi.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).