[systemd-devel] Failure to remount / ro (Was: Re: [PATCH 2/4] Adding unmount functions to be used in shutdown)
Gustavo Sverzut Barbieri
barbieri at profusion.mobi
Sun Oct 24 09:08:55 PDT 2010
On Sun, Oct 24, 2010 at 2:01 PM, Michael Biebl <mbiebl at gmail.com> wrote:
> 2010/10/24 Gustavo Sverzut Barbieri <barbieri at profusion.mobi>:
>> On Sun, Oct 24, 2010 at 12:41 PM, Michael Biebl <mbiebl at gmail.com> wrote:
>>> Together with fidencio I tracked down the bug which caused / *not* to
>>> be remounted ro on shutdown.
>>>
>>> The relevant code is in src/umount.c
>>>
>>> 2010/10/7 <fidencio at profusion.mobi>:
>>>> +int umount_all(void) {
>>>> + int r;
>>>> + LIST_HEAD(MountPoint, mp_list_head);
>>>> +
>>>> + LIST_HEAD_INIT(MountPoint, mp_list_head);
>>>> +
>>>> + r = mount_points_list_get(&mp_list_head);
>>>> + if (r < 0)
>>>> + goto end;
>>>> +
>>>> + r = mount_points_list_umount(&mp_list_head);
>>>> + if (r <= 0)
>>>> + goto end;
>>>
>>> r is the number of mount points which failed to be unmounted.
>>> We always skip / in mount_points_list_umount though,
>>> I.e. if there is no failed unmount attempt, we will never try to remount / ro.
>>>
>>> Maybe we should just call mount_points_list_remount_read_only unconditionally.
>>> or increment the failed counter in mount_points_list_umount if we skip "/"
>>
>> I guess either we run it unconditionally or we just call the remount
>> of / to "ro" explicitly if r == 0 (clear I guess)
>>
>>
>>
>>> +static int mount_points_list_umount(MountPoint **mount_point_list_head) {
>>> + MountPoint *mp, *mp_next;
>>> + int failed = 0;
>>> +
>>> + LIST_FOREACH_SAFE(mount_point, mp, mp_next, *mount_point_list_head) {
>>> + if (streq(mp->path, "/"))
>>> + continue;
>>> ^ add failed++ to make sure / is remounted-ro?
>>
>> it would be a bit misleading.
>
> Well, not really. Skipping / is just an optimisation as we know that
> unmounting it would fail anyway.
sure, but I guess just making it explicit on the caller side is good
as well, instead of returning a failed state. We can also more easily
know what to return to main loop as r == 0 -> remount / ro -> return
nothing else to do.
--
Gustavo Sverzut Barbieri
http://profusion.mobi embedded systems
--------------------------------------
MSN: barbieri at gmail.com
Skype: gsbarbieri
Mobile: +55 (19) 9225-2202
More information about the systemd-devel
mailing list