From mboxrd@z Thu Jan 1 00:00:00 1970 From: Deepa Dinamani Subject: [PATCH v3 4/5] vfs: Add timestamp_truncate() api Date: Sat, 18 Feb 2017 15:30:07 -0800 Message-ID: <1487460608-15697-5-git-send-email-deepa.kernel@gmail.com> References: <1487460608-15697-1-git-send-email-deepa.kernel@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Cc: linux-fsdevel@vger.kernel.org, y2038@lists.linaro.org, linux-kernel@vger.kernel.org, arnd@arndb.de To: viro@zeniv.linux.org.uk, tytso@mit.edu, adilger.kernel@dilger.ca, linux-ext4@vger.kernel.org Return-path: In-Reply-To: <1487460608-15697-1-git-send-email-deepa.kernel@gmail.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: y2038-bounces@lists.linaro.org Sender: "Y2038" List-Id: linux-ext4.vger.kernel.org dGltZXNwZWNfdHJ1bmMoKSBmdW5jdGlvbiBpcyB1c2VkIHRvIHRydW5jYXRlIGEKZmlsZXN5c3Rl bSB0aW1lc3RhbXAgdG8gdGhlIHJpZ2h0IGdyYW51bGFyaXR5LgpCdXQsIHRoZSBmdW5jdGlvbiBk b2VzIG5vdCBjbGFtcCB0dl9zZWMgcGFydCBvZiB0aGUKdGltZXN0YW1wcyBhY2NvcmRpbmcgdG8g dGhlIGZpbGVzeXN0ZW0gdGltZXN0YW1wIGxpbWl0cy4KCkFsc28sIHRpbWVzcGVjX3RydW5jKCkg aXMgZXhjbHVzaXZlbHkgdXNlZCBmb3IgZmlsZXN5c3RlbQp0aW1lc3RhbXBzLiBNb3ZlIHRoZSBh cGkgdG8gYmUgcGFydCBvZiB2ZnMuCgpUaGUgcmVwbGFjZW1lbnQgYXBpOiB0aW1lc3RhbXBfdHJ1 bmNhdGUoKSBhbHNvIGFsdGVycyB0aGUKc2lnbmF0dXJlIG9mIHRoZSBmdW5jdGlvbiB0byBhY2Nv bW1vZGF0ZSBmaWxlc3lzdGVtCnRpbWVzdGFtcCBjbGFtcGluZyBhY2NvcmRpbmcgdG8gZmxlc3lz dGVtIGxpbWl0cy4KCk5vdGUgdGhhdCB0aGUgY2xhbXBfdCBtYWNybyBpcyB1c2VkIGZvciBjbGFt cGluZyBoZXJlIGFzIHZmcwppcyBub3QgeWV0IHVzaW5nIHN0cnVjdCB0aW1lc3BlYzY0IGludGVy bmFsbHkuIFRoaXMgaXMKcmVxdWlyZWQgZm9yIGNvbXBpbGF0aW9uIHB1cnBvc2VzLgpBbHNvIG5v dGUgdGhhdCBjbGFtcCB3b24ndCBkbyB0aGUgcmlnaHQgdGhpbmcgZm9yIHRpbWVzdGFtcHMKYmV5 b25kIDIwMzggb24gMzItYml0IG1hY2hpbmVzIHVudGlsIHRoZSB2ZnMgdXNlcyB0aW1lc3BlYzY0 LgpBZnRlciB0aGUgdmZzIGlzIHRyYW5zaXRpb25lZCB0byB1c2UgdGltZXNwZWM2NCBmb3IgdGlt ZXN0YW1wcywKY2xhbXBfdCgpIGNhbiBiZSByZXBsYWNlZCBieSBjbGFtcCgpLgoKU2lnbmVkLW9m Zi1ieTogRGVlcGEgRGluYW1hbmkgPGRlZXBhLmtlcm5lbEBnbWFpbC5jb20+Ci0tLQogZnMvaW5v ZGUuYyB8IDMyICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKystCiAxIGZpbGUgY2hhbmdl ZCwgMzEgaW5zZXJ0aW9ucygrKSwgMSBkZWxldGlvbigtKQoKZGlmZiAtLWdpdCBhL2ZzL2lub2Rl LmMgYi9mcy9pbm9kZS5jCmluZGV4IDA1NzNhM2UuLjZhMWJjMTIgMTAwNjQ0Ci0tLSBhL2ZzL2lu b2RlLmMKKysrIGIvZnMvaW5vZGUuYwpAQCAtMjExNCw2ICsyMTE0LDM2IEBAIHZvaWQgaW5vZGVf bm9oaWdobWVtKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiBFWFBPUlRfU1lNQk9MKGlub2RlX25vaGln aG1lbSk7CiAKIC8qKgorICogZnNfdGltZXNwZWNfdHJ1bmMgLSBUcnVuY2F0ZSB0aW1lc3BlYyB0 byBhIGdyYW51bGFyaXR5CisgKiBAdDogVGltZXNwZWMKKyAqIEBncmFuOiBHcmFudWxhcml0eSBp biBucy4KKyAqCisgKiBUcnVuY2F0ZSBhIHRpbWVzcGVjIHRvIGEgZ3JhbnVsYXJpdHkuIEFsd2F5 cyByb3VuZHMgZG93bi4gZ3JhbiBtdXN0CisgKiBub3QgYmUgMCBub3IgZ3JlYXRlciB0aGFuIGEg c2Vjb25kIChOU0VDX1BFUl9TRUMsIG9yIDEwXjkgbnMpLgorICovCitzdHJ1Y3QgdGltZXNwZWMg dGltZXN0YW1wX3RydW5jYXRlKHN0cnVjdCB0aW1lc3BlYyB0LCBzdHJ1Y3QgaW5vZGUgKmlub2Rl KQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKwl1bnNpZ25lZCBp bnQgZ3JhbiA9IHNiLT5zX3RpbWVfZ3JhbjsKKworCXQudHZfc2VjID0gY2xhbXBfdCh0aW1lNjRf dCwgdC50dl9zZWMsIHNiLT5zX3RpbWVfbWluLCBzYi0+c190aW1lX21heCk7CisKKwkvKiBBdm9p ZCBkaXZpc2lvbiBpbiB0aGUgY29tbW9uIGNhc2VzIDEgbnMgYW5kIDEgcy4gKi8KKwlpZiAoZ3Jh biA9PSAxKSB7CisJCS8qIG5vdGhpbmcgKi8KKwl9IGVsc2UgaWYgKGdyYW4gPT0gTlNFQ19QRVJf U0VDKSB7CisJCXQudHZfbnNlYyA9IDA7CisJfSBlbHNlIGlmIChncmFuID4gMSAmJiBncmFuIDwg TlNFQ19QRVJfU0VDKSB7CisJCXQudHZfbnNlYyAtPSB0LnR2X25zZWMgJSBncmFuOworCX0gZWxz ZSB7CisJCVdBUk4oMSwgImlsbGVnYWwgZmlsZSB0aW1lIGdyYW51bGFyaXR5OiAldSIsIGdyYW4p OworCX0KKwlyZXR1cm4gdDsKK30KK0VYUE9SVF9TWU1CT0wodGltZXN0YW1wX3RydW5jYXRlKTsK KworCisvKioKICAqIGN1cnJlbnRfdGltZSAtIFJldHVybiBGUyB0aW1lCiAgKiBAaW5vZGU6IGlu b2RlLgogICoKQEAgLTIxMzIsNiArMjE2Miw2IEBAIHN0cnVjdCB0aW1lc3BlYyBjdXJyZW50X3Rp bWUoc3RydWN0IGlub2RlICppbm9kZSkKIAkJcmV0dXJuIG5vdzsKIAl9CiAKLQlyZXR1cm4gdGlt ZXNwZWNfdHJ1bmMobm93LCBpbm9kZS0+aV9zYi0+c190aW1lX2dyYW4pOworCXJldHVybiB0aW1l c3RhbXBfdHJ1bmNhdGUobm93LCBpbm9kZSk7CiB9CiBFWFBPUlRfU1lNQk9MKGN1cnJlbnRfdGlt ZSk7Ci0tIAoyLjcuNAoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX18KWTIwMzggbWFpbGluZyBsaXN0ClkyMDM4QGxpc3RzLmxpbmFyby5vcmcKaHR0cHM6Ly9s aXN0cy5saW5hcm8ub3JnL21haWxtYW4vbGlzdGluZm8veTIwMzgK From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pg0-f68.google.com ([74.125.83.68]:34946 "EHLO mail-pg0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750825AbdBRXbJ (ORCPT ); Sat, 18 Feb 2017 18:31:09 -0500 From: Deepa Dinamani To: viro@zeniv.linux.org.uk, tytso@mit.edu, adilger.kernel@dilger.ca, linux-ext4@vger.kernel.org Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, arnd@arndb.de, y2038@lists.linaro.org Subject: [PATCH v3 4/5] vfs: Add timestamp_truncate() api Date: Sat, 18 Feb 2017 15:30:07 -0800 Message-Id: <1487460608-15697-5-git-send-email-deepa.kernel@gmail.com> In-Reply-To: <1487460608-15697-1-git-send-email-deepa.kernel@gmail.com> References: <1487460608-15697-1-git-send-email-deepa.kernel@gmail.com> Sender: linux-fsdevel-owner@vger.kernel.org List-ID: timespec_trunc() function is used to truncate a filesystem timestamp to the right granularity. But, the function does not clamp tv_sec part of the timestamps according to the filesystem timestamp limits. Also, timespec_trunc() is exclusively used for filesystem timestamps. Move the api to be part of vfs. The replacement api: timestamp_truncate() also alters the signature of the function to accommodate filesystem timestamp clamping according to flesystem limits. Note that the clamp_t macro is used for clamping here as vfs is not yet using struct timespec64 internally. This is required for compilation purposes. Also note that clamp won't do the right thing for timestamps beyond 2038 on 32-bit machines until the vfs uses timespec64. After the vfs is transitioned to use timespec64 for timestamps, clamp_t() can be replaced by clamp(). Signed-off-by: Deepa Dinamani --- fs/inode.c | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/fs/inode.c b/fs/inode.c index 0573a3e..6a1bc12 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -2114,6 +2114,36 @@ void inode_nohighmem(struct inode *inode) EXPORT_SYMBOL(inode_nohighmem); /** + * fs_timespec_trunc - Truncate timespec to a granularity + * @t: Timespec + * @gran: Granularity in ns. + * + * Truncate a timespec to a granularity. Always rounds down. gran must + * not be 0 nor greater than a second (NSEC_PER_SEC, or 10^9 ns). + */ +struct timespec timestamp_truncate(struct timespec t, struct inode *inode) +{ + struct super_block *sb = inode->i_sb; + unsigned int gran = sb->s_time_gran; + + t.tv_sec = clamp_t(time64_t, t.tv_sec, sb->s_time_min, sb->s_time_max); + + /* Avoid division in the common cases 1 ns and 1 s. */ + if (gran == 1) { + /* nothing */ + } else if (gran == NSEC_PER_SEC) { + t.tv_nsec = 0; + } else if (gran > 1 && gran < NSEC_PER_SEC) { + t.tv_nsec -= t.tv_nsec % gran; + } else { + WARN(1, "illegal file time granularity: %u", gran); + } + return t; +} +EXPORT_SYMBOL(timestamp_truncate); + + +/** * current_time - Return FS time * @inode: inode. * @@ -2132,6 +2162,6 @@ struct timespec current_time(struct inode *inode) return now; } - return timespec_trunc(now, inode->i_sb->s_time_gran); + return timestamp_truncate(now, inode); } EXPORT_SYMBOL(current_time); -- 2.7.4