mirror of
https://github.com/systemd/systemd.git
synced 2024-12-25 01:34:28 +03:00
Merge pull request #12822 from poettering/tmpfiles-is-mount-point
tmpfiles: use common fd_is_mount_point() implementation
This commit is contained in:
commit
a057135bce
@ -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,13 +525,19 @@ 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 = strjoin(p, "/", dent->d_name);
|
||||
sub_path = path_join(p, dent->d_name);
|
||||
if (!sub_path) {
|
||||
r = log_oom();
|
||||
goto finish;
|
||||
@ -656,14 +630,16 @@ static int dir_cleanup(
|
||||
continue;
|
||||
}
|
||||
|
||||
if (mountpoint && S_ISREG(s.st_mode))
|
||||
if (s.st_uid == 0 && STR_IN_SET(dent->d_name,
|
||||
".journal",
|
||||
"aquota.user",
|
||||
"aquota.group")) {
|
||||
log_debug("Skipping \"%s\".", sub_path);
|
||||
continue;
|
||||
}
|
||||
if (mountpoint &&
|
||||
S_ISREG(s.st_mode) &&
|
||||
s.st_uid == 0 &&
|
||||
STR_IN_SET(dent->d_name,
|
||||
".journal",
|
||||
"aquota.user",
|
||||
"aquota.group")) {
|
||||
log_debug("Skipping \"%s\".", sub_path);
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Ignore sockets that are listed in /proc/net/unix */
|
||||
if (S_ISSOCK(s.st_mode) && unix_socket_alive(sub_path)) {
|
||||
|
Loading…
Reference in New Issue
Block a user