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 } 53