xref: /linux/fs/xfs/xfs_hooks.c (revision 79790b6818e96c58fe2bffee1b418c16e64e7b80)
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. */
16 void
xfs_hooks_init(struct xfs_hooks * chain)17 xfs_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. */
24 int
xfs_hooks_add(struct xfs_hooks * chain,struct xfs_hook * hook)25 xfs_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. */
36 void
xfs_hooks_del(struct xfs_hooks * chain,struct xfs_hook * hook)37 xfs_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. */
45 int
xfs_hooks_call(struct xfs_hooks * chain,unsigned long val,void * priv)46 xfs_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