162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later
262306a36Sopenharmony_ci/* FS-Cache statistics viewing interface
362306a36Sopenharmony_ci *
462306a36Sopenharmony_ci * Copyright (C) 2021 Red Hat, Inc. All Rights Reserved.
562306a36Sopenharmony_ci * Written by David Howells (dhowells@redhat.com)
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#define FSCACHE_DEBUG_LEVEL CACHE
962306a36Sopenharmony_ci#include <linux/module.h>
1062306a36Sopenharmony_ci#include <linux/proc_fs.h>
1162306a36Sopenharmony_ci#include <linux/seq_file.h>
1262306a36Sopenharmony_ci#include "internal.h"
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci/*
1562306a36Sopenharmony_ci * initialise the /proc/fs/fscache/ directory
1662306a36Sopenharmony_ci */
1762306a36Sopenharmony_ciint __init fscache_proc_init(void)
1862306a36Sopenharmony_ci{
1962306a36Sopenharmony_ci	if (!proc_mkdir("fs/fscache", NULL))
2062306a36Sopenharmony_ci		goto error_dir;
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci	if (!proc_create_seq("fs/fscache/caches", S_IFREG | 0444, NULL,
2362306a36Sopenharmony_ci			     &fscache_caches_seq_ops))
2462306a36Sopenharmony_ci		goto error;
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci	if (!proc_create_seq("fs/fscache/volumes", S_IFREG | 0444, NULL,
2762306a36Sopenharmony_ci			     &fscache_volumes_seq_ops))
2862306a36Sopenharmony_ci		goto error;
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci	if (!proc_create_seq("fs/fscache/cookies", S_IFREG | 0444, NULL,
3162306a36Sopenharmony_ci			     &fscache_cookies_seq_ops))
3262306a36Sopenharmony_ci		goto error;
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci#ifdef CONFIG_FSCACHE_STATS
3562306a36Sopenharmony_ci	if (!proc_create_single("fs/fscache/stats", S_IFREG | 0444, NULL,
3662306a36Sopenharmony_ci				fscache_stats_show))
3762306a36Sopenharmony_ci		goto error;
3862306a36Sopenharmony_ci#endif
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci	return 0;
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_cierror:
4362306a36Sopenharmony_ci	remove_proc_entry("fs/fscache", NULL);
4462306a36Sopenharmony_cierror_dir:
4562306a36Sopenharmony_ci	return -ENOMEM;
4662306a36Sopenharmony_ci}
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci/*
4962306a36Sopenharmony_ci * clean up the /proc/fs/fscache/ directory
5062306a36Sopenharmony_ci */
5162306a36Sopenharmony_civoid fscache_proc_cleanup(void)
5262306a36Sopenharmony_ci{
5362306a36Sopenharmony_ci	remove_proc_subtree("fs/fscache", NULL);
5462306a36Sopenharmony_ci}
55