From mboxrd@z Thu Jan 1 00:00:00 1970 From: Deepa Dinamani Subject: [PATCH v6 3/4] vfs: Add timestamp_truncate() api Date: Sun, 21 Jan 2018 18:04:25 -0800 Message-ID: <20180122020426.2988-4-deepa.kernel@gmail.com> References: <20180122020426.2988-1-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, torvalds@linux-foundation.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: <20180122020426.2988-1-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 LmMgYi9mcy9pbm9kZS5jCmluZGV4IGVmMzYyMzY0ZDM5Ni4uMGUyODIwYWRlNTU0IDEwMDY0NAot LS0gYS9mcy9pbm9kZS5jCisrKyBiL2ZzL2lub2RlLmMKQEAgLTIxMDcsNiArMjEwNywzNiBAQCB2 b2lkIGlub2RlX25vaGlnaG1lbShzdHJ1Y3QgaW5vZGUgKmlub2RlKQogfQogRVhQT1JUX1NZTUJP TChpbm9kZV9ub2hpZ2htZW0pOwogCisvKioKKyAqIHRpbWVzdGFtcF90cnVuY2F0ZSAtIFRydW5j YXRlIHRpbWVzcGVjIHRvIGEgZ3JhbnVsYXJpdHkKKyAqIEB0OiBUaW1lc3BlYworICogQGlub2Rl OiBpbm9kZSBiZWluZyB1cGRhdGVkCisgKgorICogVHJ1bmNhdGUgYSB0aW1lc3BlYyB0byB0aGUg Z3JhbnVsYXJpdHkgc3VwcG9ydGVkIGJ5IHRoZSBmcworICogY29udGFpbmluZyB0aGUgaW5vZGUu IEFsd2F5cyByb3VuZHMgZG93bi4gZ3JhbiBtdXN0CisgKiBub3QgYmUgMCBub3IgZ3JlYXRlciB0 aGFuIGEgc2Vjb25kIChOU0VDX1BFUl9TRUMsIG9yIDEwXjkgbnMpLgorICovCitzdHJ1Y3QgdGlt ZXNwZWMgdGltZXN0YW1wX3RydW5jYXRlKHN0cnVjdCB0aW1lc3BlYyB0LCBzdHJ1Y3QgaW5vZGUg Kmlub2RlKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKwl1bnNp Z25lZCBpbnQgZ3JhbiA9IHNiLT5zX3RpbWVfZ3JhbjsKKworCXQudHZfc2VjID0gY2xhbXBfdCh0 aW1lNjRfdCwgdC50dl9zZWMsIHNiLT5zX3RpbWVfbWluLCBzYi0+c190aW1lX21heCk7CisKKwkv KiBBdm9pZCBkaXZpc2lvbiBpbiB0aGUgY29tbW9uIGNhc2VzIDEgbnMgYW5kIDEgcy4gKi8KKwlp ZiAoZ3JhbiA9PSAxKSB7CisJCS8qIG5vdGhpbmcgKi8KKwl9IGVsc2UgaWYgKGdyYW4gPT0gTlNF Q19QRVJfU0VDKSB7CisJCXQudHZfbnNlYyA9IDA7CisJfSBlbHNlIGlmIChncmFuID4gMSAmJiBn cmFuIDwgTlNFQ19QRVJfU0VDKSB7CisJCXQudHZfbnNlYyAtPSB0LnR2X25zZWMgJSBncmFuOwor CX0gZWxzZSB7CisJCVdBUk4oMSwgImlsbGVnYWwgZmlsZSB0aW1lIGdyYW51bGFyaXR5OiAldSIs IGdyYW4pOworCX0KKwlyZXR1cm4gdDsKK30KK0VYUE9SVF9TWU1CT0wodGltZXN0YW1wX3RydW5j YXRlKTsKKwogLyoqCiAgKiBjdXJyZW50X3RpbWUgLSBSZXR1cm4gRlMgdGltZQogICogQGlub2Rl OiBpbm9kZS4KQEAgLTIxMjYsNiArMjE1Niw2IEBAIHN0cnVjdCB0aW1lc3BlYyBjdXJyZW50X3Rp bWUoc3RydWN0IGlub2RlICppbm9kZSkKIAkJcmV0dXJuIG5vdzsKIAl9CiAKLQlyZXR1cm4gdGlt ZXNwZWNfdHJ1bmMobm93LCBpbm9kZS0+aV9zYi0+c190aW1lX2dyYW4pOworCXJldHVybiB0aW1l c3RhbXBfdHJ1bmNhdGUobm93LCBpbm9kZSk7CiB9CiBFWFBPUlRfU1lNQk9MKGN1cnJlbnRfdGlt ZSk7Ci0tIAoyLjE0LjEKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fClkyMDM4IG1haWxpbmcgbGlzdApZMjAzOEBsaXN0cy5saW5hcm8ub3JnCmh0dHBzOi8v bGlzdHMubGluYXJvLm9yZy9tYWlsbWFuL2xpc3RpbmZvL3kyMDM4Cg== From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pg0-f66.google.com ([74.125.83.66]:41776 "EHLO mail-pg0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751050AbeAVCFa (ORCPT ); Sun, 21 Jan 2018 21:05:30 -0500 From: Deepa Dinamani To: viro@zeniv.linux.org.uk, tytso@mit.edu, adilger.kernel@dilger.ca, linux-ext4@vger.kernel.org Cc: torvalds@linux-foundation.org, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, arnd@arndb.de, y2038@lists.linaro.org Subject: [PATCH v6 3/4] vfs: Add timestamp_truncate() api Date: Sun, 21 Jan 2018 18:04:25 -0800 Message-Id: <20180122020426.2988-4-deepa.kernel@gmail.com> In-Reply-To: <20180122020426.2988-1-deepa.kernel@gmail.com> References: <20180122020426.2988-1-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 ef362364d396..0e2820ade554 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -2107,6 +2107,36 @@ void inode_nohighmem(struct inode *inode) } EXPORT_SYMBOL(inode_nohighmem); +/** + * timestamp_truncate - Truncate timespec to a granularity + * @t: Timespec + * @inode: inode being updated + * + * Truncate a timespec to the granularity supported by the fs + * containing the inode. 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. @@ -2126,6 +2156,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.14.1