On 2016-07-07 20:23, Austin S. Hemmelgarn wrote: [...] > FWIW, I've pretty much always been of the opinion that the device discovery > belongs in a mount helper. The auto-discovery from udev (and more > importantly, how the kernel handles being told about a device) is much of the > reason that it's so inherently dangerous to do block level copies. There's > obviously no way that can be changed now without breaking something, but > that's on the really short list of things that I personally feel are worth > breaking to fix a particularly dangerous pitfall. The recent discovery that > device ready state is write-once when set just reinforces this in my opinion. > > Here's how I would picture the ideal situation: > * A device is processed by udev. It detects that it's part of a BTRFS array, > updates blkid and whatever else in userspace with this info, and then stops > without telling the kernel. > * The kernel tracks devices until the filesystem they are part of is > unmounted, or a mount of that FS fails. > * When the user goes to mount the a BTRFS filesystem, they use a mount helper. > 1. This helper queries udev/blkid/whatever to see which devices are part of > an array. > 2. Once the helper determines which devices are potentially in the > requested FS, it checks the following things to ensure array integrity: > - Does each device report the same number of component devices for the > array? > - Does the reported number match the number of devices found? > - If a mount by UUID is requested, do all the labels match on each device? > - If a mount by LABEL is requested, do all the UUID's match on each > device? > - If a mount by path is requested, do all the component devices reported > by that device have matching LABEL _and_ UUID? > - Is any of the devices found already in-use by another mount? ^^^^^^^^^^^^^^^^^ It is possible to mount two time the same device.
I add my favorite: - is there a conflict of disk-uuid (i.e two different disk with the same uuid) ? Anyway the point 2 has to be in loop until timeout: i.e. if systemd ask to mount a filesystem when the first device appear, wait for all devices appear. > 4. If any of the above checks fails, and the user has not specified an > option to request a mount anyway, report the error and exit with non-zero > status _before_ even talking to the kernel. > 5. If only the second check fails (the check verifying the number of > devices found), and it fails because the number found is less than required > for a non-degraded mount, ignore that check if and only if the user specified > -o degraded. > 6. If any of the other checks fail, ignore them if and only if the user > asks to ignore that specific check. > 7. Otherwise, notify the kernel about the devices and call mount(2). > * The mount helper parses it's own set of special options similar to the > bg/fg/retry options used by mount.nfs to allow for timeouts when mounting, as > well as asynchronous mounts in the background. > * btrfs device scan becomes a no-op > * btrfs device ready uses the above logic minus step 7 to determine if a > filesystem is probably ready. > > Such a situation would probably eliminate or at least reduce most of our > current issues with device discovery, and provide much better error reporting > and general flexibility. > -- gpg @keyserver.linux.it: Goffredo Baroncelli <kreijackATinwind.it> Key fingerprint BBF5 1610 0B64 DAC6 5F7D 17B2 0EDA 9B37 8B82 E0B5 -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html