X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fumount.c;h=6fe0a26dd413278ae704e1037b0466abcdc04429;hb=e03ae6615a1fe9a2aee854d00c3fc7397a06983d;hp=2ae8f86ecd103cc98ff01dee344343a2f7a5c1f7;hpb=57f2a956e63d6b981b9d6277ab800ad4ad386f42;p=elogind.git diff --git a/src/umount.c b/src/umount.c index 2ae8f86ec..6fe0a26dd 100644 --- a/src/umount.c +++ b/src/umount.c @@ -355,7 +355,7 @@ static int delete_loopback(const char *device) { int fd, r; if ((fd = open(device, O_RDONLY|O_CLOEXEC)) < 0) - return -errno; + return errno == ENOENT ? 0 : -errno; r = ioctl(fd, LOOP_CLR_FD, 0); close_nointr_nofail(fd); @@ -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)