From cde9cb343ae101660dd36992cae730b63c7cd617 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Sat, 25 Aug 2012 00:10:17 +0200 Subject: [PATCH 1/1] util: make path_is_mount_point() recognize bind mounts, too --- TODO | 6 +++--- src/shared/path-util.c | 23 ++++++++++++++++------- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/TODO b/TODO index 9fa240cc4..9a888eccf 100644 --- a/TODO +++ b/TODO @@ -49,11 +49,11 @@ Bugfixes: Features: -* introduce $container_boot_id +* introduce /run/kmsg in containers? -* wall messages for shutdown should move to logind +* introduce $container_boot_id? -* remove wants from journald.service +* wall messages for shutdown should move to logind * allow writing multiple conditions in unit files on one line diff --git a/src/shared/path-util.c b/src/shared/path-util.c index 8bc795502..2bdbd22dc 100644 --- a/src/shared/path-util.c +++ b/src/shared/path-util.c @@ -330,15 +330,22 @@ bool path_equal(const char *a, const char *b) { } int path_is_mount_point(const char *t, bool allow_symlink) { - struct stat a, b; char *parent; int r; + struct file_handle *h; + int mount_id, mount_id_parent; - if (allow_symlink) - r = stat(t, &a); - else - r = lstat(t, &a); + /* We are not actually interested in the file handles, but + * name_to_handle_at() also passes us the mount ID, hence use + * it but throw the handle away */ + + if (path_equal(t, "/")) + return 1; + h = alloca(MAX_HANDLE_SZ); + h->handle_bytes = MAX_HANDLE_SZ; + + r = name_to_handle_at(AT_FDCWD, t, h, &mount_id, allow_symlink ? AT_SYMLINK_FOLLOW : 0); if (r < 0) { if (errno == ENOENT) return 0; @@ -350,13 +357,15 @@ int path_is_mount_point(const char *t, bool allow_symlink) { if (r < 0) return r; - r = lstat(parent, &b); + h->handle_bytes = MAX_HANDLE_SZ; + r = name_to_handle_at(AT_FDCWD, parent, h, &mount_id_parent, 0); free(parent); if (r < 0) return -errno; - return a.st_dev != b.st_dev; + + return mount_id != mount_id_parent; } int path_is_read_only_fs(const char *path) { -- 2.30.2