From patchwork Fri Jun 17 20:03:16 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arnd Bergmann X-Patchwork-Id: 102144 Delivered-To: patch@linaro.org Received: by 10.140.28.4 with SMTP id 4csp449347qgy; Fri, 17 Jun 2016 13:03:36 -0700 (PDT) X-Received: by 10.98.107.129 with SMTP id g123mr4173011pfc.62.1466193815943; Fri, 17 Jun 2016 13:03:35 -0700 (PDT) Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id l28si14076252pfb.228.2016.06.17.13.03.35; Fri, 17 Jun 2016 13:03:35 -0700 (PDT) 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; 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 S1755653AbcFQUDS (ORCPT + 30 others); Fri, 17 Jun 2016 16:03:18 -0400 Received: from mout.kundenserver.de ([212.227.17.10]:53958 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755570AbcFQUDP (ORCPT ); Fri, 17 Jun 2016 16:03:15 -0400 Received: from wuerfel.lan. ([78.42.132.4]) by mrelayeu.kundenserver.de (mreue103) with ESMTPA (Nemesis) id 0MEbiz-1bC68s3UFt-00Fk7t; Fri, 17 Jun 2016 22:01:59 +0200 From: Arnd Bergmann To: Jan Kara Cc: y2038@lists.linaro.org, linux-fsdevel@vger.kernel.org, Arnd Bergmann , Mark Fasheh , Joel Becker , Al Viro , Andrew Morton , ocfs2-devel@oss.oracle.com, linux-kernel@vger.kernel.org Subject: [PATCH] quota: use time64_t internally Date: Fri, 17 Jun 2016 22:03:16 +0200 Message-Id: <20160617200344.2096348-1-arnd@arndb.de> X-Mailer: git-send-email 2.9.0 X-Provags-ID: V03:K0:ZAD/8I5Jr13Os/vJ8Lp9R6Sm2dqbI1nUgBEkA7ZsXjgh74xITdZ fo+dd7J4QqZiPhteR/8kDz7PzvraNCj4tnCTCW3vS+CGK9fUiRgm9hHlu30Dovx7rLWNTju uTYf4huM0GLZmIeCSzJAlP27PwW+shyQyupynv/Wc/bTnVH+8zY2vXvraPLBiqFLpwCfxub AgHtHt7Y69kq5KVtBTsRg== X-UI-Out-Filterresults: notjunk:1; V01:K0:uk8/7bUHUks=:Y5+DWto/ii6o0OpbjIJqPE tRUImtnKauf9KGNIpqel6Nc/DbqaPvcdlZKT8xQC9/AMaltATy6f/IpVcuQS/VvPHqeOmie/R LrsEMCMCtCmrK8YmYXj1ZJOLeTIwOC7so82lALOMarYvbu1nhXWOvTsnDkdYrpjYbzEmOsCdb C83uxwRJYq+dwVwSw3cP/q/elfnBzSSzoWlDvV2FQ8gF511942o5e6ePcKhZUClgLHV7u1jqN 05vtRDqUqOo2j0MFp1imAUmJRgwoLRC8xjSWOU5u4i6JkUNRdp9+o7zFMoc+mULkt7cKog5nG nTEGwcp+Su4H+sU22g0/rSP8LHZOz3nOgkJtU/cKEt3RhAj188YhaQzyWmwux6ct70SZh0Qbg tHvNfkvU7ck/gS7Sb0Yna0ZLEggdt4B3P6s3XMFUHa8CI1HIZdzNELlbhrq7HoQu4Kz4h9QbN PgLr3mlWVOHXrupobg9F9NTUDpHfUAkmjsbp6APnML+2AUMAkGuKeAulmRNlcQmC9lgmFo08r SkTFsEndj4FBScfCIib6dU2iaWzGvqNGkiiNu0Yy4ufM9a0Q3gKIEFrRsXLm6Ri8Op5kcHItW RLfYnYqdr8AduOf5MMZbg4jlP4DQRPCSdCefvRSP/TOrhNxPpkBfKhOECE6oKAKLJOAbcQCOZ Tv677ZsBhgpDRzAoeXT1CQW6qeBtdbhz9sPTHgeLEakBa/raZJbpEtnb1tJCfcEZmomk= Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The quota subsystem has two formats, the old v1 format using architecture specific time_t values on the on-disk format, while the v2 format (introduced in Linux 2.5.16 and 2.4.22) uses fixed 64-bit little-endian. While there is no future for the v1 format beyond y2038, the v2 format is almost there on 32-bit architectures, as both the user interface and the on-disk format use 64-bit timestamps, just not the time_t inbetween. This changes the internal representation to use time64_t, which will end up doing the right thing everywhere for v2 format. Signed-off-by: Arnd Bergmann --- fs/ocfs2/quota_global.c | 2 +- fs/quota/dquot.c | 16 ++++++++-------- include/linux/quota.h | 4 ++-- 3 files changed, 11 insertions(+), 11 deletions(-) -- 2.9.0 diff --git a/fs/ocfs2/quota_global.c b/fs/ocfs2/quota_global.c index ab6a6cdcf91c..87e577a49b0d 100644 --- a/fs/ocfs2/quota_global.c +++ b/fs/ocfs2/quota_global.c @@ -483,7 +483,7 @@ int __ocfs2_sync_dquot(struct dquot *dquot, int freeing) struct ocfs2_mem_dqinfo *info = sb_dqinfo(sb, type)->dqi_priv; struct ocfs2_global_disk_dqblk dqblk; s64 spacechange, inodechange; - time_t olditime, oldbtime; + time64_t olditime, oldbtime; err = sb->s_op->quota_read(sb, type, (char *)&dqblk, sizeof(struct ocfs2_global_disk_dqblk), diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c index ff21980d0119..b1322dd9d136 100644 --- a/fs/quota/dquot.c +++ b/fs/quota/dquot.c @@ -1133,7 +1133,7 @@ static void dquot_decr_inodes(struct dquot *dquot, qsize_t number) else dquot->dq_dqb.dqb_curinodes = 0; if (dquot->dq_dqb.dqb_curinodes <= dquot->dq_dqb.dqb_isoftlimit) - dquot->dq_dqb.dqb_itime = (time_t) 0; + dquot->dq_dqb.dqb_itime = (time64_t) 0; clear_bit(DQ_INODES_B, &dquot->dq_flags); } @@ -1145,7 +1145,7 @@ static void dquot_decr_space(struct dquot *dquot, qsize_t number) else dquot->dq_dqb.dqb_curspace = 0; if (dquot->dq_dqb.dqb_curspace <= dquot->dq_dqb.dqb_bsoftlimit) - dquot->dq_dqb.dqb_btime = (time_t) 0; + dquot->dq_dqb.dqb_btime = (time64_t) 0; clear_bit(DQ_BLKS_B, &dquot->dq_flags); } @@ -1292,7 +1292,7 @@ static int check_idq(struct dquot *dquot, qsize_t inodes, if (dquot->dq_dqb.dqb_isoftlimit && newinodes > dquot->dq_dqb.dqb_isoftlimit && dquot->dq_dqb.dqb_itime && - get_seconds() >= dquot->dq_dqb.dqb_itime && + ktime_get_real_seconds() >= dquot->dq_dqb.dqb_itime && !ignore_hardlimit(dquot)) { prepare_warning(warn, dquot, QUOTA_NL_ISOFTLONGWARN); return -EDQUOT; @@ -1302,7 +1302,7 @@ static int check_idq(struct dquot *dquot, qsize_t inodes, newinodes > dquot->dq_dqb.dqb_isoftlimit && dquot->dq_dqb.dqb_itime == 0) { prepare_warning(warn, dquot, QUOTA_NL_ISOFTWARN); - dquot->dq_dqb.dqb_itime = get_seconds() + + dquot->dq_dqb.dqb_itime = ktime_get_real_seconds() + sb_dqopt(dquot->dq_sb)->info[dquot->dq_id.type].dqi_igrace; } @@ -1334,7 +1334,7 @@ static int check_bdq(struct dquot *dquot, qsize_t space, int prealloc, if (dquot->dq_dqb.dqb_bsoftlimit && tspace > dquot->dq_dqb.dqb_bsoftlimit && dquot->dq_dqb.dqb_btime && - get_seconds() >= dquot->dq_dqb.dqb_btime && + ktime_get_real_seconds() >= dquot->dq_dqb.dqb_btime && !ignore_hardlimit(dquot)) { if (!prealloc) prepare_warning(warn, dquot, QUOTA_NL_BSOFTLONGWARN); @@ -1346,7 +1346,7 @@ static int check_bdq(struct dquot *dquot, qsize_t space, int prealloc, dquot->dq_dqb.dqb_btime == 0) { if (!prealloc) { prepare_warning(warn, dquot, QUOTA_NL_BSOFTWARN); - dquot->dq_dqb.dqb_btime = get_seconds() + + dquot->dq_dqb.dqb_btime = ktime_get_real_seconds() + sb_dqopt(sb)->info[dquot->dq_id.type].dqi_bgrace; } else @@ -2695,7 +2695,7 @@ static int do_set_dqblk(struct dquot *dquot, struct qc_dqblk *di) clear_bit(DQ_BLKS_B, &dquot->dq_flags); } else if (!(di->d_fieldmask & QC_SPC_TIMER)) /* Set grace only if user hasn't provided his own... */ - dm->dqb_btime = get_seconds() + dqi->dqi_bgrace; + dm->dqb_btime = ktime_get_real_seconds() + dqi->dqi_bgrace; } if (check_ilim) { if (!dm->dqb_isoftlimit || @@ -2704,7 +2704,7 @@ static int do_set_dqblk(struct dquot *dquot, struct qc_dqblk *di) clear_bit(DQ_INODES_B, &dquot->dq_flags); } else if (!(di->d_fieldmask & QC_INO_TIMER)) /* Set grace only if user hasn't provided his own... */ - dm->dqb_itime = get_seconds() + dqi->dqi_igrace; + dm->dqb_itime = ktime_get_real_seconds() + dqi->dqi_igrace; } if (dm->dqb_bhardlimit || dm->dqb_bsoftlimit || dm->dqb_ihardlimit || dm->dqb_isoftlimit) diff --git a/include/linux/quota.h b/include/linux/quota.h index 9dfb6bce8c9e..8486d27cf360 100644 --- a/include/linux/quota.h +++ b/include/linux/quota.h @@ -200,8 +200,8 @@ struct mem_dqblk { qsize_t dqb_ihardlimit; /* absolute limit on allocated inodes */ qsize_t dqb_isoftlimit; /* preferred inode limit */ qsize_t dqb_curinodes; /* current # allocated inodes */ - time_t dqb_btime; /* time limit for excessive disk use */ - time_t dqb_itime; /* time limit for excessive inode use */ + time64_t dqb_btime; /* time limit for excessive disk use */ + time64_t dqb_itime; /* time limit for excessive inode use */ }; /*