aboutsummaryrefslogtreecommitdiffstats
path: root/fs/lockd
diff options
context:
space:
mode:
authorJeff Layton <jlayton@primarydata.com>2014-09-12 16:40:20 -0400
committerJ. Bruce Fields <bfields@redhat.com>2014-09-17 16:33:11 -0400
commitf7790029655f79cdcee4fa7c7884e0c2795ebebe (patch)
tree9181503273f1355a506a7658ec0115c20c2047d0 /fs/lockd
parentf0c63124a6165792f6e37e4b5983792d009e1ce8 (diff)
lockd: move lockd's grace period handling into its own module
Currently, all of the grace period handling is part of lockd. Eventually though we'd like to be able to build v4-only servers, at which point we'll need to put all of this elsewhere. Move the code itself into fs/nfs_common and have it build a grace.ko module. Then, rejigger the Kconfig options so that both nfsd and lockd enable it automatically. Signed-off-by: Jeff Layton <jlayton@primarydata.com>
Diffstat (limited to 'fs/lockd')
-rw-r--r--fs/lockd/Makefile2
-rw-r--r--fs/lockd/grace.c65
-rw-r--r--fs/lockd/netns.h1
-rw-r--r--fs/lockd/svc.c2
4 files changed, 2 insertions, 68 deletions
diff --git a/fs/lockd/Makefile b/fs/lockd/Makefile
index ca58d64374ca..6a0b351ce30e 100644
--- a/fs/lockd/Makefile
+++ b/fs/lockd/Makefile
@@ -5,6 +5,6 @@
5obj-$(CONFIG_LOCKD) += lockd.o 5obj-$(CONFIG_LOCKD) += lockd.o
6 6
7lockd-objs-y := clntlock.o clntproc.o clntxdr.o host.o svc.o svclock.o \ 7lockd-objs-y := clntlock.o clntproc.o clntxdr.o host.o svc.o svclock.o \
8 svcshare.o svcproc.o svcsubs.o mon.o xdr.o grace.o 8 svcshare.o svcproc.o svcsubs.o mon.o xdr.o
9lockd-objs-$(CONFIG_LOCKD_V4) += clnt4xdr.o xdr4.o svc4proc.o 9lockd-objs-$(CONFIG_LOCKD_V4) += clnt4xdr.o xdr4.o svc4proc.o
10lockd-objs := $(lockd-objs-y) 10lockd-objs := $(lockd-objs-y)
diff --git a/fs/lockd/grace.c b/fs/lockd/grace.c
deleted file mode 100644
index 6d1ee7204c88..000000000000
--- a/fs/lockd/grace.c
+++ /dev/null
@@ -1,65 +0,0 @@
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#include <net/net_namespace.h>
8
9#include "netns.h"
10
11static DEFINE_SPINLOCK(grace_lock);
12
13/**
14 * locks_start_grace
15 * @lm: who this grace period is for
16 *
17 * A grace period is a period during which locks should not be given
18 * out. Currently grace periods are only enforced by the two lock
19 * managers (lockd and nfsd), using the locks_in_grace() function to
20 * check when they are in a grace period.
21 *
22 * This function is called to start a grace period.
23 */
24void locks_start_grace(struct net *net, struct lock_manager *lm)
25{
26 struct lockd_net *ln = net_generic(net, lockd_net_id);
27
28 spin_lock(&grace_lock);
29 list_add(&lm->list, &ln->grace_list);
30 spin_unlock(&grace_lock);
31}
32EXPORT_SYMBOL_GPL(locks_start_grace);
33
34/**
35 * locks_end_grace
36 * @lm: who this grace period is for
37 *
38 * Call this function to state that the given lock manager is ready to
39 * resume regular locking. The grace period will not end until all lock
40 * managers that called locks_start_grace() also call locks_end_grace().
41 * Note that callers count on it being safe to call this more than once,
42 * and the second call should be a no-op.
43 */
44void locks_end_grace(struct lock_manager *lm)
45{
46 spin_lock(&grace_lock);
47 list_del_init(&lm->list);
48 spin_unlock(&grace_lock);
49}
50EXPORT_SYMBOL_GPL(locks_end_grace);
51
52/**
53 * locks_in_grace
54 *
55 * Lock managers call this function to determine when it is OK for them
56 * to answer ordinary lock requests, and when they should accept only
57 * lock reclaims.
58 */
59int locks_in_grace(struct net *net)
60{
61 struct lockd_net *ln = net_generic(net, lockd_net_id);
62
63 return !list_empty(&ln->grace_list);
64}
65EXPORT_SYMBOL_GPL(locks_in_grace);
diff --git a/fs/lockd/netns.h b/fs/lockd/netns.h
index 5010b55628b4..097bfa3adb1c 100644
--- a/fs/lockd/netns.h
+++ b/fs/lockd/netns.h
@@ -11,7 +11,6 @@ struct lockd_net {
11 11
12 struct delayed_work grace_period_end; 12 struct delayed_work grace_period_end;
13 struct lock_manager lockd_manager; 13 struct lock_manager lockd_manager;
14 struct list_head grace_list;
15 14
16 spinlock_t nsm_clnt_lock; 15 spinlock_t nsm_clnt_lock;
17 unsigned int nsm_users; 16 unsigned int nsm_users;
diff --git a/fs/lockd/svc.c b/fs/lockd/svc.c
index 09857b48d0c3..266b67972305 100644
--- a/fs/lockd/svc.c
+++ b/fs/lockd/svc.c
@@ -586,7 +586,7 @@ static int lockd_init_net(struct net *net)
586 struct lockd_net *ln = net_generic(net, lockd_net_id); 586 struct lockd_net *ln = net_generic(net, lockd_net_id);
587 587
588 INIT_DELAYED_WORK(&ln->grace_period_end, grace_ender); 588 INIT_DELAYED_WORK(&ln->grace_period_end, grace_ender);
589 INIT_LIST_HEAD(&ln->grace_list); 589 INIT_LIST_HEAD(&ln->lockd_manager.list);
590 spin_lock_init(&ln->nsm_clnt_lock); 590 spin_lock_init(&ln->nsm_clnt_lock);
591 return 0; 591 return 0;
592} 592}