[systemd-devel] [correct PATCH v2] dev-root.device is not active, results in an umount spree
Lennart Poettering
lennart at poettering.net
Mon May 18 14:04:37 PDT 2015
On Mon, 18.05.15 16:08, Martin Pitt (martin.pitt at ubuntu.com) wrote:
> Martin Pitt [2015-05-17 15:54 +0200]:
> > This fixes the original "systemd immediately unmounts my mounts" bug,
> > but not for very long: If you remount or unmount just one mount on a
> > tentative device, mountinfo changes, and device_found_node() now calls
> > device_update_found_one() with "add == 0". Then
> >
> > n = add ? (d->found | found) : (d->found & ~found);
> >
> > would unset the previous DEVICE_FOUND_MOUNT flag, leaving 0 (i. e.
> > DEVICE_NOT_FOUND). Thus the previously "tentative" device would once
> > again be set to "dead", and systemd would unmount all other mounts
> > from it. This must never happen, we simply can't declare tentative
> > devices as dead and clean up their unmounts, this only works for
> > "plugged" ones that we know via udev.
>
> Eek, I attached the wrong 0002- patch, sorry about that. The above is
> fixed by the attached patch, please ignore 0002- from the previous
> mail. For completeness I also re-attach 0001- again (unchanged).
Still not getting what the purpose of the 0002 patch is, even in this
revision...
Please elaborate!
> --- a/src/core/device.c
> +++ b/src/core/device.c
> @@ -465,12 +465,13 @@ static void device_update_found_one(Device *d, bool add, DeviceFound found, bool
> * now referenced by the kernel, then we assume the
> * kernel knows it now, and udev might soon too. */
> device_set_state(d, DEVICE_TENTATIVE);
> - else
> - /* If nobody sees the device, or if the device was
> - * previously seen by udev and now is only referenced
> - * from the kernel, then we consider the device is
> + else if (previous & DEVICE_FOUND_UDEV)
> + /* If the device was previously seen by udev and now is only
> + * referenced from the kernel, then we consider the device is
> * gone, the kernel just hasn't noticed it yet. */
> device_set_state(d, DEVICE_DEAD);
> + /* We never move from TENTATIVE to DEAD, as we can only determine this
> + * status update with udev, not with mountinfo */
> }
Devices that show up in /proc/self/mountinfo or /proc/swap, and then
disappear again, without ever showing up in udev, need to be cleaned
up.
Lennart
--
Lennart Poettering, Red Hat
More information about the systemd-devel
mailing list