summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2011-01-06 19:10:17 +0100
committerLennart Poettering <lennart@poettering.net>2011-01-06 19:10:17 +0100
commit7fc942b29e7bdb9d6aa3123f53da6680edabd8f0 (patch)
tree42f9b679fc66ad5aa3375a75a793d0a8930c9018
parent35f10fccb06a0c7b4f26a28746db387aac376cb3 (diff)
downloadsystemd-7fc942b29e7bdb9d6aa3123f53da6680edabd8f0.tar.gz
umount: don't try to detach the dm device the root dir is on, to minimize warning messages
-rw-r--r--src/umount.c26
1 files changed, 24 insertions, 2 deletions
diff --git a/src/umount.c b/src/umount.c
index 2ae8f86ecd..4fd6b22ad7 100644
--- a/src/umount.c
+++ b/src/umount.c
@@ -466,12 +466,24 @@ static int swap_points_list_off(MountPoint **head, bool *changed) {
static int loopback_points_list_detach(MountPoint **head, bool *changed) {
MountPoint *m, *n;
- int n_failed = 0;
+ int n_failed = 0, k;
+ struct stat root_st;
assert(head);
+ k = lstat("/", &root_st);
+
LIST_FOREACH_SAFE(mount_point, m, n, *head) {
int r;
+ struct stat loopback_st;
+
+ if (k >= 0 &&
+ major(root_st.st_dev) != 0 &&
+ lstat(m->path, &loopback_st) >= 0 &&
+ root_st.st_dev == loopback_st.st_rdev) {
+ n_failed ++;
+ continue;
+ }
if ((r = delete_loopback(m->path)) >= 0) {
@@ -490,13 +502,23 @@ static int loopback_points_list_detach(MountPoint **head, bool *changed) {
static int dm_points_list_detach(MountPoint **head, bool *changed) {
MountPoint *m, *n;
- int n_failed = 0;
+ int n_failed = 0, k;
+ struct stat root_st;
assert(head);
+ k = lstat("/", &root_st);
+
LIST_FOREACH_SAFE(mount_point, m, n, *head) {
int r;
+ if (k >= 0 &&
+ major(root_st.st_dev) != 0 &&
+ root_st.st_dev == m->devnum) {
+ n_failed ++;
+ continue;
+ }
+
if ((r = delete_dm(m->devnum)) >= 0) {
if (r > 0 && changed)