From patchwork Thu Apr 24 21:42:52 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 2076933 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256 header.s=k20201202 header.b=UcraiIWc; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=ozlabs.org (client-ip=2404:9400:2221:ea00::3; helo=mail.ozlabs.org; envelope-from=srs0=pdma=xk=vger.kernel.org=linux-ext4+bounces-7475-patchwork-incoming=ozlabs.org@ozlabs.org; receiver=patchwork.ozlabs.org) Received: from mail.ozlabs.org (mail.ozlabs.org [IPv6:2404:9400:2221:ea00::3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (secp384r1)) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4Zk8bB44R2z1yN2 for ; Fri, 25 Apr 2025 07:42:46 +1000 (AEST) Received: from mail.ozlabs.org (mail.ozlabs.org [IPv6:2404:9400:2221:ea00::3]) by gandalf.ozlabs.org (Postfix) with ESMTP id 4Zk8bX0N1Bz4x6n for ; Fri, 25 Apr 2025 07:43:04 +1000 (AEST) Received: by gandalf.ozlabs.org (Postfix) id 4Zk8bX0LCSz4xD3; Fri, 25 Apr 2025 07:43:04 +1000 (AEST) Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: gandalf.ozlabs.org; arc=pass smtp.remote-ip=147.75.80.249 arc.chain=subspace.kernel.org ARC-Seal: i=2; a=rsa-sha256; d=ozlabs.org; s=201707; t=1745530984; cv=pass; b=abMuUK2/FO/88lrdTXw2EGr0JHqKOTc5wPE54BGNcpn3ypqZU2PUS2W02+9/k+ozpxcA3cMBMIzJrLVFgOIWHr+1oCmsYmp3PYRnCaU9yUyDlHwP5R4AJ2K7NhJc0vMJe+BDmVhRcuIxTkUythRPEz2FixfgFKY8/t4VP+wu27V/9InKj8PDaIaOz1LyI7ubn+vmkca4lL9PuWCqIvDO06iAUS44YFIZp2PJwMSrnTogBk/X+Yjzz5P4Yw9UiEC6YhMSDtPPy/DSnnhZ68tq9I97VmPyUsJXT8Jvut7JDlst7iI79TktUM8UG2gfbgWyx50B8ghp7sVT9W5FCa2fiQ== ARC-Message-Signature: i=2; a=rsa-sha256; d=ozlabs.org; s=201707; t=1745530984; c=relaxed/relaxed; bh=HfgVnDZYQgCCc7r5ttvt+IrJmidLV4DxbogHcp+WnKM=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=B7X7SYpXlFN/OdnAElkviqWTdgtnQnvsZ2f+O5rIs8dV6A9OBu2hKyXKW0T8eEht/pcFK+Jq62YlqK8HsE0Z8FsAXpHbotKBK08MUIjQCiyWb55f3cV8vL5NMB0AyeZXzPdDU7tR4lRLyNkmFFvtG2BCGGHDPYWfIQvHYQsnt3DNnhfPy27CIV4ql5qP2ZBrUbl11zb9eOnOlB942cElC8SMMUOdrxZ8yFQ2JcnNhRTyJyWUdmhRSYwcIF2I7zB7y/MsK5VAnSsgX52MzGXsVoa5rKDs8Oh4XTU2N3FQLrsXtUvBA0S57KFn0+l5h2NzxcZ9c4p4gcWdWmq6y+ihxA== ARC-Authentication-Results: i=2; gandalf.ozlabs.org; dmarc=pass (p=quarantine dis=none) header.from=kernel.org; spf=pass smtp.mailfrom=vger.kernel.org; dkim=pass (2048-bit key; unprotected) header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256 header.s=k20201202 header.b=UcraiIWc; dkim-atps=neutral Authentication-Results: gandalf.ozlabs.org; dmarc=pass (p=quarantine dis=none) header.from=kernel.org Authentication-Results: gandalf.ozlabs.org; spf=pass smtp.mailfrom=vger.kernel.org Authentication-Results: gandalf.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256 header.s=k20201202 header.b=UcraiIWc; dkim-atps=neutral Received: from am.mirrors.kernel.org (am.mirrors.kernel.org [147.75.80.249]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by gandalf.ozlabs.org (Postfix) with ESMTPS id 4Zk8bS4p4nz4x6n for ; Fri, 25 Apr 2025 07:43:00 +1000 (AEST) Received: from smtp.subspace.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by am.mirrors.kernel.org (Postfix) with ESMTPS id 1618B1BA38D2 for ; Thu, 24 Apr 2025 21:43:10 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 11DB321E087; Thu, 24 Apr 2025 21:42:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="UcraiIWc" X-Original-To: linux-ext4@vger.kernel.org Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C64BD198851 for ; Thu, 24 Apr 2025 21:42:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745530972; cv=none; b=T3W5k9r2hPxLTCdz84CtyXWTE+6tc8QTNND0ep2CN3jfkRW+n3p5t/hZZ6UboI00dIKiuMcXpRKedUmsi4vE2k+LW9Y+Bm4VFuqvXGM5pYMbwd94KbEUjQcZFi9CxUV8fb1pgCjzmjUUCP4olt4+WW8jQUogbC0DGPaD1brJi2Y= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745530972; c=relaxed/simple; bh=D3geD668dYQCYWALjajm4BVmx4d0jul3yq8hsw1QP1M=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=lmRKXkDGoiLENz+RG5zHnuAinuzG9rXkzTqQe1xDShDRB0mCMgk2p6Qef6CRcnHb6XS5JClgyc8nYXqSnbBPiS+FALyz/TvTOlXwWI1FeWEcmHXURhe5Lgrwks1dx6gZzKGQylyFl6tmo649o0X0XND29IwaBH1CsQgmY3OIdRA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=UcraiIWc; arc=none smtp.client-ip=10.30.226.201 Received: by smtp.kernel.org (Postfix) with ESMTPSA id 9DBA5C4CEE3; Thu, 24 Apr 2025 21:42:52 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1745530972; bh=D3geD668dYQCYWALjajm4BVmx4d0jul3yq8hsw1QP1M=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=UcraiIWc8hX7yCzQv1ZkUUmU5ekPfpBnGtNr9/613nttI03IqZwEy6L1MJOGnAsvq p0xyGc6nIUtiMRWItQ6tJac+jOb5D0FFLVLcqP3NcL+wrzJnVKeQCBY+mC2c/a9HLq E8u6dOGKipuGNqxoBRhSOkH/Cuc+n7ZLoZqlSAjtpBsOLjOsNAhPO+AglhEEy3lrUv U3fqAeWg6P4yn3MSrjNV3NEO43cnHZSgE3PXoJ/PeGHgwbZ6odIq5h576uSsVqD80j SNhjypABnEZepzUfM+1NwILaJ+Ub9h1bwNYkoQKrukv42WkQgOSS83ovihZGsyf078 GAnH+zptVifVA== Date: Thu, 24 Apr 2025 14:42:52 -0700 Subject: [PATCH 08/16] fuse2fs: clamp timestamps that are being written to disk From: "Darrick J. Wong" To: tytso@mit.edu Cc: linux-ext4@vger.kernel.org Message-ID: <174553065069.1160461.14751120886781323020.stgit@frogsfrogsfrogs> In-Reply-To: <174553064857.1160461.865616278603382583.stgit@frogsfrogsfrogs> References: <174553064857.1160461.865616278603382583.stgit@frogsfrogsfrogs> Precedence: bulk X-Mailing-List: linux-ext4@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Spam-Status: No, score=-4.5 required=5.0 tests=ARC_SIGNED,ARC_VALID, DKIMWL_WL_HIGH,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DMARC_PASS, MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED,SPF_HELO_NONE,SPF_PASS autolearn=disabled version=4.0.1 X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-25) on gandalf.ozlabs.org From: Darrick J. Wong Clamp the timestamps that we write to disk to the minimum and maximum values permitted given the ondisk format. This fixes y2038 support, as tested by generic/402. Signed-off-by: "Darrick J. Wong" --- lib/ext2fs/ext2_fs.h | 4 ++++ misc/fuse2fs.c | 39 ++++++++++++++++++++++++++++++++------- 2 files changed, 36 insertions(+), 7 deletions(-) diff --git a/lib/ext2fs/ext2_fs.h b/lib/ext2fs/ext2_fs.h index 3a5eb7387d0c9d..fcd42055665788 100644 --- a/lib/ext2fs/ext2_fs.h +++ b/lib/ext2fs/ext2_fs.h @@ -801,6 +801,10 @@ struct ext2_super_block { #define EXT2_GOOD_OLD_INODE_SIZE 128 +#define EXT4_EXTRA_TIMESTAMP_MAX (((int64_t)1 << 34) - 1 + INT32_MIN) +#define EXT4_NON_EXTRA_TIMESTAMP_MAX INT32_MAX +#define EXT4_TIMESTAMP_MIN INT32_MIN + /* * Journal inode backup types */ diff --git a/misc/fuse2fs.c b/misc/fuse2fs.c index bf4e592e7d2782..9cf8c59b8b88ee 100644 --- a/misc/fuse2fs.c +++ b/misc/fuse2fs.c @@ -227,21 +227,43 @@ static inline void ext4_decode_extra_time(struct timespec *time, __u32 extra) time->tv_nsec = ((extra) & EXT4_NSEC_MASK) >> EXT4_EPOCH_BITS; } +#define EXT4_CLAMP_TIMESTAMP(xtime, timespec, raw_inode) \ +do { \ + if ((timespec)->tv_sec < EXT4_TIMESTAMP_MIN) \ + (timespec)->tv_sec = EXT4_TIMESTAMP_MIN; \ + if ((timespec)->tv_sec < EXT4_TIMESTAMP_MIN) \ + (timespec)->tv_sec = EXT4_TIMESTAMP_MIN; \ + \ + if (EXT4_FITS_IN_INODE(raw_inode, xtime ## _extra)) { \ + if ((timespec)->tv_sec > EXT4_EXTRA_TIMESTAMP_MAX) \ + (timespec)->tv_sec = EXT4_EXTRA_TIMESTAMP_MAX; \ + } else { \ + if ((timespec)->tv_sec > EXT4_NON_EXTRA_TIMESTAMP_MAX) \ + (timespec)->tv_sec = EXT4_NON_EXTRA_TIMESTAMP_MAX; \ + } \ +} while (0) + #define EXT4_INODE_SET_XTIME(xtime, timespec, raw_inode) \ do { \ - (raw_inode)->xtime = (timespec)->tv_sec; \ + typeof(*(timespec)) _ts = *(timespec); \ + \ + EXT4_CLAMP_TIMESTAMP(xtime, &_ts, raw_inode); \ + (raw_inode)->xtime = _ts.tv_sec; \ if (EXT4_FITS_IN_INODE(raw_inode, xtime ## _extra)) \ (raw_inode)->xtime ## _extra = \ - ext4_encode_extra_time(timespec); \ + ext4_encode_extra_time(&_ts); \ } while (0) #define EXT4_EINODE_SET_XTIME(xtime, timespec, raw_inode) \ do { \ + typeof(*(timespec)) _ts = *(timespec); \ + \ + EXT4_CLAMP_TIMESTAMP(xtime, &_ts, raw_inode); \ if (EXT4_FITS_IN_INODE(raw_inode, xtime)) \ - (raw_inode)->xtime = (timespec)->tv_sec; \ + (raw_inode)->xtime = _ts.tv_sec; \ if (EXT4_FITS_IN_INODE(raw_inode, xtime ## _extra)) \ (raw_inode)->xtime ## _extra = \ - ext4_encode_extra_time(timespec); \ + ext4_encode_extra_time(&_ts); \ } while (0) #define EXT4_INODE_GET_XTIME(xtime, timespec, raw_inode) \ @@ -2884,7 +2906,10 @@ static int op_utimens(const char *path, const struct timespec ctv[2] ret = translate_error(fs, 0, err); goto out; } - dbg_printf(ff, "%s: ino=%d\n", __func__, ino); + dbg_printf(ff, "%s: ino=%d atime=%lld.%ld mtime=%lld.%ld\n", __func__, + ino, + (long long int)ctv[0].tv_sec, ctv[0].tv_nsec, + (long long int)ctv[1].tv_sec, ctv[1].tv_nsec); ret = check_inum_access(fs, ino, W_OK); if (ret) @@ -2908,9 +2933,9 @@ static int op_utimens(const char *path, const struct timespec ctv[2] #endif /* UTIME_NOW */ #ifdef UTIME_OMIT if (tv[0].tv_nsec != UTIME_OMIT) - EXT4_INODE_SET_XTIME(i_atime, tv, &inode); + EXT4_INODE_SET_XTIME(i_atime, &tv[0], &inode); if (tv[1].tv_nsec != UTIME_OMIT) - EXT4_INODE_SET_XTIME(i_mtime, tv + 1, &inode); + EXT4_INODE_SET_XTIME(i_mtime, &tv[1], &inode); #endif /* UTIME_OMIT */ ret = update_ctime(fs, ino, &inode); if (ret)