]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
libxfs: remove kmem_zone_destroy
authorDarrick J. Wong <djwong@kernel.org>
Thu, 6 Jan 2022 22:13:22 +0000 (14:13 -0800)
committerDarrick J. Wong <djwong@kernel.org>
Thu, 17 Mar 2022 21:40:28 +0000 (14:40 -0700)
Convert all kmem cache users to call kmem_cache_destroy, and make leak
checking an explicit operation.  This gets us closer to the kernel
interface.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
include/kmem.h
libxfs/init.c
libxfs/kmem.c

index c710635df9a732419491ede6111d45cf97daacd5..53a2b37a748213ce168d05fb5ef979cad89409ff 100644 (file)
@@ -6,6 +6,9 @@
 #ifndef __KMEM_H__
 #define __KMEM_H__
 
+void kmem_start_leak_check(void);
+bool kmem_found_leaks(void);
+
 #define KM_NOFS                0x0004u
 #define KM_MAYFAIL     0x0008u
 #define KM_LARGE       0x0010u
@@ -38,17 +41,10 @@ kmem_zone_init(unsigned int size, const char *name)
        return kmem_cache_create(name, size, 0, 0, NULL);
 }
 
+void kmem_cache_destroy(kmem_zone_t *);
+
 extern void    *kmem_cache_alloc(kmem_zone_t *, gfp_t);
 extern void    *kmem_cache_zalloc(kmem_zone_t *, gfp_t);
-extern int     kmem_zone_destroy(kmem_zone_t *);
-
-
-static inline void
-kmem_cache_destroy(kmem_zone_t *zone)
-{
-       kmem_zone_destroy(zone);
-}
-
 
 static inline void
 kmem_cache_free(kmem_zone_t *zone, void *ptr)
index da82a206ae60c2779cea773370d2ba47702f920e..95a861d81e1b4efddbcf53f05c3fbad1607c1b23 100644 (file)
@@ -255,22 +255,18 @@ init_zones(void)
                        sizeof(struct xfs_trans), "xfs_trans");
 }
 
-static int
-destroy_zones(void)
+static void
+destroy_kmem_caches(void)
 {
-       int     leaked = 0;
-
-       leaked += kmem_zone_destroy(xfs_buf_zone);
-       leaked += kmem_zone_destroy(xfs_ili_zone);
-       leaked += kmem_zone_destroy(xfs_inode_zone);
-       leaked += kmem_zone_destroy(xfs_ifork_zone);
-       leaked += kmem_zone_destroy(xfs_buf_item_zone);
-       leaked += kmem_zone_destroy(xfs_da_state_zone);
+       kmem_cache_destroy(xfs_buf_zone);
+       kmem_cache_destroy(xfs_ili_zone);
+       kmem_cache_destroy(xfs_inode_zone);
+       kmem_cache_destroy(xfs_ifork_zone);
+       kmem_cache_destroy(xfs_buf_item_zone);
+       kmem_cache_destroy(xfs_da_state_zone);
        xfs_btree_destroy_cur_caches();
-       leaked += kmem_zone_destroy(xfs_bmap_free_item_zone);
-       leaked += kmem_zone_destroy(xfs_trans_zone);
-
-       return leaked;
+       kmem_cache_destroy(xfs_bmap_free_item_zone);
+       kmem_cache_destroy(xfs_trans_zone);
 }
 
 static void
@@ -1027,17 +1023,17 @@ void
 libxfs_destroy(
        struct libxfs_xinit     *li)
 {
-       int                     leaked;
-
+       kmem_start_leak_check();
        libxfs_close_devices(li);
 
        /* Free everything from the buffer cache before freeing buffer zone */
        libxfs_bcache_purge();
        libxfs_bcache_free();
        cache_destroy(libxfs_bcache);
-       leaked = destroy_zones();
+       destroy_kmem_caches();
        rcu_unregister_thread();
-       if (getenv("LIBXFS_LEAK_CHECK") && leaked)
+
+       if (kmem_found_leaks())
                exit(1);
 }
 
index 221b3480444add64a7c4773ab4f285353790cea4..804d4b3cfe04e12c31775bb3de3ec9cdf0854593 100644 (file)
@@ -3,6 +3,18 @@
 
 #include "libxfs_priv.h"
 
+static bool leaked;
+
+void kmem_start_leak_check(void)
+{
+       leaked = false;
+}
+
+bool kmem_found_leaks(void)
+{
+       return leaked;
+}
+
 /*
  * Simple memory interface
  */
@@ -27,18 +39,15 @@ kmem_cache_create(const char *name, unsigned int size, unsigned int align,
        return ptr;
 }
 
-int
-kmem_zone_destroy(kmem_zone_t *zone)
+void
+kmem_cache_destroy(kmem_zone_t *zone)
 {
-       int     leaked = 0;
-
        if (getenv("LIBXFS_LEAK_CHECK") && zone->allocated) {
-               leaked = 1;
+               leaked = true;
                fprintf(stderr, "zone %s freed with %d items allocated\n",
                                zone->zone_name, zone->allocated);
        }
        free(zone);
-       return leaked;
 }
 
 void *