From: Jeff Layton <jlayton@kernel.org>
To: Qu Wenruo <quwenruo.btrfs@gmx.com>,
linux-btrfs <linux-btrfs@vger.kernel.org>
Subject: Re: btrfs blocks root from writing even when there is plenty of statfs->f_bfree
Date: Fri, 25 Aug 2023 06:06:30 -0400 [thread overview]
Message-ID: <2c789ca858b0c2c52a5e90aba403144fbff3f941.camel@kernel.org> (raw)
In-Reply-To: <32999248-c1e9-4601-9a1e-b236a7fa8638@gmx.com>
On Fri, 2023-08-25 at 10:12 +0800, Qu Wenruo wrote:
>
> On 2023/8/25 09:23, Qu Wenruo wrote:
> >
> >
> > On 2023/8/25 04:33, Jeff Layton wrote:
> > > I've been doing some testing with btrfs exported via nfsd and hit this
> > > bug. root is unable to write to the filesystem, even though statfs
> > > reports that there should be 400k+ blocks available.
> > >
> > > The reproducer is pretty simple. First I fill up the filesystem as an
> > > unprivileged user (let this run until I hit ENOSPC):
> > >
> > > [vagrant@kdevops-nfs-default btrfs]$ dd if=/dev/urandom
> > > of=/media/btrfs/bigfile bs=1M
> > >
> > > ...and then try to write to a file on the fs as root:
> > >
> > > [root@kdevops-nfs-default btrfs]# strace -f -e statfs df .
> > > statfs(".", {f_type=BTRFS_SUPER_MAGIC, f_bsize=4096,
> > > f_blocks=26214400, f_bfree=452204, f_bavail=0, f_files=0, f_ffree=0,
> > > f_fsid={val=[0xa9d43863, 0xb08b34cc]}, f_namelen=255, f_frsize=4096,
> > > f_flags=ST_VALID|ST_RELATIME}) = 0
> >
> > Note that, unlike XFS/EXT4, btrfs goes strict limits between data and
> > metadata.
> >
> > Metadata space can only be used to store tree blocks, never data.
> > And both metadata and data space are allocated dynamically, thus we have
> > have problems when the workload is unbalanced.
> > (This is a little like the inodes limits on XFS/EXT4, but more dynamic)
> >
> > In your particular case, the data space is all used up, but metadata
> > space still has some free space.
> >
> > And f_btree returned by btrfs is including the metadata space, as
> > although that's inaccurate, it's the best what we can do to report.
> >
> >
> > > Filesystem 1K-blocks Used Available Use% Mounted on
> > > /dev/nvme2n1 104857600 103048784 0 100% /media/btrfs
> > > +++ exited with 0 +++
> > > [root@kdevops-nfs-default btrfs]# xfs_io -f -c "pwrite -b 4096 4096
> > > 4096" ./file1
> > > pwrite: No space left on device
> > >
> > > This works on ext4 and xfs. The kernel is Linus' master branch as of a
> > > couple of days ago:
> > >
> > > 6.5.0-rc7-g081b0d4bef5d
> > >
> > > Let me know if you need more info.
> >
> > That's why for btrfs we recommend to go "btrfs fi usage" to get a more
> > comprehensive understand on the space usage.
> >
> > In your case, Data usage should be 100%, without any spare ones.
>
> Another thing is, btrfs doesn't have any extra data space reserved for
> root user, instead btrfs has extra space reserved for metadata, as
> metadata COW will cost extra space, even doing things like unlinking a file.
>
> Thus this would be a behavior difference here.
>
Got it, thanks for the explanation.
FWIW, I noticed this because generic/186 and generic/187 were failing on
NFS exported btrfs, but was passing with XFS, they get _notrun:
generic/186 [not run] Can't fragment free space on btrfs.
generic/187 [not run] Can't fragment free space on btrfs.
I'll probably just skip this test on NFS since it only reliably passes
on certain exported filesystems.
Thanks again!
--
Jeff Layton <jlayton@kernel.org>
prev parent reply other threads:[~2023-08-25 10:07 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-08-24 20:33 btrfs blocks root from writing even when there is plenty of statfs->f_bfree Jeff Layton
2023-08-25 1:23 ` Qu Wenruo
2023-08-25 2:12 ` Qu Wenruo
2023-08-25 10:06 ` Jeff Layton [this message]
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=2c789ca858b0c2c52a5e90aba403144fbff3f941.camel@kernel.org \
--to=jlayton@kernel.org \
--cc=linux-btrfs@vger.kernel.org \
--cc=quwenruo.btrfs@gmx.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