From patchwork Fri Jul 5 17:02:38 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jeff Layton X-Patchwork-Id: 13725403 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 190E6C3271E for ; Fri, 5 Jul 2024 17:03:12 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 4B9606B00A1; Fri, 5 Jul 2024 13:03:11 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 3F1186B00A2; Fri, 5 Jul 2024 13:03:11 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 1F7EA6B00A3; Fri, 5 Jul 2024 13:03:11 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0017.hostedemail.com [216.40.44.17]) by kanga.kvack.org (Postfix) with ESMTP id EB9FD6B00A1 for ; Fri, 5 Jul 2024 13:03:10 -0400 (EDT) Received: from smtpin13.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay05.hostedemail.com (Postfix) with ESMTP id 765E940295 for ; Fri, 5 Jul 2024 17:03:10 +0000 (UTC) X-FDA: 82306319340.13.5417160 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by imf12.hostedemail.com (Postfix) with ESMTP id 86E1640020 for ; Fri, 5 Jul 2024 17:03:08 +0000 (UTC) Authentication-Results: imf12.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=Cyz8CZ2I; spf=pass (imf12.hostedemail.com: domain of jlayton@kernel.org designates 139.178.84.217 as permitted sender) smtp.mailfrom=jlayton@kernel.org; dmarc=pass (policy=none) header.from=kernel.org ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1720198975; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=bJddfqUYKfPkL5IaapNTI+DPloFTuokezQWldk1boEE=; b=o9C6epb4IAHoTzA1bBOoIXzeyrtU0W1vVkJ1I2v2mHGNdgW/hASwiAxyYYhx/DmwXJTuQ/ oVLyTeNRUM6PND2vCpd/Sm1wTAeH1w2tUKd3T6zFzH9+sJkeWupg/tueM90nypLGpC1Kar HUELq2tPtknk+IJ0TTOO0jkTNVEoUtM= ARC-Authentication-Results: i=1; imf12.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=Cyz8CZ2I; spf=pass (imf12.hostedemail.com: domain of jlayton@kernel.org designates 139.178.84.217 as permitted sender) smtp.mailfrom=jlayton@kernel.org; dmarc=pass (policy=none) header.from=kernel.org ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1720198975; a=rsa-sha256; cv=none; b=ysWu+2XyA+okBeJtzYd0qk/Y/+N9Y3QqzXPb5BhYzDqOpJY96MmXD6SLkANeFqtXQsKdT6 4ymD5E7XS+BL5p4ZdMqqoyRqVsoAgL7Iec6pl5BTgZ1rWccb40QU0nWwfwlwH2Cq0f2Y33 R5XVt+s5m8kuQR9MQf/6przauoTAXpY= Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by dfw.source.kernel.org (Postfix) with ESMTP id 9B73062C30; Fri, 5 Jul 2024 17:03:07 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 01278C116B1; Fri, 5 Jul 2024 17:03:04 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1720198987; bh=/g1ddIto05q7VUdUuGmHZRulUXiGWzaifPHAIEfpWmk=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=Cyz8CZ2I8i9mmYGb6ZNUwNOM+PE3vABCpnlA3oN3yzR9v4w0ZVF3UIEsGVMUP98gG jjN1TaIRrsc6xDHJGucWD6Crn+ugFP3rbPn0DWbaSa1EkmfB1wRQkTrVBq6mkyYObE 2jZQgjGSdd0lqGgZ686afBlmBFPI/V8rsl7idRLWf9Gvvm8JpZu+fqkKPj1gBuje4s ZgfyPqvxLkG10WOZPeGGITJ7lOZOKjezg+nKTnFCQV4+ZvcAM7DOD4IsAgB6OcP/pa f5TrQYDghSURE9jMAOc9HS99fKf0NXO6QDQIr6ML5cAUoPdCP3r07ylQmhCo/XJ609 E3zzhwsarXOFw== From: Jeff Layton Date: Fri, 05 Jul 2024 13:02:38 -0400 Subject: [PATCH v3 4/9] fs: have setattr_copy handle multigrain timestamps appropriately MIME-Version: 1.0 Message-Id: <20240705-mgtime-v3-4-85b2daa9b335@kernel.org> References: <20240705-mgtime-v3-0-85b2daa9b335@kernel.org> In-Reply-To: <20240705-mgtime-v3-0-85b2daa9b335@kernel.org> To: Alexander Viro , Christian Brauner , Jan Kara , Steven Rostedt , Masami Hiramatsu , Mathieu Desnoyers , Chandan Babu R , "Darrick J. Wong" , Theodore Ts'o , Andreas Dilger , Chris Mason , Josef Bacik , David Sterba , Hugh Dickins , Andrew Morton , Jonathan Corbet Cc: Dave Chinner , Andi Kleen , Christoph Hellwig , kernel-team@fb.com, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, linux-xfs@vger.kernel.org, linux-ext4@vger.kernel.org, linux-btrfs@vger.kernel.org, linux-mm@kvack.org, linux-nfs@vger.kernel.org, linux-doc@vger.kernel.org, Jeff Layton X-Mailer: b4 0.13.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=3403; i=jlayton@kernel.org; h=from:subject:message-id; bh=/g1ddIto05q7VUdUuGmHZRulUXiGWzaifPHAIEfpWmk=; b=owEBbQKS/ZANAwAIAQAOaEEZVoIVAcsmYgBmiCc9jHht+laBBOwQf5fabXQzRZYLzNmz+tU17 u0Pkhtrd3CJAjMEAAEIAB0WIQRLwNeyRHGyoYTq9dMADmhBGVaCFQUCZognPQAKCRAADmhBGVaC FflrD/9UNmmTOjbmFEi/KAzSSVbAVfNgsbqqX+5s63+bZfwuZYllGcNP+F9G4xrOyuE1U5D9qiC xmuwsN2Py5WyoEunyvofUP6i+DH2nWEE3nnXDrW+AZhwWbqSkqh6kq9PAA8pjy/njoAc1qyjJsk p1eoQgk2IKxROPgrfbuNzEDem7vxiqxANMjiC6dz+grRH6m0T8pPELw2oQSWsUliHAMeK/tSRee ff2NVdm+R/v2frifR6dbtweCcIVJii4wCGsg0bWWjpLx96ljg/pVaHxx5t6wWkMyp7zKqCF+39L +iKcZtzGsYbSjN4upIotuFyzeFqZeBbNeF/6vFtMY90KhWzDWG/8wYGr0rXehKglm+P3eI4CuYo zUhsoyoRkcUJKSogV7zqtRRBjS+BKs8I4DivCkUwIY/VwOhOMJoZ+j7E9zgrWsiNrK6muZQjwRR gTUJzzp3rApfGkUNKkxWlneOvRnXdgvR/Gr9EuxTXxnuPoxKr45Wo3x+LV98RTyWs3a9EcVrjtl WIu7NFt95+80lPNtMYBTY5ccCV1Ioi8JHnwpb1OhmiW6rqYVU6xBGbqgy20YQ0vrVkJmxgEMFOE B++cCxOX2PSFLtRn+cuaqfSD91T7uY450SrteDzWd5TUEWXl7JgAnU/vOHfPAmoDqN0XcpOPijS mz7WpBTEbj3VEiA== X-Developer-Key: i=jlayton@kernel.org; a=openpgp; fpr=4BC0D7B24471B2A184EAF5D3000E684119568215 X-Rspamd-Server: rspam11 X-Rspamd-Queue-Id: 86E1640020 X-Stat-Signature: u7hysfzqd9hetxbs4n3wjea4a6hq4zwz X-Rspam-User: X-HE-Tag: 1720198988-494836 X-HE-Meta: U2FsdGVkX1+BSbuazRD62dNW6c+dqSMhAxOXfWFU/2rF3UZpUby23joclq4UVdTx2HXPRcRPYfHCoNiacQhv9WyKiM4uzb1TplxcHZ4TUzV8AY/0udL95vUA3JadYzZmXQbbylTHCXpFnMC6riGyqeTJ4/SCnyLqgLP0pn/IrWpSyLD2g/O2zntOqpF0OE0tnxalo4I6DeMUj/2+BT9nkPw3anXL1Xqbk9gBcTwJSrOzF7WOqpHAtTunY5ZaGh+IRDNx1+nw3pgV0nDkizXZgnif1EfFgElgatpcQcoeJ4FGrvLw+MD5577FIwNtYf/CpHha0l+a2aPm2bvoM/umgG0yptezmXbfQ/ZP01hmTWPDsat2tcoMVk5dpOsyuJdzUPnvlqH2FMA5hn/tcQ/U+z+YoDBTROszpzsfCeJLGvF03WSFb0em9PQyItlauS88cLp0jMEd6W2nclsW85avnIlxsDvmV3q4yMCxwS9lpsZkO5tQR/b9kQORXqNT9wClMq2KQeCsh2NdlZWvsrZMEWalANhUvWtJK1EBAUiQxYjUmZ4OWamwGMcah0vsBnOltl5XbgpWrOO7M7DulgGkAvujxYwQGFKxPyPszmorNYRFOOFn62lTOHfa/9p6zQ4KhgZsflSqQC399P3AU2CY4o05jcw6t0dbEOUtCqr6C0ZPbg2kRcTj2r3d/RVuUFmG65J4u5eppLtP8vvwqd4fwVDMoF/+3tFaJ+AHAuV74C0b5pAdlA3yoYUgizVcWp1l68BB7u/0O1wB0E3dtu+ekT1GxXuT6qAGwn3/Fwcxm6IZMiF7zJ/jsIZoLoWEHlVoJbjCWBd6ovwlVfZ0ERGB1nzELSiqUsNKv3zIb66xZTnZ0qnknAgedaz3Cc1UIewW6tyjYIs+i70iik4t+LTJbOL10e92gBEzoqEr4P+zEM6y3XqONPYxkUqt7qxwrLRF1JKX2/POGofb6rADeTl 8EAzWFeK hy/9RGo+Y5k1joXxLAGr3QLtFbhzcJi6BCxGt9tyrsDBjXj+P7Bnmiq17oayrMrDQLE/l56tECLt+69MzyA+kM4CfJps+pVAPz1O2897bRoV/5mGvXSICfDVKOE4rF4qPi7csyqiMNA2k1iKcVpjiV/20GhYXz/TbNIEEikrZRu498QrgLDZwvW2FVIJcbO3qoy0NNDQtNy/Dl7Bh5KldavVoD2134HrKBkkvn7PKpBEW2gnfYXAHydoIx+1sEs7x13HbKtln8DpOSt/IlKRElrCiglU04bxT75lxEmr7tg1pRmQuMtHcfNm0xNxABF5pNYRzzBLznn+50kiC5Bfli5y0kQEM3YHqtY61vpjS4fw5xucpGw1o2pDpsx2pS8bTsmWth8HM8XTOCokRJfTB+BPN9rGMAUbaauW+ X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: The setattr codepath is still using coarse-grained timestamps, even on multigrain filesystems. To fix this, we need to fetch the timestamp for ctime updates later, at the point where the assignment occurs in setattr_copy. On a multigrain inode, ignore the ia_ctime in the attrs, and always update the ctime to the current clock value. Update the atime and mtime with the same value (if needed) unless they are being set to other specific values, a'la utimes(). Note that we don't want to do this universally however, as some filesystems (e.g. most networked fs) want to do an explicit update elsewhere before updating the local inode. Signed-off-by: Jeff Layton --- fs/attr.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 46 insertions(+), 6 deletions(-) diff --git a/fs/attr.c b/fs/attr.c index 825007d5cda4..e03ea6951864 100644 --- a/fs/attr.c +++ b/fs/attr.c @@ -271,6 +271,42 @@ int inode_newsize_ok(const struct inode *inode, loff_t offset) } EXPORT_SYMBOL(inode_newsize_ok); +/** + * setattr_copy_mgtime - update timestamps for mgtime inodes + * @inode: inode timestamps to be updated + * @attr: attrs for the update + * + * With multigrain timestamps, we need to take more care to prevent races + * when updating the ctime. Always update the ctime to the very latest + * using the standard mechanism, and use that to populate the atime and + * mtime appropriately (unless we're setting those to specific values). + */ +static void setattr_copy_mgtime(struct inode *inode, const struct iattr *attr) +{ + unsigned int ia_valid = attr->ia_valid; + struct timespec64 now; + + /* + * If the ctime isn't being updated then nothing else should be + * either. + */ + if (!(ia_valid & ATTR_CTIME)) { + WARN_ON_ONCE(ia_valid & (ATTR_ATIME|ATTR_MTIME)); + return; + } + + now = inode_set_ctime_current(inode); + if (ia_valid & ATTR_ATIME_SET) + inode_set_atime_to_ts(inode, attr->ia_atime); + else if (ia_valid & ATTR_ATIME) + inode_set_atime_to_ts(inode, now); + + if (ia_valid & ATTR_MTIME_SET) + inode_set_mtime_to_ts(inode, attr->ia_mtime); + else if (ia_valid & ATTR_MTIME) + inode_set_mtime_to_ts(inode, now); +} + /** * setattr_copy - copy simple metadata updates into the generic inode * @idmap: idmap of the mount the inode was found from @@ -303,12 +339,6 @@ void setattr_copy(struct mnt_idmap *idmap, struct inode *inode, i_uid_update(idmap, attr, inode); i_gid_update(idmap, attr, inode); - if (ia_valid & ATTR_ATIME) - inode_set_atime_to_ts(inode, attr->ia_atime); - if (ia_valid & ATTR_MTIME) - inode_set_mtime_to_ts(inode, attr->ia_mtime); - if (ia_valid & ATTR_CTIME) - inode_set_ctime_to_ts(inode, attr->ia_ctime); if (ia_valid & ATTR_MODE) { umode_t mode = attr->ia_mode; if (!in_group_or_capable(idmap, inode, @@ -316,6 +346,16 @@ void setattr_copy(struct mnt_idmap *idmap, struct inode *inode, mode &= ~S_ISGID; inode->i_mode = mode; } + + if (is_mgtime(inode)) + return setattr_copy_mgtime(inode, attr); + + if (ia_valid & ATTR_ATIME) + inode_set_atime_to_ts(inode, attr->ia_atime); + if (ia_valid & ATTR_MTIME) + inode_set_mtime_to_ts(inode, attr->ia_mtime); + if (ia_valid & ATTR_CTIME) + inode_set_ctime_to_ts(inode, attr->ia_ctime); } EXPORT_SYMBOL(setattr_copy);