]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
mmap-cache: modernize mmap_cache_add_fd()
authorYu Watanabe <watanabe.yu+github@gmail.com>
Thu, 28 Sep 2023 00:38:59 +0000 (09:38 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Sat, 30 Sep 2023 21:35:02 +0000 (06:35 +0900)
- use hashmap_ensure_put(),
- use _cleanup_free_ attribute,
- use structured initializer.

src/libsystemd/sd-journal/journal-file.c
src/libsystemd/sd-journal/journal-verify.c
src/libsystemd/sd-journal/mmap-cache.c
src/libsystemd/sd-journal/mmap-cache.h
src/libsystemd/sd-journal/test-mmap-cache.c

index 5d3f85e4cc38f7d5eda26492bae6da33334e66f0..662587952674eb44c0269a67c049b2192334ce07 100644 (file)
@@ -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);
index 8232f53eb66995113b01a691d3faa19c9e233184..cdfe7a1a6aadd749881a96fa0e5692445c86da7d 100644 (file)
@@ -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;
         }
 
index 73f5a116205aaab14018e7de1d81a9cf3af6ee3a..6c2c26fde803fe9f610f3c6c1af4c9743873c0aa 100644 (file)
@@ -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) {
index 4769414ded32bbc57f57c023b401cf3ef6b4669d..5d01efd186812b709ae6f19190c694ff39166520 100644 (file)
@@ -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);
 
index bc063381b2ba1c74d8cab4000f069e0eed40f4dc..73c0b99978c22e2aa2269baa7008f3af4444a15a 100644 (file)
@@ -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);