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 |
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 |
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(nh: &chain->head, nb: &hook->nb); |
33 | } |
34 | |
35 | /* Remove a previously installed hook. */ |
36 | void |
37 | xfs_hooks_del( |
38 | struct xfs_hooks *chain, |
39 | struct xfs_hook *hook) |
40 | { |
41 | blocking_notifier_chain_unregister(nh: &chain->head, nb: &hook->nb); |
42 | } |
43 | |
44 | /* Call a hook. Returns the NOTIFY_* value returned by the last hook. */ |
45 | int |
46 | xfs_hooks_call( |
47 | struct xfs_hooks *chain, |
48 | unsigned long val, |
49 | void *priv) |
50 | { |
51 | return blocking_notifier_call_chain(nh: &chain->head, val, v: priv); |
52 | } |
53 |