X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fjournal%2Fjournal-vacuum.c;fp=src%2Fjournal%2Fjournal-vacuum.c;h=79572f1fb6df556e25d09075afa5b5b265757462;hb=9d64774057400ee15e7ffb159294f73bb665eb84;hp=1ddb043e2cd13ccc0bbf4a70984455752382d1fe;hpb=670b110c3b59dfa335ac43065b2038400d1d04a9;p=elogind.git diff --git a/src/journal/journal-vacuum.c b/src/journal/journal-vacuum.c index 1ddb043e2..79572f1fb 100644 --- a/src/journal/journal-vacuum.c +++ b/src/journal/journal-vacuum.c @@ -128,6 +128,24 @@ static void patch_realtime( #endif } +static int journal_file_empty(int dir_fd, const char *name) { + int fd, r; + le64_t n_entries; + + fd = openat(dir_fd, name, O_RDONLY|O_CLOEXEC|O_NOFOLLOW|O_NONBLOCK); + if (fd < 0) + return -errno; + + if (lseek(fd, offsetof(Header, n_entries), SEEK_SET) < 0) + return -errno; + + r = read(fd, &n_entries, sizeof(n_entries)); + if (r != sizeof(n_entries)) + return r == 0 ? -EINVAL : -errno; + + return le64toh(n_entries) == 0; +} + int journal_directory_vacuum( const char *directory, uint64_t max_use, @@ -247,6 +265,17 @@ int journal_directory_vacuum( /* We do not vacuum active files or unknown files! */ continue; + if (journal_file_empty(dirfd(d), de->d_name)) { + + /* Always vacuum empty non-online files. */ + + if (unlinkat(dirfd(d), de->d_name, 0) >= 0) + log_debug("Deleted empty journal %s/%s.", directory, de->d_name); + else if (errno != ENOENT) + log_warning("Failed to delete %s/%s: %m", directory, de->d_name); + continue; + } + patch_realtime(directory, de->d_name, &st, &realtime); GREEDY_REALLOC(list, n_allocated, n_list + 1);