On Mon, Jun 05, 2023 at 10:36:38AM -0400, Theodore Ts'o wrote: > On Mon, Jun 05, 2023 at 01:37:40PM +0200, Christian Brauner wrote: > > Using a zero/special UUID would have made this usable for most > > filesystems which allows userspace to more easily detect this. Using a > > filesystem feature bit makes this a lot more fragmented between > > filesystems. > > Not all file systems have feature bits. So I'd suggest that how this > should be a file system specific implementation detail. If with a > newer kernel, a file systems sets the UUID to a random value if it is > all zeros when it is mounted should be relatively simple. Sure, but this is a *fs implementation detail*, not a user API requirement. If the filesysystem has feature bits, then it should use them, not rely on zero UUID values because existing filesystems and/or images could have zero values in them and the user may no want them to be regenerated on mount. That's a retrospective change of on-disk format behaviour, and hence requires feature bits to manage.... > However, there are some questions this brings up. What should the > semantics be if a file system creates a file system-level snapshot --- > should the UUID be refreshed? What if it is a block-level file system > snapshot using LVM --- should the UUID be refreshed in that case? Engage your brain, Ted. Existing workflows with snapshots are completely unchanged by this proposal. If you take a device level snapshot and then want to mount it, you have to change the UUID before it gets mounted.. Indeed, XFS will refuse to mount filesystems with duplicate UUIDs; the admin has been forced to run xfs admin tools to regenerate the UUID before mounting the snapshot image for the past 20+ years. Or for pure read-only snapshots, they need to use "-o ro,norecovery,nouuid" to allow a pure read-only mount with a duplicate UUID. The "nouuid" mount otion has been around for almost 22 years: commit 813e9410043e88b474b8b2b43c8d8e52ea90f155 Author: Steve Lord <lord@xxxxxxx> Date: Fri Jun 29 22:29:47 2001 +0000 Add nouuid mount option Either way, the admin has to manage UUIDs for device level snapshots, and there is no change in that at all. IOWs, there is no change to existing workflows because they already require UUIDs to be directly manipulated by the user before or at mount time for correct behaviour. > As I've been trying to point out, exactly what the semantics of a file > system level UUID has never been well defined, and it's not clear what > various subsystems are trying to *do* with the UUID. And given that > what can happen with mount name spaces, bind mounts, etc., we should > ask whether the assumptions they are making with respect to UUID is in > fact something we should be encouraging. We can't put that genie back in the bottle. But it does raise a further interesting questions about sb->s_uuid: is one uuid sufficient for a superblock? We have two specific use cases here: 1. A uuid that uniquely identifies every filesystem (e.g. blkid, pnfs, /dev/disk/by-uuid/, etc) 2. A persistent, unchanging uuid that can be used to key persistent objects to the underlying filesystem (overlay, security xattrs, etc) regardless of snapshots, cloning, dedupe, etc. We already have a solution to that problem in XFS, sbp->sb_uuid is for case #1, sbp->sb_metauuid is for case #2 as every metadata block in the filesystem is keyed with sbp->sb_metauuid. Both start out the same at mkfs time, but if we then regenerate the filesystem uuid, then only sbp->sb_uuid is changed. We do not rewrite metadata with the new uuid, doing so would break snapshot/clone/dedupe in shared filesystem images. This is one of the things that the XFS online UUID change proposal added - it allowed for userspace to query the sbp->sb_metauuid in addition to the sbp->sb_uuid so that userspace init script orchestration to make use of it for persistent userspace filesystem objects rather than the sbp->s_uuid identifier.... > > But allowing to refuse being mounted on older kernels when the feature > > bit is set and unknown can be quite useful. So this is also fine by me. > > This pretty much guarantees people won't use the feature for a while. Perfectly fine by me. Those that need it will backport/upgrade both userspace and kernels immediately, and they reap the benefits immediately. Everyone else gets it as distros roll out with the functionality enabled and fully supported across the toolchain. This is how all new feature additions work, so I'm not sure why you think this is a reason not to use a feature bit... > People complain when a file system cann't be mounted. Using a feature > bit is also very likely to mean that you won't be able to run an older > fsck on that file system --- for what users would complain would be no > good reason. And arguably, they would be right to complain. In general, yes, but this is *not a general case*. If you have a golden image with the feature bit set, why would you ever run a fsck that doesn't support the feature bit on it? You have to have a tool chain that supports the feature bit to set it in the first place. And If the feature bit is set, then you must be running client kernels that support it (and will clear it on first mount), so once the client system is running, the feature bit will never be set and so the toolchain in the client OS just doesn't matter at all. There is literally no other use case for this feature, so arguing about generalities that simply don't apply to the specific use case really isn't that helpful. As a result, I don't see that there are any concerns about using a feature bit at all, yet I see substantial benefit from not retropsectively redefining a special on-disk UUID value that silently drives new kernel behaviour. Cheers, Dave. -- Dave Chinner david@xxxxxxxxxxxxx