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 char *dev
= NULL
, *d
;
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
);
182 if (endswith(dev
, " (deleted)")) {
187 r
= cunescape(dev
, UNESCAPE_RELAX
, &d
);
192 swap
= new0(MountPoint
, 1);
199 LIST_PREPEND(mount_point
, *head
, swap
);
205 static int loopback_list_get(MountPoint
**head
) {
206 _cleanup_udev_enumerate_unref_
struct udev_enumerate
*e
= NULL
;
207 struct udev_list_entry
*item
= NULL
, *first
= NULL
;
208 _cleanup_udev_unref_
struct udev
*udev
= NULL
;
217 e
= udev_enumerate_new(udev
);
221 r
= udev_enumerate_add_match_subsystem(e
, "block");
225 r
= udev_enumerate_add_match_sysname(e
, "loop*");
229 r
= udev_enumerate_add_match_sysattr(e
, "loop/backing_file", NULL
);
233 r
= udev_enumerate_scan_devices(e
);
237 first
= udev_enumerate_get_list_entry(e
);
238 udev_list_entry_foreach(item
, first
) {
240 _cleanup_udev_device_unref_
struct udev_device
*d
;
244 d
= udev_device_new_from_syspath(udev
, udev_list_entry_get_name(item
));
248 dn
= udev_device_get_devnode(d
);
256 lb
= new0(MountPoint
, 1);
263 LIST_PREPEND(mount_point
, *head
, lb
);
269 static int dm_list_get(MountPoint
**head
) {
270 _cleanup_udev_enumerate_unref_
struct udev_enumerate
*e
= NULL
;
271 struct udev_list_entry
*item
= NULL
, *first
= NULL
;
272 _cleanup_udev_unref_
struct udev
*udev
= NULL
;
281 e
= udev_enumerate_new(udev
);
285 r
= udev_enumerate_add_match_subsystem(e
, "block");
289 r
= udev_enumerate_add_match_sysname(e
, "dm-*");
293 r
= udev_enumerate_scan_devices(e
);
297 first
= udev_enumerate_get_list_entry(e
);
298 udev_list_entry_foreach(item
, first
) {
300 _cleanup_udev_device_unref_
struct udev_device
*d
;
305 d
= udev_device_new_from_syspath(udev
, udev_list_entry_get_name(item
));
309 devnum
= udev_device_get_devnum(d
);
310 dn
= udev_device_get_devnode(d
);
311 if (major(devnum
) == 0 || !dn
)
318 m
= new(MountPoint
, 1);
326 LIST_PREPEND(mount_point
, *head
, m
);
332 static int delete_loopback(const char *device
) {
333 _cleanup_close_
int fd
= -1;
336 fd
= open(device
, O_RDONLY
|O_CLOEXEC
);
338 return errno
== ENOENT
? 0 : -errno
;
340 r
= ioctl(fd
, LOOP_CLR_FD
, 0);
344 /* ENXIO: not bound, so no error */
351 static int delete_dm(dev_t devnum
) {
353 struct dm_ioctl dm
= {
357 DM_VERSION_PATCHLEVEL
359 .data_size
= sizeof(dm
),
363 _cleanup_close_
int fd
= -1;
365 assert(major(devnum
) != 0);
367 fd
= open("/dev/mapper/control", O_RDWR
|O_CLOEXEC
);
371 if (ioctl(fd
, DM_DEV_REMOVE
, &dm
) < 0)
377 static bool nonunmountable_path(const char *path
) {
378 return path_equal(path
, "/")
380 || path_equal(path
, "/usr")
382 || path_startswith(path
, "/run/initramfs");
385 /* This includes remounting readonly, which changes the kernel mount options.
386 * Therefore the list passed to this function is invalidated, and should not be reused. */
388 static int mount_points_list_umount(MountPoint
**head
, bool *changed
, bool log_error
) {
394 LIST_FOREACH(mount_point
, m
, *head
) {
395 bool mount_is_readonly
;
397 mount_is_readonly
= fstab_test_yes_no_option(m
->options
, "ro\0rw\0");
399 /* If we are in a container, don't attempt to
400 read-only mount anything as that brings no real
401 benefits, but might confuse the host, as we remount
402 the superblock here, not the bind mount.
403 If the filesystem is a network fs, also skip the
404 remount. It brings no value (we cannot leave
405 a "dirty fs") and could hang if the network is down.
406 Note that umount2() is more careful and will not
407 hang because of the network being down. */
408 if (detect_container() <= 0 &&
409 !fstype_is_network(m
->type
) &&
410 !mount_is_readonly
) {
411 _cleanup_free_
char *options
= NULL
;
412 /* MS_REMOUNT requires that the data parameter
413 * should be the same from the original mount
414 * except for the desired changes. Since we want
415 * to remount read-only, we should filter out
416 * rw (and ro too, because it confuses the kernel) */
417 (void) fstab_filter_options(m
->options
, "rw\0ro\0", NULL
, NULL
, &options
);
419 /* We always try to remount directories
420 * read-only first, before we go on and umount
423 * Mount points can be stacked. If a mount
424 * point is stacked below / or /usr, we
425 * cannot umount or remount it directly,
426 * since there is no way to refer to the
427 * underlying mount. There's nothing we can do
428 * about it for the general case, but we can
429 * do something about it if it is aliased
430 * somehwere else via a bind mount. If we
431 * explicitly remount the super block of that
432 * alias read-only we hence should be
433 * relatively safe regarding keeping dirty an fs
434 * we cannot otherwise see. */
435 log_info("Remounting '%s' read-only with options '%s'.", m
->path
, options
);
436 if (mount(NULL
, m
->path
, NULL
, MS_REMOUNT
|MS_RDONLY
, options
) < 0) {
438 log_notice_errno(errno
, "Failed to remount '%s' read-only: %m", m
->path
);
439 if (nonunmountable_path(m
->path
))
444 /* Skip / and /usr since we cannot unmount that
445 * anyway, since we are running from it. They have
446 * already been remounted ro. */
447 if (nonunmountable_path(m
->path
))
450 /* Trying to umount. Using MNT_FORCE causes some
451 * filesystems (e.g. FUSE and NFS and other network
452 * filesystems) to abort any pending requests and
453 * return -EIO rather than blocking indefinitely.
454 * If the filesysten is "busy", this may allow processes
455 * to die, thus making the filesystem less busy so
456 * the unmount might succeed (rather then return EBUSY).*/
457 log_info("Unmounting %s.", m
->path
);
458 if (umount2(m
->path
, MNT_FORCE
) == 0) {
463 log_warning_errno(errno
, "Could not unmount %s: %m", m
->path
);
471 static int swap_points_list_off(MountPoint
**head
, bool *changed
) {
477 LIST_FOREACH_SAFE(mount_point
, m
, n
, *head
) {
478 log_info("Deactivating swap %s.", m
->path
);
479 if (swapoff(m
->path
) == 0) {
483 mount_point_free(head
, m
);
485 log_warning_errno(errno
, "Could not deactivate swap %s: %m", m
->path
);
493 static int loopback_points_list_detach(MountPoint
**head
, bool *changed
) {
500 k
= lstat("/", &root_st
);
502 LIST_FOREACH_SAFE(mount_point
, m
, n
, *head
) {
504 struct stat loopback_st
;
507 major(root_st
.st_dev
) != 0 &&
508 lstat(m
->path
, &loopback_st
) >= 0 &&
509 root_st
.st_dev
== loopback_st
.st_rdev
) {
514 log_info("Detaching loopback %s.", m
->path
);
515 r
= delete_loopback(m
->path
);
517 if (r
> 0 && changed
)
520 mount_point_free(head
, m
);
522 log_warning_errno(errno
, "Could not detach loopback %s: %m", m
->path
);
530 static int dm_points_list_detach(MountPoint
**head
, bool *changed
) {
537 r
= get_block_device("/", &rootdev
);
541 LIST_FOREACH_SAFE(mount_point
, m
, n
, *head
) {
543 if (major(rootdev
) != 0)
544 if (rootdev
== m
->devnum
) {
549 log_info("Detaching DM %u:%u.", major(m
->devnum
), minor(m
->devnum
));
550 r
= delete_dm(m
->devnum
);
555 mount_point_free(head
, m
);
557 log_warning_errno(errno
, "Could not detach DM %s: %m", m
->path
);
565 static int umount_all_once(bool *changed
, bool log_error
) {
567 LIST_HEAD(MountPoint
, mp_list_head
);
569 LIST_HEAD_INIT(mp_list_head
);
570 r
= mount_points_list_get(&mp_list_head
);
574 r
= mount_points_list_umount(&mp_list_head
, changed
, log_error
);
577 mount_points_list_free(&mp_list_head
);
582 int umount_all(bool *changed
) {
586 /* retry umount, until nothing can be umounted anymore */
588 umount_changed
= false;
590 umount_all_once(&umount_changed
, false);
593 } while (umount_changed
);
595 /* umount one more time with logging enabled */
596 r
= umount_all_once(&umount_changed
, true);
603 int swapoff_all(bool *changed
) {
605 LIST_HEAD(MountPoint
, swap_list_head
);
607 LIST_HEAD_INIT(swap_list_head
);
609 r
= swap_list_get(&swap_list_head
);
613 r
= swap_points_list_off(&swap_list_head
, changed
);
616 mount_points_list_free(&swap_list_head
);
621 int loopback_detach_all(bool *changed
) {
623 LIST_HEAD(MountPoint
, loopback_list_head
);
625 LIST_HEAD_INIT(loopback_list_head
);
627 r
= loopback_list_get(&loopback_list_head
);
631 r
= loopback_points_list_detach(&loopback_list_head
, changed
);
634 mount_points_list_free(&loopback_list_head
);
639 int dm_detach_all(bool *changed
) {
641 LIST_HEAD(MountPoint
, dm_list_head
);
643 LIST_HEAD_INIT(dm_list_head
);
645 r
= dm_list_get(&dm_list_head
);
649 r
= dm_points_list_detach(&dm_list_head
, changed
);
652 mount_points_list_free(&dm_list_head
);