1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 * Copyright (c) 2022-2024 Oracle.  All Rights Reserved.
4 * Author: Darrick J. Wong <djwong@kernel.org>
5 */
6#include "xfs.h"
7#include "xfs_fs.h"
8#include "xfs_shared.h"
9#include "xfs_format.h"
10#include "xfs_trans_resv.h"
11#include "xfs_mount.h"
12#include "xfs_ag.h"
13#include "xfs_trace.h"
14
15/* Initialize a notifier chain. */
16void
17xfs_hooks_init(
18	struct xfs_hooks	*chain)
19{
20	BLOCKING_INIT_NOTIFIER_HEAD(&chain->head);
21}
22
23/* Make it so a function gets called whenever we hit a certain hook point. */
24int
25xfs_hooks_add(
26	struct xfs_hooks	*chain,
27	struct xfs_hook		*hook)
28{
29	ASSERT(hook->nb.notifier_call != NULL);
30	BUILD_BUG_ON(offsetof(struct xfs_hook, nb) != 0);
31
32	return blocking_notifier_chain_register(&chain->head, &hook->nb);
33}
34
35/* Remove a previously installed hook. */
36void
37xfs_hooks_del(
38	struct xfs_hooks	*chain,
39	struct xfs_hook		*hook)
40{
41	blocking_notifier_chain_unregister(&chain->head, &hook->nb);
42}
43
44/* Call a hook.  Returns the NOTIFY_* value returned by the last hook. */
45int
46xfs_hooks_call(
47	struct xfs_hooks	*chain,
48	unsigned long		val,
49	void			*priv)
50{
51	return blocking_notifier_call_chain(&chain->head, val, priv);
52}
53