On Tue, Jan 29, 2019 at 02:57:39PM +0800, Qu Wenruo wrote:
> The most straightforward is to sync the fs before balancing metadata
> chunks.
>
> We could enhance the kernel bytes_may_use calculation, but I doubt about
> the complexity.
> So I take the easy fix to reduce the false ENOSPC reports.
Agreed.
> + /*
> + * There may be many over-reserved space for metadata block groups,
> + * especially for inlined file extents.
> + *
> + * Do a sync here will free those over-reserved space and hugely
> + * reduce the possibility of some false ENOSPC
> + */
> + if (args->flags & BTRFS_BALANCE_METADATA) {
> + ret = btrfs_util_sync(path);
As the fd is already open, we should use the _fd version,
> + if (ret) {
> + error("failed to sync the fs before balance: %m");
> + ret = -errno;
> + goto out;
and possibly only warn if there's an error returned as the sync failure
is not a critical condition.