Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

gfs2: Make statistics unsigned, suitable for use with do_div()

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 <ben@decadent.org.uk>
Signed-off-by: Bob Peterson <rpeterso@redhat.com>
Acked-by: Andreas Gruenbacher <agruenba@redhat.com>

authored by

Ben Hutchings and committed by
Bob Peterson
4d207133 88ffbf3e

+24 -24
+11 -11
fs/gfs2/glock.c
··· 1680 1680 { 1681 1681 struct gfs2_glock *gl = iter_ptr; 1682 1682 1683 - seq_printf(seq, "G: n:%u/%llx rtt:%lld/%lld rttb:%lld/%lld irt:%lld/%lld dcnt: %lld qcnt: %lld\n", 1683 + seq_printf(seq, "G: n:%u/%llx rtt:%llu/%llu rttb:%llu/%llu irt:%llu/%llu dcnt: %llu qcnt: %llu\n", 1684 1684 gl->gl_name.ln_type, 1685 1685 (unsigned long long)gl->gl_name.ln_number, 1686 - (long long)gl->gl_stats.stats[GFS2_LKS_SRTT], 1687 - (long long)gl->gl_stats.stats[GFS2_LKS_SRTTVAR], 1688 - (long long)gl->gl_stats.stats[GFS2_LKS_SRTTB], 1689 - (long long)gl->gl_stats.stats[GFS2_LKS_SRTTVARB], 1690 - (long long)gl->gl_stats.stats[GFS2_LKS_SIRT], 1691 - (long long)gl->gl_stats.stats[GFS2_LKS_SIRTVAR], 1692 - (long long)gl->gl_stats.stats[GFS2_LKS_DCOUNT], 1693 - (long long)gl->gl_stats.stats[GFS2_LKS_QCOUNT]); 1686 + (unsigned long long)gl->gl_stats.stats[GFS2_LKS_SRTT], 1687 + (unsigned long long)gl->gl_stats.stats[GFS2_LKS_SRTTVAR], 1688 + (unsigned long long)gl->gl_stats.stats[GFS2_LKS_SRTTB], 1689 + (unsigned long long)gl->gl_stats.stats[GFS2_LKS_SRTTVARB], 1690 + (unsigned long long)gl->gl_stats.stats[GFS2_LKS_SIRT], 1691 + (unsigned long long)gl->gl_stats.stats[GFS2_LKS_SIRTVAR], 1692 + (unsigned long long)gl->gl_stats.stats[GFS2_LKS_DCOUNT], 1693 + (unsigned long long)gl->gl_stats.stats[GFS2_LKS_QCOUNT]); 1694 1694 return 0; 1695 1695 } 1696 1696 ··· 1727 1727 loff_t pos = *(loff_t *)iter_ptr; 1728 1728 unsigned index = pos >> 3; 1729 1729 unsigned subindex = pos & 0x07; 1730 - s64 value; 1730 + u64 value; 1731 1731 int i; 1732 1732 1733 1733 if (index == 0 && subindex != 0) ··· 1743 1743 } else { 1744 1744 value = lkstats->lkstats[index - 1].stats[subindex]; 1745 1745 } 1746 - seq_printf(seq, " %15lld", (long long)value); 1746 + seq_printf(seq, " %15llu", (long long)value); 1747 1747 } 1748 1748 seq_putc(seq, '\n'); 1749 1749 return 0;
+1 -1
fs/gfs2/incore.h
··· 244 244 }; 245 245 246 246 struct gfs2_lkstats { 247 - s64 stats[GFS2_NR_LKSTATS]; 247 + u64 stats[GFS2_NR_LKSTATS]; 248 248 }; 249 249 250 250 enum {
+4 -4
fs/gfs2/rgrp.c
··· 1862 1862 const struct gfs2_glock *gl = rgd->rd_gl; 1863 1863 const struct gfs2_sbd *sdp = gl->gl_name.ln_sbd; 1864 1864 struct gfs2_lkstats *st; 1865 - s64 r_dcount, l_dcount; 1866 - s64 l_srttb, a_srttb = 0; 1865 + u64 r_dcount, l_dcount; 1866 + u64 l_srttb, a_srttb = 0; 1867 1867 s64 srttb_diff; 1868 - s64 sqr_diff; 1869 - s64 var; 1868 + u64 sqr_diff; 1869 + u64 var; 1870 1870 int cpu, nonzero = 0; 1871 1871 1872 1872 preempt_disable();
+8 -8
fs/gfs2/trace_gfs2.h
··· 267 267 __field( int, status ) 268 268 __field( char, flags ) 269 269 __field( s64, tdiff ) 270 - __field( s64, srtt ) 271 - __field( s64, srttvar ) 272 - __field( s64, srttb ) 273 - __field( s64, srttvarb ) 274 - __field( s64, sirt ) 275 - __field( s64, sirtvar ) 276 - __field( s64, dcount ) 277 - __field( s64, qcount ) 270 + __field( u64, srtt ) 271 + __field( u64, srttvar ) 272 + __field( u64, srttb ) 273 + __field( u64, srttvarb ) 274 + __field( u64, sirt ) 275 + __field( u64, sirtvar ) 276 + __field( u64, dcount ) 277 + __field( u64, qcount ) 278 278 ), 279 279 280 280 TP_fast_assign(