e35c31290b
Resolves: rhbz#2224102
58 lines
2.0 KiB
Diff
58 lines
2.0 KiB
Diff
From 9053aaffab2ec02ed377a82389422cc4e77dff8a Mon Sep 17 00:00:00 2001
|
|
From: Abylay Ospan <aospan@amazon.com>
|
|
Date: Tue, 6 Jun 2023 02:13:14 +0000
|
|
Subject: [PATCH 16/17] commit: fix ostree deployment on 64-bit inode fs
|
|
|
|
This commit addresses a bug that was causing ostree deployment
|
|
to become corrupted on the large fs, when any package was installed using
|
|
'rpm-ostree install'.
|
|
|
|
In such instances, multiple files were assigned the same inode. For
|
|
example, the '/home' directory and a regular file 'pkg-get' were
|
|
assigned the same inode (2147484070), making the deployment unusable.
|
|
|
|
A root cause analysis was performed, running the process under gdb,
|
|
which revealed a lossy conversion from guint64 to guint32, for example
|
|
6442451366 converted to 2147484070:
|
|
|
|
(gdb) p name
|
|
$10 = 0x7fe9224d2d70 "home"
|
|
|
|
(gdb) p inode
|
|
$73 = 6442451366
|
|
|
|
(gdb) s
|
|
device=66311, modifier=0x7fe914791840) at
|
|
src/libostree/ostree-repo-commit.c:1590
|
|
|
|
The conversion resulted in entirely independent files potentially
|
|
receiving the same inode.
|
|
|
|
The issue was discovered on PoC machine equipped with a large NVME
|
|
(3.4TB), but the bug can be easily reproduced using `cosa run -m 4000
|
|
--qemu-size +3TB', followed by installation of any package using
|
|
`rpm-ostree install`. The resulting deployment will be unusable due to
|
|
many files being "corrupted" by the aforementioned issue.
|
|
|
|
(cherry picked from commit de6fddc6adee09a93901243dc7074090828a1912)
|
|
---
|
|
src/libostree/ostree-repo-commit.c | 2 +-
|
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
|
|
diff --git a/src/libostree/ostree-repo-commit.c b/src/libostree/ostree-repo-commit.c
|
|
index dba98c32..e224d1cb 100644
|
|
--- a/src/libostree/ostree-repo-commit.c
|
|
+++ b/src/libostree/ostree-repo-commit.c
|
|
@@ -1584,7 +1584,7 @@ static const char *
|
|
devino_cache_lookup (OstreeRepo *self,
|
|
OstreeRepoCommitModifier *modifier,
|
|
guint32 device,
|
|
- guint32 inode)
|
|
+ guint64 inode)
|
|
{
|
|
OstreeDevIno dev_ino_key;
|
|
OstreeDevIno *dev_ino_val;
|
|
--
|
|
2.40.1
|
|
|