]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
libxfs: add function to free all buffers in bcache
authorEric Sandeen <sandeen@redhat.com>
Fri, 9 Mar 2018 02:35:22 +0000 (20:35 -0600)
committerEric Sandeen <sandeen@redhat.com>
Fri, 9 Mar 2018 02:35:22 +0000 (20:35 -0600)
libxfs_bcache_purge simply moves all "free" buffers
onto the xfs_buf_freelist mru list; add a new function to
actually free them when we tear everything down, so leak
checkers don't go nuts about lots of unfreed xfs_bufs
at exit.

Signed-off-by: Eric Sandeen <sandeen@redhat.com>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
libxfs/init.c
libxfs/libxfs_io.h
libxfs/rdwr.c

index 7bde8b739e06bc2b85fda947967399f8cd3cae5d..c7d73b66853ac97055cfe97f6e8667c51b61c741 100644 (file)
@@ -888,8 +888,11 @@ libxfs_umount(xfs_mount_t *mp)
 void
 libxfs_destroy(void)
 {
-       manage_zones(1);
+       /* Free everything from the buffer cache before freeing buffer zone */
+       libxfs_bcache_purge();
+       libxfs_bcache_free();
        cache_destroy(libxfs_bcache);
+       manage_zones(1);
 }
 
 int
index 78b67802b1cd636a4e7cf950cf0589f4b9bd387c..6de6fcb5d9143d6e438f1636fcbf516781dd804e 100644 (file)
@@ -188,6 +188,7 @@ extern void libxfs_readbuf_verify(struct xfs_buf *bp,
                        const struct xfs_buf_ops *ops);
 extern xfs_buf_t *libxfs_getsb(struct xfs_mount *, int);
 extern void    libxfs_bcache_purge(void);
+extern void    libxfs_bcache_free(void);
 extern void    libxfs_bcache_flush(void);
 extern void    libxfs_purgebuf(xfs_buf_t *);
 extern int     libxfs_bcache_overflowed(void);
index 3c5def2950292926368b20bbd35fd91253c64079..81701b752c56b50690b9975a03d2a0228f83653c 100644 (file)
@@ -1274,6 +1274,24 @@ libxfs_bulkrelse(
        return count;
 }
 
+/*
+ * Free everything from the xfs_buf_freelist MRU, used at final teardown
+ */
+void
+libxfs_bcache_free(void)
+{
+       struct list_head        *cm_list;
+       xfs_buf_t               *bp, *next;
+
+       cm_list = &xfs_buf_freelist.cm_list;
+       list_for_each_entry_safe(bp, next, cm_list, b_node.cn_mru) {
+               free(bp->b_addr);
+               if (bp->b_maps != &bp->__b_map)
+                       free(bp->b_maps);
+               kmem_zone_free(xfs_buf_zone, bp);
+       }
+}
+
 /*
  * When a buffer is marked dirty, the error is cleared. Hence if we are trying
  * to flush a buffer prior to cache reclaim that has an error on it it means