From: Florian Weimer <fweimer@redhat.com>
To: linux-btrfs@vger.kernel.org
Subject: btrfs loses 32-bit application compatibility after a while
Date: Thu, 13 Jul 2023 10:09:31 +0200 [thread overview]
Message-ID: <87cz0w1bd0.fsf@oldenburg.str.redhat.com> (raw)
As far as I can tell, btrfs assigns inode numbers sequentially using
this function:
int btrfs_get_free_objectid(struct btrfs_root *root, u64 *objectid)
{
int ret;
mutex_lock(&root->objectid_mutex);
if (unlikely(root->free_objectid >= BTRFS_LAST_FREE_OBJECTID)) {
btrfs_warn(root->fs_info,
"the objectid of root %llu reaches its highest value",
root->root_key.objectid);
ret = -ENOSPC;
goto out;
}
*objectid = root->free_objectid++;
ret = 0;
out:
mutex_unlock(&root->objectid_mutex);
return ret;
}
Even after deletion of the object, inode numbers are never reused.
This is a problem because after creating and deleting two billion files,
the 31-bit inode number space is exhausted. (Not sure if negative inode
numbers are a thing, so there could be one extra bit.) From that point
onwards, future files will end up with an inode number that cannot be
represented with the non-LFS interfaces (stat, getdents, etc.), causing
system calls to fail with EOVERFLOW.
For ABI reasons, we can't switch everything to 64-bit ino_t and LFS
interfaces. (If we could recompile, we wouldn't still be using 32-bit
software.)
So far, we have seen this on our 32-bit Koji builders, which create and
delete many, many files. But I suspect end users will encounter it
eventually, too.
It seems to me that the on-disk format already allows range searches on
inode numbers (see btrfs_init_root_free_objectid), so maybe this could
be used to find a sufficiently large unused range to allocate from.
Thanks,
Florian
next reply other threads:[~2023-07-13 8:13 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-07-13 8:09 Florian Weimer [this message]
2023-07-15 7:55 ` btrfs loses 32-bit application compatibility after a while Goffredo Baroncelli
2023-07-15 9:09 ` Neal Gompa
2023-07-15 9:30 ` Goffredo Baroncelli
2023-07-16 9:01 ` Florian Weimer
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=87cz0w1bd0.fsf@oldenburg.str.redhat.com \
--to=fweimer@redhat.com \
--cc=linux-btrfs@vger.kernel.org \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.