From 48bb2cd8e94fa50b8f49965a005d5cf74e8a09f471766dd3a7ecd7915522c0cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Schr=C3=B6der?= Date: Wed, 14 Oct 2015 11:24:12 +0000 Subject: [PATCH] Accepting request 336568 from home:favogt:branches:Base:System Please review this thoroughly, I've never looked at rpm's code before. (I revoked the last SR as it did not contain a required change I forgot to commit) - Add nfs-blocksize-free.patch: * Blocksize of NFS shouldn't be used directly - Fixes bsc#894610 and bsc#829717 OBS-URL: https://build.opensuse.org/request/show/336568 OBS-URL: https://build.opensuse.org/package/show/Base:System/rpm?expand=0&rev=361 --- nfs-blocksize-free.patch | 54 ++++++++++++++++++++++++++++++++++++++++ rpm.changes | 7 ++++++ rpm.spec | 2 ++ 3 files changed, 63 insertions(+) create mode 100644 nfs-blocksize-free.patch diff --git a/nfs-blocksize-free.patch b/nfs-blocksize-free.patch new file mode 100644 index 0000000..40add01 --- /dev/null +++ b/nfs-blocksize-free.patch @@ -0,0 +1,54 @@ +From 07f6674286467f82adf0d370b8d12d72aee6817c Mon Sep 17 00:00:00 2001 +From: Fabian Vogt +Date: Mon, 28 Sep 2015 18:21:19 +0200 +Subject: [PATCH] Blocksize of NFS shouldn't be used directly + +RPM uses the blocksize to calculate whether an RPM +can be installed on the system. For NFS this fails +for e.g. glibc-locale as it has many small files, +which rpm counts as one block. As huge NFS block +sizes (>= 1MiB) are common, this makes glibc-locale +roughly 7 GiB in installed size. + +As a workaround, if the NFS block size is > 4096, +assume 4096 and scale the count of free blocks +accordingly. + +See also RH bug 847960 + +Signed-off-by: Fabian Vogt +--- + lib/transaction.c | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +diff --git a/lib/transaction.c b/lib/transaction.c +index 8167640..d8d8820 100644 +--- a/lib/transaction.c ++++ b/lib/transaction.c +@@ -6,6 +6,8 @@ + + #include + ++#include /* NFS_SUPER_MAGIC */ ++ + #include /* rpmMachineScore, rpmReadPackageFile */ + #include /* XXX for rpmExpand */ + #include +@@ -137,6 +139,14 @@ static rpmDiskSpaceInfo rpmtsCreateDSI(const rpmts ts, dev_t dev, + /* XXX assigning negative value to unsigned type */ + dsi->iavail = !(sfb.f_ffree == 0 && sfb.f_files == 0) + ? sfb.f_ffree : -1; ++ ++ /* We can't tell the block size of a network file system. ++ * sfb.f_bsize would be the network layer's block size. */ ++ if(sfb.f_type == NFS_SUPER_MAGIC && dsi->bsize > 4096) { ++ int64_t old_bsize = dsi->bsize; ++ dsi->bsize = 4096; /* Assume 4k block size */ ++ dsi->bavail *= old_bsize / dsi->bsize; ++ } + + /* Find mount point belonging to this device number */ + resolved_path = realpath(dirName, mntPoint); +-- +2.5.2 + diff --git a/rpm.changes b/rpm.changes index 5cfd614..09b0088 100644 --- a/rpm.changes +++ b/rpm.changes @@ -1,3 +1,10 @@ +------------------------------------------------------------------- +Thu Oct 1 14:35:04 UTC 2015 - fvogt@suse.com + +- Add nfs-blocksize-free.patch: + * Blocksize of NFS shouldn't be used directly +- Fixes bsc#894610 and bsc#829717 + ------------------------------------------------------------------- Mon Sep 21 07:43:58 UTC 2015 - schwab@suse.de diff --git a/rpm.spec b/rpm.spec index a0115e6..034073f 100644 --- a/rpm.spec +++ b/rpm.spec @@ -132,6 +132,7 @@ Patch94: checksepwarn.diff Patch95: fixsizeforbigendian.diff Patch96: modalias-no-kgraft.diff Patch97: rpm-4.12.0.1-lua-5.3.patch +Patch98: nfs-blocksize-free.patch Patch6464: auto-config-update-aarch64-ppc64le.diff BuildRoot: %{_tmppath}/%{name}-%{version}-build # @@ -226,6 +227,7 @@ rm -f rpmdb/db.h %patch -P 85 %patch -P 92 -P 93 -P 94 -P 95 -P 96 %patch97 -p1 +%patch98 -p1 %ifarch aarch64 ppc64le %patch6464