Commit | Line | Data |
---|---|---|
4e98cc90 DW |
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(&chain->head, &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(&chain->head, &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(&chain->head, val, priv); | |
52 | } |