]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
btrfs: use vfs_utimes to update file timestamps
authorChristoph Hellwig <hch@lst.de>
Thu, 20 Nov 2025 06:47:25 +0000 (07:47 +0100)
committerChristian Brauner <brauner@kernel.org>
Wed, 26 Nov 2025 13:50:10 +0000 (14:50 +0100)
Btrfs updates the device node timestamps for block device special files
when it stop using the device.

Commit 8f96a5bfa150 ("btrfs: update the bdev time directly when closing")
switch that update from the correct layering to directly call the
low-level helper on the bdev inode.  This is wrong and got fixed in
commit 54fde91f52f5 ("btrfs: update device path inode time instead of
bd_inode") by updating the file system inode instead of the bdev inode,
but this kept the incorrect bypassing of the VFS interfaces and file
system ->update_times method.  Fix this by using the propet vfs_utimes
interface.

Fixes: 8f96a5bfa150 ("btrfs: update the bdev time directly when closing")
Fixes: 54fde91f52f5 ("btrfs: update device path inode time instead of bd_inode")
Signed-off-by: Christoph Hellwig <hch@lst.de>
Link: https://patch.msgid.link/20251120064859.2911749-5-hch@lst.de
Reviewed-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Christian Brauner <brauner@kernel.org>
fs/btrfs/volumes.c

index 2bec544d8ba300093ca5915ca5169847e0ba0625..259e8b0496df68f2973f71c6ebeb8d6deeaef0f2 100644 (file)
@@ -2002,14 +2002,11 @@ out:
 static void update_dev_time(const char *device_path)
 {
        struct path path;
-       int ret;
 
-       ret = kern_path(device_path, LOOKUP_FOLLOW, &path);
-       if (ret)
-               return;
-
-       inode_update_time(d_inode(path.dentry), S_MTIME | S_CTIME | S_VERSION);
-       path_put(&path);
+       if (!kern_path(device_path, LOOKUP_FOLLOW, &path)) {
+               vfs_utimes(&path, NULL);
+               path_put(&path);
+       }
 }
 
 static int btrfs_rm_dev_item(struct btrfs_trans_handle *trans,