1 /* SPDX-License-Identifier: LGPL-2.1+ */
3 This file is part of systemd.
5 Copyright 2010 ProFUSION embedded systems
7 systemd is free software; you can redistribute it and/or modify it
8 under the terms of the GNU Lesser General Public License as published by
9 the Free Software Foundation; either version 2.1 of the License, or
10 (at your option) any later version.
12 systemd is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Lesser General Public License for more details.
17 You should have received a copy of the GNU Lesser General Public License
18 along with systemd; If not, see <http://www.gnu.org/licenses/>.
23 #include <linux/loop.h>
25 #include <sys/mount.h>
30 #include "alloc-util.h"
33 #include "fstab-util.h"
34 #include "linux-3.13/dm-ioctl.h"
36 #include "mount-setup.h"
37 #include "path-util.h"
38 #include "string-util.h"
39 #include "udev-util.h"
41 #include "mount-util.h"
45 typedef struct MountPoint
{
50 LIST_FIELDS(struct MountPoint
, mount_point
);
53 static void mount_point_free(MountPoint
**head
, MountPoint
*m
) {
57 LIST_REMOVE(mount_point
, *head
, m
);
63 static void mount_points_list_free(MountPoint
**head
) {
67 mount_point_free(head
, *head
);
70 static int mount_points_list_get(MountPoint
**head
) {
71 _cleanup_fclose_
FILE *proc_self_mountinfo
= NULL
;
77 proc_self_mountinfo
= fopen("/proc/self/mountinfo", "re");
78 if (!proc_self_mountinfo
)
82 _cleanup_free_
char *path
= NULL
, *options
= NULL
, *type
= NULL
;
87 k
= fscanf(proc_self_mountinfo
,
88 "%*s " /* (1) mount id */
89 "%*s " /* (2) parent id */
90 "%*s " /* (3) major:minor */
92 "%ms " /* (5) mount point */
93 "%*s" /* (6) mount flags */
94 "%*[^-]" /* (7) optional fields */
95 "- " /* (8) separator */
96 "%ms " /* (9) file system type */
97 "%*s" /* (10) mount source */
98 "%ms" /* (11) mount options */
99 "%*[^\n]", /* some rubbish at the end */
100 &path
, &type
, &options
);
105 log_warning("Failed to parse /proc/self/mountinfo:%u.", i
);
109 r
= cunescape(path
, UNESCAPE_RELAX
, &p
);
113 /* Ignore mount points we can't unmount because they
114 * are API or because we are keeping them open (like
115 * /dev/console). Also, ignore all mounts below API
116 * file systems, since they are likely virtual too,
117 * and hence not worth spending time on. Also, in
118 * unprivileged containers we might lack the rights to
119 * unmount these things, hence don't bother. */
120 if (mount_point_is_api(p
) ||
121 mount_point_ignore(p
) ||
122 path_startswith(p
, "/dev") ||
123 path_startswith(p
, "/sys") ||
124 path_startswith(p
, "/proc")) {
129 m
= new0(MountPoint
, 1);
136 m
->options
= options
;
141 LIST_PREPEND(mount_point
, *head
, m
);
147 static int swap_list_get(MountPoint
**head
) {
148 _cleanup_fclose_
FILE *proc_swaps
= NULL
;
154 proc_swaps
= fopen("/proc/swaps", "re");
156 return (errno
== ENOENT
) ? 0 : -errno
;
158 (void) fscanf(proc_swaps
, "%*s %*s %*s %*s %*s\n");
162 _cleanup_free_
char *dev
= NULL
, *d
= NULL
;
165 k
= fscanf(proc_swaps
,
166 "%ms " /* device/file */
167 "%*s " /* type of swap */
168 "%*s " /* swap size */
170 "%*s\n", /* priority */
177 log_warning("Failed to parse /proc/swaps:%u.", i
);
181 if (endswith(dev
, " (deleted)"))
184 r
= cunescape(dev
, UNESCAPE_RELAX
, &d
);
188 swap
= new0(MountPoint
, 1);
192 free_and_replace(swap
->path
, d
);
193 LIST_PREPEND(mount_point
, *head
, swap
);
199 static int loopback_list_get(MountPoint
**head
) {
200 _cleanup_udev_enumerate_unref_
struct udev_enumerate
*e
= NULL
;
201 struct udev_list_entry
*item
= NULL
, *first
= NULL
;
202 _cleanup_udev_unref_
struct udev
*udev
= NULL
;
211 e
= udev_enumerate_new(udev
);
215 r
= udev_enumerate_add_match_subsystem(e
, "block");
219 r
= udev_enumerate_add_match_sysname(e
, "loop*");
223 r
= udev_enumerate_add_match_sysattr(e
, "loop/backing_file", NULL
);
227 r
= udev_enumerate_scan_devices(e
);
231 first
= udev_enumerate_get_list_entry(e
);
232 udev_list_entry_foreach(item
, first
) {
234 _cleanup_udev_device_unref_
struct udev_device
*d
;
238 d
= udev_device_new_from_syspath(udev
, udev_list_entry_get_name(item
));
242 dn
= udev_device_get_devnode(d
);
250 lb
= new0(MountPoint
, 1);
257 LIST_PREPEND(mount_point
, *head
, lb
);
263 static int dm_list_get(MountPoint
**head
) {
264 _cleanup_udev_enumerate_unref_
struct udev_enumerate
*e
= NULL
;
265 struct udev_list_entry
*item
= NULL
, *first
= NULL
;
266 _cleanup_udev_unref_
struct udev
*udev
= NULL
;
275 e
= udev_enumerate_new(udev
);
279 r
= udev_enumerate_add_match_subsystem(e
, "block");
283 r
= udev_enumerate_add_match_sysname(e
, "dm-*");
287 r
= udev_enumerate_scan_devices(e
);
291 first
= udev_enumerate_get_list_entry(e
);
292 udev_list_entry_foreach(item
, first
) {
294 _cleanup_udev_device_unref_
struct udev_device
*d
;
299 d
= udev_device_new_from_syspath(udev
, udev_list_entry_get_name(item
));
303 devnum
= udev_device_get_devnum(d
);
304 dn
= udev_device_get_devnode(d
);
305 if (major(devnum
) == 0 || !dn
)
312 m
= new(MountPoint
, 1);
320 LIST_PREPEND(mount_point
, *head
, m
);
326 static int delete_loopback(const char *device
) {
327 _cleanup_close_
int fd
= -1;
330 fd
= open(device
, O_RDONLY
|O_CLOEXEC
);
332 return errno
== ENOENT
? 0 : -errno
;
334 r
= ioctl(fd
, LOOP_CLR_FD
, 0);
338 /* ENXIO: not bound, so no error */
345 static int delete_dm(dev_t devnum
) {
347 struct dm_ioctl dm
= {
351 DM_VERSION_PATCHLEVEL
353 .data_size
= sizeof(dm
),
357 _cleanup_close_
int fd
= -1;
359 assert(major(devnum
) != 0);
361 fd
= open("/dev/mapper/control", O_RDWR
|O_CLOEXEC
);
365 if (ioctl(fd
, DM_DEV_REMOVE
, &dm
) < 0)
371 static bool nonunmountable_path(const char *path
) {
372 return path_equal(path
, "/")
374 || path_equal(path
, "/usr")
376 || path_startswith(path
, "/run/initramfs");
379 /* This includes remounting readonly, which changes the kernel mount options.
380 * Therefore the list passed to this function is invalidated, and should not be reused. */
382 static int mount_points_list_umount(MountPoint
**head
, bool *changed
, bool log_error
) {
388 LIST_FOREACH(mount_point
, m
, *head
) {
389 bool mount_is_readonly
;
391 mount_is_readonly
= fstab_test_yes_no_option(m
->options
, "ro\0rw\0");
393 /* If we are in a container, don't attempt to
394 read-only mount anything as that brings no real
395 benefits, but might confuse the host, as we remount
396 the superblock here, not the bind mount.
397 If the filesystem is a network fs, also skip the
398 remount. It brings no value (we cannot leave
399 a "dirty fs") and could hang if the network is down.
400 Note that umount2() is more careful and will not
401 hang because of the network being down. */
402 if (detect_container() <= 0 &&
403 !fstype_is_network(m
->type
) &&
404 !mount_is_readonly
) {
405 _cleanup_free_
char *options
= NULL
;
406 /* MS_REMOUNT requires that the data parameter
407 * should be the same from the original mount
408 * except for the desired changes. Since we want
409 * to remount read-only, we should filter out
410 * rw (and ro too, because it confuses the kernel) */
411 (void) fstab_filter_options(m
->options
, "rw\0ro\0", NULL
, NULL
, &options
);
413 /* We always try to remount directories
414 * read-only first, before we go on and umount
417 * Mount points can be stacked. If a mount
418 * point is stacked below / or /usr, we
419 * cannot umount or remount it directly,
420 * since there is no way to refer to the
421 * underlying mount. There's nothing we can do
422 * about it for the general case, but we can
423 * do something about it if it is aliased
424 * somehwere else via a bind mount. If we
425 * explicitly remount the super block of that
426 * alias read-only we hence should be
427 * relatively safe regarding keeping dirty an fs
428 * we cannot otherwise see. */
429 log_info("Remounting '%s' read-only with options '%s'.", m
->path
, options
);
430 if (mount(NULL
, m
->path
, NULL
, MS_REMOUNT
|MS_RDONLY
, options
) < 0) {
432 log_notice_errno(errno
, "Failed to remount '%s' read-only: %m", m
->path
);
433 if (nonunmountable_path(m
->path
))
438 /* Skip / and /usr since we cannot unmount that
439 * anyway, since we are running from it. They have
440 * already been remounted ro. */
441 if (nonunmountable_path(m
->path
))
444 /* Trying to umount. Using MNT_FORCE causes some
445 * filesystems (e.g. FUSE and NFS and other network
446 * filesystems) to abort any pending requests and
447 * return -EIO rather than blocking indefinitely.
448 * If the filesysten is "busy", this may allow processes
449 * to die, thus making the filesystem less busy so
450 * the unmount might succeed (rather then return EBUSY).*/
451 log_info("Unmounting %s.", m
->path
);
452 if (umount2(m
->path
, MNT_FORCE
) == 0) {
457 log_warning_errno(errno
, "Could not unmount %s: %m", m
->path
);
465 static int swap_points_list_off(MountPoint
**head
, bool *changed
) {
471 LIST_FOREACH_SAFE(mount_point
, m
, n
, *head
) {
472 log_info("Deactivating swap %s.", m
->path
);
473 if (swapoff(m
->path
) == 0) {
477 mount_point_free(head
, m
);
479 log_warning_errno(errno
, "Could not deactivate swap %s: %m", m
->path
);
487 static int loopback_points_list_detach(MountPoint
**head
, bool *changed
) {
494 k
= lstat("/", &root_st
);
496 LIST_FOREACH_SAFE(mount_point
, m
, n
, *head
) {
498 struct stat loopback_st
;
501 major(root_st
.st_dev
) != 0 &&
502 lstat(m
->path
, &loopback_st
) >= 0 &&
503 root_st
.st_dev
== loopback_st
.st_rdev
) {
508 log_info("Detaching loopback %s.", m
->path
);
509 r
= delete_loopback(m
->path
);
511 if (r
> 0 && changed
)
514 mount_point_free(head
, m
);
516 log_warning_errno(errno
, "Could not detach loopback %s: %m", m
->path
);
524 static int dm_points_list_detach(MountPoint
**head
, bool *changed
) {
531 r
= get_block_device("/", &rootdev
);
535 LIST_FOREACH_SAFE(mount_point
, m
, n
, *head
) {
537 if (major(rootdev
) != 0)
538 if (rootdev
== m
->devnum
) {
543 log_info("Detaching DM %u:%u.", major(m
->devnum
), minor(m
->devnum
));
544 r
= delete_dm(m
->devnum
);
549 mount_point_free(head
, m
);
551 log_warning_errno(errno
, "Could not detach DM %s: %m", m
->path
);
559 static int umount_all_once(bool *changed
, bool log_error
) {
561 LIST_HEAD(MountPoint
, mp_list_head
);
563 LIST_HEAD_INIT(mp_list_head
);
564 r
= mount_points_list_get(&mp_list_head
);
568 r
= mount_points_list_umount(&mp_list_head
, changed
, log_error
);
571 mount_points_list_free(&mp_list_head
);
576 int umount_all(bool *changed
) {
580 /* retry umount, until nothing can be umounted anymore */
582 umount_changed
= false;
584 umount_all_once(&umount_changed
, false);
587 } while (umount_changed
);
589 /* umount one more time with logging enabled */
590 r
= umount_all_once(&umount_changed
, true);
597 int swapoff_all(bool *changed
) {
599 LIST_HEAD(MountPoint
, swap_list_head
);
601 LIST_HEAD_INIT(swap_list_head
);
603 r
= swap_list_get(&swap_list_head
);
607 r
= swap_points_list_off(&swap_list_head
, changed
);
610 mount_points_list_free(&swap_list_head
);
615 int loopback_detach_all(bool *changed
) {
617 LIST_HEAD(MountPoint
, loopback_list_head
);
619 LIST_HEAD_INIT(loopback_list_head
);
621 r
= loopback_list_get(&loopback_list_head
);
625 r
= loopback_points_list_detach(&loopback_list_head
, changed
);
628 mount_points_list_free(&loopback_list_head
);
633 int dm_detach_all(bool *changed
) {
635 LIST_HEAD(MountPoint
, dm_list_head
);
637 LIST_HEAD_INIT(dm_list_head
);
639 r
= dm_list_get(&dm_list_head
);
643 r
= dm_points_list_detach(&dm_list_head
, changed
);
646 mount_points_list_free(&dm_list_head
);