1
0
mirror of https://github.com/systemd/systemd.git synced 2025-01-12 13:18:14 +03:00

shutdown: don't remount,ro network filesystems. (#6588)

systemd-shutdown is run after the network is stopped,
so remounting a network filesystem read-only can hang.
A simple umount is the most useful thing that can
be done for a network filesystem once the network is down.
This commit is contained in:
NeilBrown 2017-08-31 02:48:25 +10:00 committed by Lennart Poettering
parent 1d82e6b3ed
commit 9cbc454770

View File

@ -37,12 +37,14 @@
#include "string-util.h" #include "string-util.h"
#include "udev-util.h" #include "udev-util.h"
#include "umount.h" #include "umount.h"
#include "mount-util.h"
#include "util.h" #include "util.h"
#include "virt.h" #include "virt.h"
typedef struct MountPoint { typedef struct MountPoint {
char *path; char *path;
char *options; char *options;
char *type;
dev_t devnum; dev_t devnum;
LIST_FIELDS(struct MountPoint, mount_point); LIST_FIELDS(struct MountPoint, mount_point);
} MountPoint; } MountPoint;
@ -76,7 +78,7 @@ static int mount_points_list_get(MountPoint **head) {
return -errno; return -errno;
for (i = 1;; i++) { for (i = 1;; i++) {
_cleanup_free_ char *path = NULL, *options = NULL; _cleanup_free_ char *path = NULL, *options = NULL, *type = NULL;
char *p = NULL; char *p = NULL;
MountPoint *m; MountPoint *m;
int k; int k;
@ -90,11 +92,11 @@ static int mount_points_list_get(MountPoint **head) {
"%*s" /* (6) mount flags */ "%*s" /* (6) mount flags */
"%*[^-]" /* (7) optional fields */ "%*[^-]" /* (7) optional fields */
"- " /* (8) separator */ "- " /* (8) separator */
"%*s " /* (9) file system type */ "%ms " /* (9) file system type */
"%*s" /* (10) mount source */ "%*s" /* (10) mount source */
"%ms" /* (11) mount options */ "%ms" /* (11) mount options */
"%*[^\n]", /* some rubbish at the end */ "%*[^\n]", /* some rubbish at the end */
&path, &options); &path, &type, &options);
if (k != 2) { if (k != 2) {
if (k == EOF) if (k == EOF)
break; break;
@ -132,6 +134,8 @@ static int mount_points_list_get(MountPoint **head) {
m->path = p; m->path = p;
m->options = options; m->options = options;
options = NULL; options = NULL;
m->type = type;
type = NULL;
LIST_PREPEND(mount_point, *head, m); LIST_PREPEND(mount_point, *head, m);
} }
@ -388,8 +392,12 @@ static int mount_points_list_umount(MountPoint **head, bool *changed, bool log_e
/* If we are in a container, don't attempt to /* If we are in a container, don't attempt to
read-only mount anything as that brings no real read-only mount anything as that brings no real
benefits, but might confuse the host, as we remount benefits, but might confuse the host, as we remount
the superblock here, not the bind mount. */ the superblock here, not the bind mount.
if (detect_container() <= 0) { If the filesystem is a network fs, also skip the
remount. It brings no value (we cannot leave
a "dirty fs") and could hang if the network is down. */
if (detect_container() <= 0 &&
!fstype_is_network(m->type)) {
_cleanup_free_ char *options = NULL; _cleanup_free_ char *options = NULL;
/* MS_REMOUNT requires that the data parameter /* MS_REMOUNT requires that the data parameter
* should be the same from the original mount * should be the same from the original mount