Merge branch 'for-2.6.39' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie...
[platform/adaptation/renesas_rcar/renesas_kernel.git] / fs / lockd / grace.c
1 /*
2  * Common code for control of lockd and nfsv4 grace periods.
3  */
4
5 #include <linux/module.h>
6 #include <linux/lockd/bind.h>
7
8 static LIST_HEAD(grace_list);
9 static DEFINE_SPINLOCK(grace_lock);
10
11 /**
12  * locks_start_grace
13  * @lm: who this grace period is for
14  *
15  * A grace period is a period during which locks should not be given
16  * out.  Currently grace periods are only enforced by the two lock
17  * managers (lockd and nfsd), using the locks_in_grace() function to
18  * check when they are in a grace period.
19  *
20  * This function is called to start a grace period.
21  */
22 void locks_start_grace(struct lock_manager *lm)
23 {
24         spin_lock(&grace_lock);
25         list_add(&lm->list, &grace_list);
26         spin_unlock(&grace_lock);
27 }
28 EXPORT_SYMBOL_GPL(locks_start_grace);
29
30 /**
31  * locks_end_grace
32  * @lm: who this grace period is for
33  *
34  * Call this function to state that the given lock manager is ready to
35  * resume regular locking.  The grace period will not end until all lock
36  * managers that called locks_start_grace() also call locks_end_grace().
37  * Note that callers count on it being safe to call this more than once,
38  * and the second call should be a no-op.
39  */
40 void locks_end_grace(struct lock_manager *lm)
41 {
42         spin_lock(&grace_lock);
43         list_del_init(&lm->list);
44         spin_unlock(&grace_lock);
45 }
46 EXPORT_SYMBOL_GPL(locks_end_grace);
47
48 /**
49  * locks_in_grace
50  *
51  * Lock managers call this function to determine when it is OK for them
52  * to answer ordinary lock requests, and when they should accept only
53  * lock reclaims.
54  */
55 int locks_in_grace(void)
56 {
57         return !list_empty(&grace_list);
58 }
59 EXPORT_SYMBOL_GPL(locks_in_grace);