diff options
author | Lennart Poettering <lennart@poettering.net> | 2015-05-19 17:19:27 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2015-05-19 17:19:27 +0200 |
commit | 394763f63c1941cafd9d3bf81e8151a2206474a7 (patch) | |
tree | db09def8045fbf573af58948473bf2cafa4b481f /src/core | |
parent | 711e02cb47c7a26f6936ca1b3e49e93ad9cb7696 (diff) |
mount: properly check for mounts currently in /proc/self/mountinfo
http://lists.freedesktop.org/archives/systemd-devel/2015-May/032059.html
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/mount.c | 33 |
1 files changed, 19 insertions, 14 deletions
diff --git a/src/core/mount.c b/src/core/mount.c index c1a9ea5fa0..ba1dcf1e85 100644 --- a/src/core/mount.c +++ b/src/core/mount.c @@ -1698,7 +1698,18 @@ static int mount_dispatch_io(sd_event_source *source, int fd, uint32_t revents, if (!mount->is_mounted) { - /* A mount point is gone */ + /* A mount point is not around right now. It + * might be gone, or might never have + * existed. */ + + if (mount->from_proc_self_mountinfo && + mount->parameters_proc_self_mountinfo.what) { + + /* Remember that this device might just have disappeared */ + if (set_ensure_allocated(&gone, &string_hash_ops) < 0 || + set_put(gone, mount->parameters_proc_self_mountinfo.what) < 0) + log_oom(); /* we don't care too much about OOM here... */ + } mount->from_proc_self_mountinfo = false; @@ -1715,14 +1726,6 @@ static int mount_dispatch_io(sd_event_source *source, int fd, uint32_t revents, break; } - /* Remember that this device might just have disappeared */ - if (mount->parameters_proc_self_mountinfo.what) { - - if (set_ensure_allocated(&gone, &string_hash_ops) < 0 || - set_put(gone, mount->parameters_proc_self_mountinfo.what) < 0) - log_oom(); /* we don't care too much about OOM here... */ - } - } else if (mount->just_mounted || mount->just_changed) { /* A mount point was added or changed */ @@ -1750,13 +1753,15 @@ static int mount_dispatch_io(sd_event_source *source, int fd, uint32_t revents, mount_set_state(mount, mount->state); break; } + } - if (mount->parameters_proc_self_mountinfo.what) { + if (mount->is_mounted && + mount->from_proc_self_mountinfo && + mount->parameters_proc_self_mountinfo.what) { - if (set_ensure_allocated(&around, &string_hash_ops) < 0 || - set_put(around, mount->parameters_proc_self_mountinfo.what) < 0) - log_oom(); - } + if (set_ensure_allocated(&around, &string_hash_ops) < 0 || + set_put(around, mount->parameters_proc_self_mountinfo.what) < 0) + log_oom(); } /* Reset the flags for later calls */ |