Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp17929520ybl; Thu, 2 Jan 2020 15:01:52 -0800 (PST) X-Google-Smtp-Source: APXvYqyfqC6avMs32BIdmH4qq6kKMQbcSWCcLko1mpsnfy2q9qUi+uuyuoEAvGlDfhVNofYCy9yQ X-Received: by 2002:a05:6808:64d:: with SMTP id z13mr3236003oih.104.1578006112765; Thu, 02 Jan 2020 15:01:52 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1578006112; cv=none; d=google.com; s=arc-20160816; b=J8aoi6CsylDU2AoqAsGJwy3rjxJzKXptJwo37dGHCa545g7w+Zj5PSxXuqkKqv5gyp uiQ0ZHD3VtKxnznxzenfzcw3gu4DotshIDkoqN4rZ/rNK6cePqBbFt5K6PpJBHy0gpGO TnPXUYLrVZNQtSmuussr3o2L9iJ/qhbOTEe4xVirRbBJhVlyP3KJTILRwMk8VEjXSfss Jjq7Fp0mmSYpoyehMVtwryB+OKEa9h/PHRatLcwUhlmmGUPSRDT/xWPcHnznmHkdyMrz J28Tln6tDRgDelI7l61/eIMVQ8yIoqI1VHLUPPnG0HxCHnIY0qJ0GDWISLbq0R7uiexf FJ5g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=TBp352a65+cCLAhse0emLDbPxbkKvFHZXcvbt1icnII=; b=i3WDKufgf73/RPDsKqx2/NnhX+5fHF5BjbdL1t4HlytP+bE19tFFYehk12cscRZCVm YY+VKwKZKBMvaUKBxQ9bDc++tnq3rvSjApqUiccKNQ9KYnsa5vPZ+qYoyStzGAarbImp hYVOI93iuWQrQqAFKEPpg3YH3BZ/7g0XQtVFlOPzJA5m4ES+yUPSB+h4s8DGwqEsgPRz bkP8uaoecUOrmPLj0IkgpY/1okk8Yy0b9JpXGoUlotLQgbo20235HdQoXoSo3cqVaHqP k8zPSq8Kij+dNwmHTtj+ay4ZqvZOCAhLPUiTYbCjyYzcXas55s7PpX3GSdqG8Tdk/2s1 h+lw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=FfWULzZR; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id u191si23746686oia.86.2020.01.02.15.01.41; Thu, 02 Jan 2020 15:01:52 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=FfWULzZR; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727637AbgABWNM (ORCPT + 99 others); Thu, 2 Jan 2020 17:13:12 -0500 Received: from mail.kernel.org ([198.145.29.99]:52750 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727629AbgABWNK (ORCPT ); Thu, 2 Jan 2020 17:13:10 -0500 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id E72B522B48; Thu, 2 Jan 2020 22:13:08 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1578003189; bh=rlPLsKuQkErBRFGYfur2piTSMcHBnT5b215Uu37LWqg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=FfWULzZRqXxIKQt4QQQTU7Hb4muJxMeYA2AQ1DGhtmStDBjhdCJuZw0jxPVkBlOFO /qYnrEU4DqHjJ0XyZm5tz11swUaF6qMgI7rO5/I80fpZXdeAYqvPZU2k6fkYtiukpv fE8S0ZKK5DY8SoAqwDoTV/fsI2bU2FcIA/6JkknI= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Konstantin Khlebnikov , Jan Kara , Sasha Levin Subject: [PATCH 5.4 056/191] fs/quota: handle overflows of sysctl fs.quota.* and report as unsigned long Date: Thu, 2 Jan 2020 23:05:38 +0100 Message-Id: <20200102215835.919091259@linuxfoundation.org> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200102215829.911231638@linuxfoundation.org> References: <20200102215829.911231638@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Konstantin Khlebnikov [ Upstream commit 6fcbcec9cfc7b3c6a2c1f1a23ebacedff7073e0a ] Quota statistics counted as 64-bit per-cpu counter. Reading sums per-cpu fractions as signed 64-bit int, filters negative values and then reports lower half as signed 32-bit int. Result may looks like: fs.quota.allocated_dquots = 22327 fs.quota.cache_hits = -489852115 fs.quota.drops = -487288718 fs.quota.free_dquots = 22083 fs.quota.lookups = -486883485 fs.quota.reads = 22327 fs.quota.syncs = 335064 fs.quota.writes = 3088689 Values bigger than 2^31-1 reported as negative. All counters except "allocated_dquots" and "free_dquots" are monotonic, thus they should be reported as is without filtering negative values. Kernel doesn't have generic helper for 64-bit sysctl yet, let's use at least unsigned long. Link: https://lore.kernel.org/r/157337934693.2078.9842146413181153727.stgit@buzz Signed-off-by: Konstantin Khlebnikov Signed-off-by: Jan Kara Signed-off-by: Sasha Levin --- fs/quota/dquot.c | 29 +++++++++++++++++------------ include/linux/quota.h | 2 +- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c index 7f0b39da5022..9b96243de081 100644 --- a/fs/quota/dquot.c +++ b/fs/quota/dquot.c @@ -2861,68 +2861,73 @@ EXPORT_SYMBOL(dquot_quotactl_sysfile_ops); static int do_proc_dqstats(struct ctl_table *table, int write, void __user *buffer, size_t *lenp, loff_t *ppos) { - unsigned int type = (int *)table->data - dqstats.stat; + unsigned int type = (unsigned long *)table->data - dqstats.stat; + s64 value = percpu_counter_sum(&dqstats.counter[type]); + + /* Filter negative values for non-monotonic counters */ + if (value < 0 && (type == DQST_ALLOC_DQUOTS || + type == DQST_FREE_DQUOTS)) + value = 0; /* Update global table */ - dqstats.stat[type] = - percpu_counter_sum_positive(&dqstats.counter[type]); - return proc_dointvec(table, write, buffer, lenp, ppos); + dqstats.stat[type] = value; + return proc_doulongvec_minmax(table, write, buffer, lenp, ppos); } static struct ctl_table fs_dqstats_table[] = { { .procname = "lookups", .data = &dqstats.stat[DQST_LOOKUPS], - .maxlen = sizeof(int), + .maxlen = sizeof(unsigned long), .mode = 0444, .proc_handler = do_proc_dqstats, }, { .procname = "drops", .data = &dqstats.stat[DQST_DROPS], - .maxlen = sizeof(int), + .maxlen = sizeof(unsigned long), .mode = 0444, .proc_handler = do_proc_dqstats, }, { .procname = "reads", .data = &dqstats.stat[DQST_READS], - .maxlen = sizeof(int), + .maxlen = sizeof(unsigned long), .mode = 0444, .proc_handler = do_proc_dqstats, }, { .procname = "writes", .data = &dqstats.stat[DQST_WRITES], - .maxlen = sizeof(int), + .maxlen = sizeof(unsigned long), .mode = 0444, .proc_handler = do_proc_dqstats, }, { .procname = "cache_hits", .data = &dqstats.stat[DQST_CACHE_HITS], - .maxlen = sizeof(int), + .maxlen = sizeof(unsigned long), .mode = 0444, .proc_handler = do_proc_dqstats, }, { .procname = "allocated_dquots", .data = &dqstats.stat[DQST_ALLOC_DQUOTS], - .maxlen = sizeof(int), + .maxlen = sizeof(unsigned long), .mode = 0444, .proc_handler = do_proc_dqstats, }, { .procname = "free_dquots", .data = &dqstats.stat[DQST_FREE_DQUOTS], - .maxlen = sizeof(int), + .maxlen = sizeof(unsigned long), .mode = 0444, .proc_handler = do_proc_dqstats, }, { .procname = "syncs", .data = &dqstats.stat[DQST_SYNCS], - .maxlen = sizeof(int), + .maxlen = sizeof(unsigned long), .mode = 0444, .proc_handler = do_proc_dqstats, }, diff --git a/include/linux/quota.h b/include/linux/quota.h index f32dd270b8e3..27aab84fcbaa 100644 --- a/include/linux/quota.h +++ b/include/linux/quota.h @@ -263,7 +263,7 @@ enum { }; struct dqstats { - int stat[_DQST_DQSTAT_LAST]; + unsigned long stat[_DQST_DQSTAT_LAST]; struct percpu_counter counter[_DQST_DQSTAT_LAST]; }; -- 2.20.1