From: Yu Watanabe Date: Thu, 28 Sep 2023 00:38:59 +0000 (+0900) Subject: mmap-cache: modernize mmap_cache_add_fd() X-Git-Tag: v255-rc1~338^2~3 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=8926a6a4672b2adb8b6535c66d3fe08b48c6d3c9;p=thirdparty%2Fsystemd.git mmap-cache: modernize mmap_cache_add_fd() - use hashmap_ensure_put(), - use _cleanup_free_ attribute, - use structured initializer. --- diff --git a/src/libsystemd/sd-journal/journal-file.c b/src/libsystemd/sd-journal/journal-file.c index 5d3f85e4cc3..66258795267 100644 --- a/src/libsystemd/sd-journal/journal-file.c +++ b/src/libsystemd/sd-journal/journal-file.c @@ -4030,11 +4030,9 @@ int journal_file_open( newly_created = f->last_stat.st_size == 0 && journal_file_writable(f); } - f->cache_fd = mmap_cache_add_fd(mmap_cache, f->fd, mmap_prot_from_open_flags(open_flags)); - if (!f->cache_fd) { - r = -ENOMEM; + r = mmap_cache_add_fd(mmap_cache, f->fd, mmap_prot_from_open_flags(open_flags), &f->cache_fd); + if (r < 0) goto fail; - } if (newly_created) { (void) journal_file_warn_btrfs(f); diff --git a/src/libsystemd/sd-journal/journal-verify.c b/src/libsystemd/sd-journal/journal-verify.c index 8232f53eb66..cdfe7a1a6aa 100644 --- a/src/libsystemd/sd-journal/journal-verify.c +++ b/src/libsystemd/sd-journal/journal-verify.c @@ -875,21 +875,21 @@ int journal_file_verify( } m = mmap_cache_fd_cache(f->cache_fd); - cache_data_fd = mmap_cache_add_fd(m, data_fd, PROT_READ|PROT_WRITE); - if (!cache_data_fd) { - r = log_oom(); + r = mmap_cache_add_fd(m, data_fd, PROT_READ|PROT_WRITE, &cache_data_fd); + if (r < 0) { + log_error_errno(r, "Failed to cache data file: %m"); goto fail; } - cache_entry_fd = mmap_cache_add_fd(m, entry_fd, PROT_READ|PROT_WRITE); - if (!cache_entry_fd) { - r = log_oom(); + r = mmap_cache_add_fd(m, entry_fd, PROT_READ|PROT_WRITE, &cache_entry_fd); + if (r < 0) { + log_error_errno(r, "Failed to cache entry file: %m"); goto fail; } - cache_entry_array_fd = mmap_cache_add_fd(m, entry_array_fd, PROT_READ|PROT_WRITE); - if (!cache_entry_array_fd) { - r = log_oom(); + r = mmap_cache_add_fd(m, entry_array_fd, PROT_READ|PROT_WRITE, &cache_entry_array_fd); + if (r < 0) { + log_error_errno(r, "Failed to cache entry array file: %m"); goto fail; } diff --git a/src/libsystemd/sd-journal/mmap-cache.c b/src/libsystemd/sd-journal/mmap-cache.c index 73f5a116205..6c2c26fde80 100644 --- a/src/libsystemd/sd-journal/mmap-cache.c +++ b/src/libsystemd/sd-journal/mmap-cache.c @@ -541,34 +541,42 @@ bool mmap_cache_fd_got_sigbus(MMapFileDescriptor *f) { return f->sigbus; } -MMapFileDescriptor* mmap_cache_add_fd(MMapCache *m, int fd, int prot) { - MMapFileDescriptor *f; +int mmap_cache_add_fd(MMapCache *m, int fd, int prot, MMapFileDescriptor **ret) { + _cleanup_free_ MMapFileDescriptor *f = NULL; + MMapFileDescriptor *existing; int r; assert(m); assert(fd >= 0); - f = hashmap_get(m->fds, FD_TO_PTR(fd)); - if (f) - return f; - - r = hashmap_ensure_allocated(&m->fds, NULL); - if (r < 0) - return NULL; + existing = hashmap_get(m->fds, FD_TO_PTR(fd)); + if (existing) { + if (ret) + *ret = existing; + return 0; + } - f = new0(MMapFileDescriptor, 1); + f = new(MMapFileDescriptor, 1); if (!f) - return NULL; + return -ENOMEM; + + *f = (MMapFileDescriptor) { + .fd = fd, + .prot = prot, + }; - r = hashmap_put(m->fds, FD_TO_PTR(fd), f); + r = hashmap_ensure_put(&m->fds, NULL, FD_TO_PTR(fd), f); if (r < 0) - return mfree(f); + return r; + assert(r > 0); f->cache = mmap_cache_ref(m); - f->fd = fd; - f->prot = prot; - return f; + if (ret) + *ret = f; + + TAKE_PTR(f); + return 1; } void mmap_cache_fd_free(MMapFileDescriptor *f) { diff --git a/src/libsystemd/sd-journal/mmap-cache.h b/src/libsystemd/sd-journal/mmap-cache.h index 4769414ded3..5d01efd1868 100644 --- a/src/libsystemd/sd-journal/mmap-cache.h +++ b/src/libsystemd/sd-journal/mmap-cache.h @@ -23,7 +23,7 @@ int mmap_cache_fd_get( size_t size, struct stat *st, void **ret); -MMapFileDescriptor* mmap_cache_add_fd(MMapCache *m, int fd, int prot); +int mmap_cache_add_fd(MMapCache *m, int fd, int prot, MMapFileDescriptor **ret); MMapCache* mmap_cache_fd_cache(MMapFileDescriptor *f); void mmap_cache_fd_free(MMapFileDescriptor *f); diff --git a/src/libsystemd/sd-journal/test-mmap-cache.c b/src/libsystemd/sd-journal/test-mmap-cache.c index bc063381b2b..73c0b99978c 100644 --- a/src/libsystemd/sd-journal/test-mmap-cache.c +++ b/src/libsystemd/sd-journal/test-mmap-cache.c @@ -23,7 +23,7 @@ int main(int argc, char *argv[]) { assert_se(x >= 0); (void) unlink(px); - assert_se(fx = mmap_cache_add_fd(m, x, PROT_READ)); + assert_se(mmap_cache_add_fd(m, x, PROT_READ, &fx) > 0); y = mkostemp_safe(py); assert_se(y >= 0);