From mboxrd@z Thu Jan 1 00:00:00 1970 From: Deepa Dinamani Subject: [PATCH v4 4/5] vfs: Add timestamp_truncate() api Date: Fri, 24 Feb 2017 17:41:02 -0800 Message-ID: <1487986863-6005-5-git-send-email-deepa.kernel@gmail.com> References: <1487986863-6005-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: <1487986863-6005-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 LmMgYi9mcy9pbm9kZS5jCmluZGV4IDc5NjdmOWMuLjM5Yjg3NWIgMTAwNjQ0Ci0tLSBhL2ZzL2lu b2RlLmMKKysrIGIvZnMvaW5vZGUuYwpAQCAtMjExNiw2ICsyMTE2LDM2IEBAIHZvaWQgaW5vZGVf bm9oaWdobWVtKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiBFWFBPUlRfU1lNQk9MKGlub2RlX25vaGln aG1lbSk7CiAKIC8qKgorICogdGltZXN0YW1wX3RydW5jYXRlIC0gVHJ1bmNhdGUgdGltZXNwZWMg dG8gYSBncmFudWxhcml0eQorICogQHQ6IFRpbWVzcGVjCisgKiBAaW5vZGU6IGlub2RlIGJlaW5n IHVwZGF0ZWQKKyAqCisgKiBUcnVuY2F0ZSBhIHRpbWVzcGVjIHRvIHRoZSBncmFudWxhcml0eSBz dXBwb3J0ZWQgYnkgdGhlIGZzCisgKiBjb250YWluaW5nIHRoZSBpbm9kZS4gQWx3YXlzIHJvdW5k cyBkb3duLiBncmFuIG11c3QKKyAqIG5vdCBiZSAwIG5vciBncmVhdGVyIHRoYW4gYSBzZWNvbmQg KE5TRUNfUEVSX1NFQywgb3IgMTBeOSBucykuCisgKi8KK3N0cnVjdCB0aW1lc3BlYyB0aW1lc3Rh bXBfdHJ1bmNhdGUoc3RydWN0IHRpbWVzcGVjIHQsIHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJ c3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCXVuc2lnbmVkIGludCBncmFu ID0gc2ItPnNfdGltZV9ncmFuOworCisJdC50dl9zZWMgPSBjbGFtcF90KHRpbWU2NF90LCB0LnR2 X3NlYywgc2ItPnNfdGltZV9taW4sIHNiLT5zX3RpbWVfbWF4KTsKKworCS8qIEF2b2lkIGRpdmlz aW9uIGluIHRoZSBjb21tb24gY2FzZXMgMSBucyBhbmQgMSBzLiAqLworCWlmIChncmFuID09IDEp IHsKKwkJLyogbm90aGluZyAqLworCX0gZWxzZSBpZiAoZ3JhbiA9PSBOU0VDX1BFUl9TRUMpIHsK KwkJdC50dl9uc2VjID0gMDsKKwl9IGVsc2UgaWYgKGdyYW4gPiAxICYmIGdyYW4gPCBOU0VDX1BF Ul9TRUMpIHsKKwkJdC50dl9uc2VjIC09IHQudHZfbnNlYyAlIGdyYW47CisJfSBlbHNlIHsKKwkJ V0FSTigxLCAiaWxsZWdhbCBmaWxlIHRpbWUgZ3JhbnVsYXJpdHk6ICV1IiwgZ3Jhbik7CisJfQor CXJldHVybiB0OworfQorRVhQT1JUX1NZTUJPTCh0aW1lc3RhbXBfdHJ1bmNhdGUpOworCisvKioK ICAqIGN1cnJlbnRfdGltZSAtIFJldHVybiBGUyB0aW1lCiAgKiBAaW5vZGU6IGlub2RlLgogICoK QEAgLTIxMzQsNiArMjE2NCw2IEBAIHN0cnVjdCB0aW1lc3BlYyBjdXJyZW50X3RpbWUoc3RydWN0 IGlub2RlICppbm9kZSkKIAkJcmV0dXJuIG5vdzsKIAl9CiAKLQlyZXR1cm4gdGltZXNwZWNfdHJ1 bmMobm93LCBpbm9kZS0+aV9zYi0+c190aW1lX2dyYW4pOworCXJldHVybiB0aW1lc3RhbXBfdHJ1 bmNhdGUobm93LCBpbm9kZSk7CiB9CiBFWFBPUlRfU1lNQk9MKGN1cnJlbnRfdGltZSk7Ci0tIAoy LjcuNAoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KWTIw MzggbWFpbGluZyBsaXN0ClkyMDM4QGxpc3RzLmxpbmFyby5vcmcKaHR0cHM6Ly9saXN0cy5saW5h cm8ub3JnL21haWxtYW4vbGlzdGluZm8veTIwMzgK From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: 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 v4 4/5] vfs: Add timestamp_truncate() api Date: Fri, 24 Feb 2017 17:41:02 -0800 Message-Id: <1487986863-6005-5-git-send-email-deepa.kernel@gmail.com> In-Reply-To: <1487986863-6005-1-git-send-email-deepa.kernel@gmail.com> References: <1487986863-6005-1-git-send-email-deepa.kernel@gmail.com> Sender: linux-kernel-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 7967f9c..39b875b 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -2116,6 +2116,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. * @@ -2134,6 +2164,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