mirror of
https://github.com/systemd/systemd.git
synced 2024-12-23 21:35:11 +03:00
journal: when creating a new journal file, fsync() the directory it is created in too
Fixes: #2831
This commit is contained in:
parent
6809de5bb1
commit
a0fe2a2d20
@ -361,8 +361,14 @@ bool fdname_is_valid(const char *s) {
|
|||||||
|
|
||||||
int fd_get_path(int fd, char **ret) {
|
int fd_get_path(int fd, char **ret) {
|
||||||
char procfs_path[strlen("/proc/self/fd/") + DECIMAL_STR_MAX(int)];
|
char procfs_path[strlen("/proc/self/fd/") + DECIMAL_STR_MAX(int)];
|
||||||
|
int r;
|
||||||
|
|
||||||
xsprintf(procfs_path, "/proc/self/fd/%i", fd);
|
xsprintf(procfs_path, "/proc/self/fd/%i", fd);
|
||||||
|
|
||||||
return readlink_malloc(procfs_path, ret);
|
r = readlink_malloc(procfs_path, ret);
|
||||||
|
|
||||||
|
if (r == -ENOENT) /* If the file doesn't exist the fd is invalid */
|
||||||
|
return -EBADF;
|
||||||
|
|
||||||
|
return r;
|
||||||
}
|
}
|
||||||
|
@ -439,6 +439,39 @@ static int journal_file_init_header(JournalFile *f, JournalFile *template) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int fsync_directory_of_file(int fd) {
|
||||||
|
_cleanup_free_ char *path = NULL, *dn = NULL;
|
||||||
|
_cleanup_close_ int dfd = -1;
|
||||||
|
struct stat st;
|
||||||
|
int r;
|
||||||
|
|
||||||
|
if (fstat(fd, &st) < 0)
|
||||||
|
return -errno;
|
||||||
|
|
||||||
|
if (!S_ISREG(st.st_mode))
|
||||||
|
return -EBADFD;
|
||||||
|
|
||||||
|
r = fd_get_path(fd, &path);
|
||||||
|
if (r < 0)
|
||||||
|
return r;
|
||||||
|
|
||||||
|
if (!path_is_absolute(path))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
dn = dirname_malloc(path);
|
||||||
|
if (!dn)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
dfd = open(dn, O_RDONLY|O_CLOEXEC|O_DIRECTORY);
|
||||||
|
if (dfd < 0)
|
||||||
|
return -errno;
|
||||||
|
|
||||||
|
if (fsync(dfd) < 0)
|
||||||
|
return -errno;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int journal_file_refresh_header(JournalFile *f) {
|
static int journal_file_refresh_header(JournalFile *f) {
|
||||||
sd_id128_t boot_id;
|
sd_id128_t boot_id;
|
||||||
int r;
|
int r;
|
||||||
@ -464,6 +497,9 @@ static int journal_file_refresh_header(JournalFile *f) {
|
|||||||
/* Sync the online state to disk */
|
/* Sync the online state to disk */
|
||||||
(void) fsync(f->fd);
|
(void) fsync(f->fd);
|
||||||
|
|
||||||
|
/* We likely just created a new file, also sync the directory this file is located in. */
|
||||||
|
(void) fsync_directory_of_file(f->fd);
|
||||||
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user