diff --git a/debian/changelog b/debian/changelog index 856ddca95..7b2a8a8a9 100644 --- a/debian/changelog +++ b/debian/changelog @@ -3,6 +3,8 @@ linux (4.2~rc8-1~exp2) UNRELEASED; urgency=medium * Remove all support for ia64 (Closes: #679545, #691576, #728706) * [s390x] Compile with gcc-4.9 (Closes: #796845) * linux-source: Depend on xz-utils, not bzip2 (Closes: #796940) + * gfs2: Make statistics unsigned, suitable for use with do_div() + (fixes FTBFS on mips,mipsel,m68k) -- Ben Hutchings Tue, 25 Aug 2015 18:50:57 +0100 diff --git a/debian/patches/bugfix/all/gfs2-make-statistics-unsigned-suitable-for-use-with-.patch b/debian/patches/bugfix/all/gfs2-make-statistics-unsigned-suitable-for-use-with-.patch new file mode 100644 index 000000000..084de2dd4 --- /dev/null +++ b/debian/patches/bugfix/all/gfs2-make-statistics-unsigned-suitable-for-use-with-.patch @@ -0,0 +1,128 @@ +From: Ben Hutchings +Date: Wed, 26 Aug 2015 00:44:21 +0100 +Subject: gfs2: Make statistics unsigned, suitable for use with do_div() +Forwarded: http://mid.gmane.org/1440548464.26026.9.camel@decadent.org.uk + +None of these statistics can meaningfully be negative, and the +numerator for do_div() must have the type u64. The generic +implementation of do_div() used on some 32-bit architectures asserts +that, resulting in a compiler error in gfs2_rgrp_congested(). + +Fixes: 0166b197c2ed ("GFS2: Average in only non-zero round-trip times ...") +Signed-off-by: Ben Hutchings +--- + fs/gfs2/glock.c | 22 +++++++++++----------- + fs/gfs2/incore.h | 2 +- + fs/gfs2/rgrp.c | 8 ++++---- + fs/gfs2/trace_gfs2.h | 16 ++++++++-------- + 4 files changed, 24 insertions(+), 24 deletions(-) + +diff --git a/fs/gfs2/glock.c b/fs/gfs2/glock.c +index a38e38f..1b6aebe 100644 +--- a/fs/gfs2/glock.c ++++ b/fs/gfs2/glock.c +@@ -1733,17 +1733,17 @@ static int gfs2_glstats_seq_show(struct seq_file *seq, void *iter_ptr) + { + struct gfs2_glock *gl = iter_ptr; + +- seq_printf(seq, "G: n:%u/%llx rtt:%lld/%lld rttb:%lld/%lld irt:%lld/%lld dcnt: %lld qcnt: %lld\n", ++ seq_printf(seq, "G: n:%u/%llx rtt:%llu/%llu rttb:%llu/%llu irt:%llu/%llu dcnt: %llu qcnt: %llu\n", + gl->gl_name.ln_type, + (unsigned long long)gl->gl_name.ln_number, +- (long long)gl->gl_stats.stats[GFS2_LKS_SRTT], +- (long long)gl->gl_stats.stats[GFS2_LKS_SRTTVAR], +- (long long)gl->gl_stats.stats[GFS2_LKS_SRTTB], +- (long long)gl->gl_stats.stats[GFS2_LKS_SRTTVARB], +- (long long)gl->gl_stats.stats[GFS2_LKS_SIRT], +- (long long)gl->gl_stats.stats[GFS2_LKS_SIRTVAR], +- (long long)gl->gl_stats.stats[GFS2_LKS_DCOUNT], +- (long long)gl->gl_stats.stats[GFS2_LKS_QCOUNT]); ++ (unsigned long long)gl->gl_stats.stats[GFS2_LKS_SRTT], ++ (unsigned long long)gl->gl_stats.stats[GFS2_LKS_SRTTVAR], ++ (unsigned long long)gl->gl_stats.stats[GFS2_LKS_SRTTB], ++ (unsigned long long)gl->gl_stats.stats[GFS2_LKS_SRTTVARB], ++ (unsigned long long)gl->gl_stats.stats[GFS2_LKS_SIRT], ++ (unsigned long long)gl->gl_stats.stats[GFS2_LKS_SIRTVAR], ++ (unsigned long long)gl->gl_stats.stats[GFS2_LKS_DCOUNT], ++ (unsigned long long)gl->gl_stats.stats[GFS2_LKS_QCOUNT]); + return 0; + } + +@@ -1780,7 +1780,7 @@ static int gfs2_sbstats_seq_show(struct seq_file *seq, void *iter_ptr) + struct gfs2_sbd *sdp = gi->sdp; + unsigned index = gi->hash >> 3; + unsigned subindex = gi->hash & 0x07; +- s64 value; ++ u64 value; + int i; + + if (index == 0 && subindex != 0) +@@ -1796,7 +1796,7 @@ static int gfs2_sbstats_seq_show(struct seq_file *seq, void *iter_ptr) + } else { + value = lkstats->lkstats[index - 1].stats[subindex]; + } +- seq_printf(seq, " %15lld", (long long)value); ++ seq_printf(seq, " %15llu", (long long)value); + } + seq_putc(seq, '\n'); + return 0; +diff --git a/fs/gfs2/incore.h b/fs/gfs2/incore.h +index a1ec7c2..7647e31 100644 +--- a/fs/gfs2/incore.h ++++ b/fs/gfs2/incore.h +@@ -241,7 +241,7 @@ enum { + }; + + struct gfs2_lkstats { +- s64 stats[GFS2_NR_LKSTATS]; ++ u64 stats[GFS2_NR_LKSTATS]; + }; + + enum { +diff --git a/fs/gfs2/rgrp.c b/fs/gfs2/rgrp.c +index c6c6232..2884f6f 100644 +--- a/fs/gfs2/rgrp.c ++++ b/fs/gfs2/rgrp.c +@@ -1862,11 +1862,11 @@ static bool gfs2_rgrp_congested(const struct gfs2_rgrpd *rgd, int loops) + const struct gfs2_glock *gl = rgd->rd_gl; + const struct gfs2_sbd *sdp = gl->gl_sbd; + struct gfs2_lkstats *st; +- s64 r_dcount, l_dcount; +- s64 l_srttb, a_srttb = 0; ++ u64 r_dcount, l_dcount; ++ u64 l_srttb, a_srttb = 0; + s64 srttb_diff; +- s64 sqr_diff; +- s64 var; ++ u64 sqr_diff; ++ u64 var; + int cpu, nonzero = 0; + + preempt_disable(); +diff --git a/fs/gfs2/trace_gfs2.h b/fs/gfs2/trace_gfs2.h +index 20c007d..03a7049 100644 +--- a/fs/gfs2/trace_gfs2.h ++++ b/fs/gfs2/trace_gfs2.h +@@ -267,14 +267,14 @@ TRACE_EVENT(gfs2_glock_lock_time, + __field( int, status ) + __field( char, flags ) + __field( s64, tdiff ) +- __field( s64, srtt ) +- __field( s64, srttvar ) +- __field( s64, srttb ) +- __field( s64, srttvarb ) +- __field( s64, sirt ) +- __field( s64, sirtvar ) +- __field( s64, dcount ) +- __field( s64, qcount ) ++ __field( u64, srtt ) ++ __field( u64, srttvar ) ++ __field( u64, srttb ) ++ __field( u64, srttvarb ) ++ __field( u64, sirt ) ++ __field( u64, sirtvar ) ++ __field( u64, dcount ) ++ __field( u64, qcount ) + ), + + TP_fast_assign( diff --git a/debian/patches/series b/debian/patches/series index ec98c2482..abc5a4331 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -85,3 +85,5 @@ features/all/grsecurity/grsecurity-kconfig.patch # Disabled until we add code into the grsecurity/ directory #features/all/grsecurity/grsecurity-kbuild.patch features/all/grsecurity/grkernsec_perf_harden.patch + +bugfix/all/gfs2-make-statistics-unsigned-suitable-for-use-with-.patch