linux-btrfs.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] btrfs: derive f_fsid with dev_t only when temp_fsid is active
@ 2026-09-12 18:06 Anand Jain
  2026-09-12 21:58 ` Dave Hansen
  2026-09-14  3:42 ` Anand Suveer Jain
  0 siblings, 2 replies; 14+ messages in thread
From: Anand Jain @ 2026-09-12 18:06 UTC (permalink / raw)
  To: linux-btrfs, dave.hansen; +Cc: dwmw2, thiago.macieira, dsterba

Commit c2a74ed0494c ("btrfs: derive f_fsid from on-disk fsid and dev_t")
mixed dev_t into f_fsid for all single-device setups to avoid f_fsid
collisions with cloned filesystems.

However, doing this unconditionally breaks backward compatibility.
statfs(2) f_fsid changes after a kernel upgrade, and also can shift
across reboots or dev re-attaches as dev_t values change.

Fix this by only mixing dev_t when temp_fsid is active.
This means for non-temp_fsid setups or the original mount, we use the
old method of deriving fsid based on the UUID.

So in the case of a cloned Btrfs filesystem, we won't be able to
maintain the same fsid across mount recycle if the mount order
changes.

Fixes: c2a74ed0494c ("btrfs: derive f_fsid from on-disk fsid and dev_t")
Reported-by: Dave Hansen <dave.hansen@intel.com>
Closes: https://lore.kernel.org/linux-btrfs/be0c08f5-2f31-40f5-8a3b-f2f58b3e00ff@intel.com
Signed-off-by: Anand Jain <asj@kernel.org>
---
 Dave (Hansen), I wonder if you could verify whether this fixes the issue
 on your end. I have run some limited test cases from fstests as of now,
 and they passed.

 fs/btrfs/super.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c
index 464129b1b0d4..ddb620ac241b 100644
--- a/fs/btrfs/super.c
+++ b/fs/btrfs/super.c
@@ -1836,8 +1836,12 @@ static int btrfs_statfs(struct dentry *dentry, struct kstatfs *buf)
 	f_fsid.val[0] ^= btrfs_root_id(BTRFS_I(d_inode(dentry))->root) >> 32;
 	f_fsid.val[1] ^= btrfs_root_id(BTRFS_I(d_inode(dentry))->root);
 
-	/* Hash dev_t to avoid f_fsid collision with cloned filesystems. */
-	if (fs_info->fs_devices->total_devices == 1) {
+	/*
+	 * Hash dev_t to avoid f_fsid collisions with cloned filesystems.
+	 * Only do this when a clone is present so the original filesystem
+	 * (mounted first) maintains backward-compatible f_fsid behavior.
+	 */
+	if (fs_info->fs_devices->temp_fsid) {
 		__kernel_fsid_t dev_fsid =
 			u64_to_fsid(huge_encode_dev(fs_info->fs_devices->latest_dev->bdev->bd_dev));
 
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2026-09-18  8:59 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-09-12 18:06 [PATCH] btrfs: derive f_fsid with dev_t only when temp_fsid is active Anand Jain
2026-09-12 21:58 ` Dave Hansen
2026-09-13  1:05   ` Anand Suveer Jain
2026-09-13  1:13     ` Dave Hansen
2026-09-13  2:43       ` Anand Suveer Jain
2026-09-14  3:42 ` Anand Suveer Jain
2026-09-14  5:28   ` David Woodhouse
2026-09-14  8:28     ` Anand Suveer Jain
2026-09-14 10:47       ` David Woodhouse
2026-09-14 12:28         ` Anand Suveer Jain
2026-09-14 16:41         ` David Sterba
2026-09-14 16:39       ` David Sterba
2026-09-14 16:46   ` David Sterba
2026-09-18  8:59     ` Anand Suveer Jain

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).