From patchwork Thu Jul 11 11:08:08 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jeff Layton X-Patchwork-Id: 13730389 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 7A598C3DA41 for ; Thu, 11 Jul 2024 11:08:43 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 461C86B0095; Thu, 11 Jul 2024 07:08:41 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 413FF6B0096; Thu, 11 Jul 2024 07:08:41 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 23E0F6B0098; Thu, 11 Jul 2024 07:08:41 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0011.hostedemail.com [216.40.44.11]) by kanga.kvack.org (Postfix) with ESMTP id F3F4F6B0095 for ; Thu, 11 Jul 2024 07:08:40 -0400 (EDT) Received: from smtpin09.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay09.hostedemail.com (Postfix) with ESMTP id A2B3B80453 for ; Thu, 11 Jul 2024 11:08:40 +0000 (UTC) X-FDA: 82327198800.09.6E62C57 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by imf09.hostedemail.com (Postfix) with ESMTP id D348B14002E for ; Thu, 11 Jul 2024 11:08:38 +0000 (UTC) Authentication-Results: imf09.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=aM6rnkQn; dmarc=pass (policy=none) header.from=kernel.org; spf=pass (imf09.hostedemail.com: domain of jlayton@kernel.org designates 139.178.84.217 as permitted sender) smtp.mailfrom=jlayton@kernel.org ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1720696094; a=rsa-sha256; cv=none; b=yAWB+9xdnQZTvu6M8oLXmyjW5kSwOUrJny84Qa1D+aN/78lBbBR9mavX1+Rxhg/32HN9jN Hr4cITYzuWCnriZkIRlO877MgBlYwHD1HQarvRCXcbtQ5+0PMoAKj1RxWEaYURbzRHKZm+ QtuAKbBBRkq8HG/yTbj56w3gN8eEKu8= ARC-Authentication-Results: i=1; imf09.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=aM6rnkQn; dmarc=pass (policy=none) header.from=kernel.org; spf=pass (imf09.hostedemail.com: domain of jlayton@kernel.org designates 139.178.84.217 as permitted sender) smtp.mailfrom=jlayton@kernel.org ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1720696094; 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=2M6W6JZiruz4nySz6bD7RVoeM3AOko1bo9RHx9uB8p72DFsc4mL9KvGQ5T3o/woW9R1dWs HXrFQush+mrok+KXEpa3KcDznRWnqGvWJ7OQitBBSrS3JPMb8szKrFeUWBI/lg2vVx63fE 3qLk5htM4ft9SZnPQ+SomhXPtbTAiGY= Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by dfw.source.kernel.org (Postfix) with ESMTP id 57C0261D0C; Thu, 11 Jul 2024 11:08:37 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 3ED33C4AF0F; Thu, 11 Jul 2024 11:08:34 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1720696117; bh=/g1ddIto05q7VUdUuGmHZRulUXiGWzaifPHAIEfpWmk=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=aM6rnkQnft67EwdDPveBEC+aLnbaz9Iw/J9cEyYCG3WskFlIH9k0egFU0+Qi2Q05c PGTgq5xVMimnrOH/NEwwdPJJxHGQC59lahoqxdR1589/Od69pfsq/S4P9rCm6EDfnE CCbH8QPfqjRO2bzt1m/KEINTRYYAeM41mPxo/nmz0cf7H3iakPlLS6s8HITwbeYPU+ i2/lDosNupJCDwHLlMu9LzEE4CucQJZFqhDTVII8U+QLk+uhFR97875JWbKdeb8kEY m6RUPbotcrmnFL7PG2S+dR12jKaQ79i/hUeM6l9cFRvMyW7Ub2xHxlN/HxyaaoQOIU tNrQX0xPxYWJw== From: Jeff Layton Date: Thu, 11 Jul 2024 07:08:08 -0400 Subject: [PATCH v5 4/9] fs: have setattr_copy handle multigrain timestamps appropriately MIME-Version: 1.0 Message-Id: <20240711-mgtime-v5-4-37bb5b465feb@kernel.org> References: <20240711-mgtime-v5-0-37bb5b465feb@kernel.org> In-Reply-To: <20240711-mgtime-v5-0-37bb5b465feb@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 , Uros Bizjak , Kent Overstreet , Arnd Bergmann , Randy Dunlap , 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/ZANAwAIAQAOaEEZVoIVAcsmYgBmj70l0tB8wkk1mE/fQzmfxmASsaLYnQ6xULsvM medg6N9UiyJAjMEAAEIAB0WIQRLwNeyRHGyoYTq9dMADmhBGVaCFQUCZo+9JQAKCRAADmhBGVaC FRj/D/9/qFMGv96YIkAUDVx329NA3lwGZlqp79bN1JG78zGjqY7RX8Uv8c805I25dhpqy2+jfBk VnWd2HCtg1ShenHgPEfnBAsQNjiSUqeF1uIuEVVrTwFaq8AsGY8LTu0QVyeuGImLKtdQomtuVwt FSmNefB0eXDRt6rmOFfnflJoXglp10hyeikatMaHGEr4ASXHDObg50snibOl81qye5cNJh6LbWT UZSgieB+TtqZzZfxAqwNVBRXLrT8QjDcSyfNuJoiB16Jnejn5qaFVEiGGqomR3//RmFSBozZ16y 1HwtgYp+Wn/io/r+6kKUrUeYHURFsR2sVu7s/XBzTb6gJ3yMjd8YTaCSg8Oy+yKNh32pf39Lhmh arf0zK8/W8lt2iOWSuLYJ2//NzoH8u/p12GqCm2dhWvmIWg1CD7YqW3cDGiWc8bltkudb+doVt7 JnP52FRHLAy8v3Sbp5QD9WLr/4lBVDEaE+ulNhzfxNjI6XIaMRQLWY83t1qsaNRRd9+l/QdIh4D w8GSkDpmq9M+iIPOmGLF2GndPggmO3X5p84sFpQHkNa9P8Nc+DBt0RnoIS+1FTm4LfAs3VrB9Se XHTcE4rfgHM0uGMDzvP3iybkgvcTipYHi9n9zPYC1UflB4CkmguObxvjJKWVAOuSCGxvMhtPjBt g4r/yhDL2VECz9A== X-Developer-Key: i=jlayton@kernel.org; a=openpgp; fpr=4BC0D7B24471B2A184EAF5D3000E684119568215 X-Rspamd-Queue-Id: D348B14002E X-Rspam-User: X-Rspamd-Server: rspam05 X-Stat-Signature: tcbm5hatx3kj3he6i1pchwihmz3erxgz X-HE-Tag: 1720696118-327545 X-HE-Meta: U2FsdGVkX1+ebPAzswvSll4+skRnHsx9bj1LPUzgZB7NO78EFjkPvvATUelKgQOV02JrtiP0anARdrNJy5hYdZSd8DDftGeRNo1JHeRckPAXZqyzQJ2n+SejEPIiIm0H2hHjWKDBGelN2+mzWh3f36k0qQqNxlEl4KeNlT9wON9xgpm8EzSprLDMixrCo6JShbmpGrINSnPy5zeCOMy3663/A/7P9R/x1fbH/uKUnPmwG+58p966rfus5P/4jkmPul3HLI8xdXF78mBjY/t0WuFb4qaLrZmIbX7Q4K01V7j+2cS0kC2Wz3bYzkpufQISLD4wOvLY16iKTbfWP6F2jAKCJTzs3sBnxmzwCiebzlt3BV/QAu1v3zLqGwjXnUjMiyrkSmGY7v6Ya1hcsis5TJ9S1vGSFAWjuQHcre11ZiLzhohM0iC4DN9LdqwNOGzLlQgmj/k3BKvdWc3pDYTZZGxwJ/LAIr4a7LacfECOAyQYlII+WudfC8NtXm5Y+d/U6Hk5H/ZozABSNJF0sXjJcu91zGu2f9nXJmszFN9S/rT9ZyOf/Z9Dx6AxoAs5iEuZjjIEqMgZD8qMF6llMwKI6uBDF+5N6NFlsAEpCbk3LS9Bi4eMIFpYiF/Jq3K5T2ZrdXX/bg8uELovXlysBSZHo8aNYLjGTrDQsGpLBF1Gdj/9q4zLUJgfM4LILj+djUTO04iF4mtycbmA6EsbjBWHIjSfzZ49fyGo8vVJlkjIOz1sojKWEPg9i9JRdogY69w/l+rSIXqgNviM9iCF536Y8iMYVD6DmrNAIZWZaRmJiN3Wsrnydkgi0Zd2brNQb1KlxqW4256Mc/9RLtYivzLJlJP/L+5EbQ6ro9SA0agPJo24p6cRfijhm1TP7SVZmw5MRv202m5Hs/VMYsaLudE9PjDeT0jEViqg2bvAbPFSQKth289UjVoTII0wdB0auL25p0UgVkJvTQZvG4jxOOa C4hH3Mgd vpMiMluhypjfbpUm3vKkYJ8PSecy0JJFDaBWbvHHRCKoEdZAbm0tCIi26/faVNnUFa39g/L9zEv0+H5q2bOiKfDGUgXGmdC9kkUMyak5SNHDTCWsms/YE6zQF+W3dfWffj4wCJ8hjb431asFAyzdEN6aJPifo2cTZ2/iwOQHWq8hiHI9Risj6GfoFuXXVRSEN7iHqIzozZH4zXR88HCSxxql5LdOx/hRXjr60FFmTS6M4OxaugQCY20SUoJqw8D4rRQTEtLUm9ebSiwq9tbhZ2EkHMEAP5PpIO3GsBLrkn8Guqefv2n7p1+5KrmtAbP0bvF0og5adOtr8FM+KNGDCjqmKnR1g8HyOu7NjBhMXumRxclzHgBbEmjbIZhj0LMz9Z1gY3riqqin+k2D12N6D9f8vBDFJPwb/eNet 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 Reviewed-by: Darrick J. Wong --- 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);