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:
parent
1d82e6b3ed
commit
9cbc454770
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user