diff --git a/src/basic/fs-util.c b/src/basic/fs-util.c index 127f709cd9c..62c7954c843 100644 --- a/src/basic/fs-util.c +++ b/src/basic/fs-util.c @@ -1484,6 +1484,30 @@ int fsync_path_at(int at_fd, const char *path) { return 0; } +int fsync_parent_at(int at_fd, const char *path) { + _cleanup_close_ int opened_fd = -1; + + if (isempty(path)) { + if (at_fd != AT_FDCWD) + return fsync_directory_of_file(at_fd); + + opened_fd = open("..", O_RDONLY|O_DIRECTORY|O_CLOEXEC); + if (opened_fd < 0) + return -errno; + + if (fsync(opened_fd) < 0) + return -errno; + + return 0; + } + + opened_fd = openat(at_fd, path, O_PATH|O_CLOEXEC|O_NOFOLLOW); + if (opened_fd < 0) + return -errno; + + return fsync_directory_of_file(opened_fd); +} + int syncfs_path(int atfd, const char *path) { _cleanup_close_ int fd = -1; diff --git a/src/basic/fs-util.h b/src/basic/fs-util.h index 7f15b558ca8..c4ab98dbb4e 100644 --- a/src/basic/fs-util.h +++ b/src/basic/fs-util.h @@ -140,6 +140,7 @@ int unlinkat_deallocate(int fd, const char *name, UnlinkDeallocateFlags flags); int fsync_directory_of_file(int fd); int fsync_full(int fd); int fsync_path_at(int at_fd, const char *path); +int fsync_parent_at(int at_fd, const char *path); int syncfs_path(int atfd, const char *path);