diff options
author | Lennart Poettering <lennart@poettering.net> | 2019-06-18 12:42:30 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2019-06-18 12:42:30 +0200 |
commit | 60bdc0ca225534c695190e24e016fea7324919d8 (patch) | |
tree | d7bc41705d143f443f078f787544fa117ea6efa5 /src/tmpfiles/tmpfiles.c | |
parent | 20b6bb9560e6e9afb2688faea5324e8d192666be (diff) | |
download | systemd-60bdc0ca225534c695190e24e016fea7324919d8.tar.gz |
tmpfiles: use common fd_is_mount_point() implementation in tmpfiles.c
No need to have a private reimplementation here. Let's just use the
common one, which supports "fdinfo" as fallback.
Diffstat (limited to 'src/tmpfiles/tmpfiles.c')
-rw-r--r-- | src/tmpfiles/tmpfiles.c | 46 |
1 files changed, 10 insertions, 36 deletions
diff --git a/src/tmpfiles/tmpfiles.c b/src/tmpfiles/tmpfiles.c index 321edb3034..b859d94b92 100644 --- a/src/tmpfiles/tmpfiles.c +++ b/src/tmpfiles/tmpfiles.c @@ -461,38 +461,6 @@ static bool unix_socket_alive(const char *fn) { return !!set_get(unix_sockets, (char*) fn); } -static int dir_is_mount_point(DIR *d, const char *subdir) { - - int mount_id_parent, mount_id; - int r_p, r; - - r_p = name_to_handle_at_loop(dirfd(d), ".", NULL, &mount_id_parent, 0); - if (r_p < 0) - r_p = -errno; - - r = name_to_handle_at_loop(dirfd(d), subdir, NULL, &mount_id, 0); - if (r < 0) - r = -errno; - - /* got no handle; make no assumptions, return error */ - if (r_p < 0 && r < 0) - return r_p; - - /* got both handles; if they differ, it is a mount point */ - if (r_p >= 0 && r >= 0) - return mount_id_parent != mount_id; - - /* got only one handle; assume different mount points if one - * of both queries was not supported by the filesystem */ - if (IN_SET(r_p, -ENOSYS, -EOPNOTSUPP) || IN_SET(r, -ENOSYS, -EOPNOTSUPP)) - return true; - - /* return error */ - if (r_p < 0) - return r_p; - return r; -} - static DIR* xopendirat_nomod(int dirfd, const char *path) { DIR *dir; @@ -557,10 +525,16 @@ static int dir_cleanup( /* Try to detect bind mounts of the same filesystem instance; they * do not differ in device major/minors. This type of query is not * supported on all kernels or filesystem types though. */ - if (S_ISDIR(s.st_mode) && dir_is_mount_point(d, dent->d_name) > 0) { - log_debug("Ignoring \"%s/%s\": different mount of the same filesystem.", - p, dent->d_name); - continue; + if (S_ISDIR(s.st_mode)) { + int q; + + q = fd_is_mount_point(dirfd(d), dent->d_name, 0); + if (q < 0) + log_debug_errno(q, "Failed to determine whether \"%s/%s\" is a mount point, ignoring: %m", p, dent->d_name); + else if (q > 0) { + log_debug("Ignoring \"%s/%s\": different mount of the same filesystem.", p, dent->d_name); + continue; + } } sub_path = path_join(p, dent->d_name); |