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
This commit is contained in:
Michael Schröder 2015-10-14 11:24:12 +00:00 committed by Git OBS Bridge
parent b1c97be269
commit 48bb2cd8e9
3 changed files with 63 additions and 0 deletions

54
nfs-blocksize-free.patch Normal file
View File

@ -0,0 +1,54 @@
From 07f6674286467f82adf0d370b8d12d72aee6817c Mon Sep 17 00:00:00 2001
From: Fabian Vogt <fvogt@suse.com>
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 <fvogt@suse.com>
---
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 <inttypes.h>
+#include <linux/magic.h> /* NFS_SUPER_MAGIC */
+
#include <rpm/rpmlib.h> /* rpmMachineScore, rpmReadPackageFile */
#include <rpm/rpmmacro.h> /* XXX for rpmExpand */
#include <rpm/rpmlog.h>
@@ -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

View File

@ -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

View File

@ -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