Skip to content

Commit

Permalink
lockd: move lockd's grace period handling into its own module
Browse files Browse the repository at this point in the history
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 <[email protected]>
  • Loading branch information
Jeff Layton authored and J. Bruce Fields committed Sep 17, 2014
1 parent f0c6312 commit f779002
Show file tree
Hide file tree
Showing 8 changed files with 70 additions and 15 deletions.
6 changes: 5 additions & 1 deletion fs/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -233,9 +233,13 @@ if NETWORK_FILESYSTEMS
source "fs/nfs/Kconfig"
source "fs/nfsd/Kconfig"

config GRACE_PERIOD
tristate

config LOCKD
tristate
depends on FILE_LOCKING
select GRACE_PERIOD

config LOCKD_V4
bool
Expand All @@ -249,7 +253,7 @@ config NFS_ACL_SUPPORT

config NFS_COMMON
bool
depends on NFSD || NFS_FS
depends on NFSD || NFS_FS || LOCKD
default y

source "net/sunrpc/Kconfig"
Expand Down
2 changes: 1 addition & 1 deletion fs/lockd/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,6 @@
obj-$(CONFIG_LOCKD) += lockd.o

lockd-objs-y := clntlock.o clntproc.o clntxdr.o host.o svc.o svclock.o \
svcshare.o svcproc.o svcsubs.o mon.o xdr.o grace.o
svcshare.o svcproc.o svcsubs.o mon.o xdr.o
lockd-objs-$(CONFIG_LOCKD_V4) += clnt4xdr.o xdr4.o svc4proc.o
lockd-objs := $(lockd-objs-y)
1 change: 0 additions & 1 deletion fs/lockd/netns.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ struct lockd_net {

struct delayed_work grace_period_end;
struct lock_manager lockd_manager;
struct list_head grace_list;

spinlock_t nsm_clnt_lock;
unsigned int nsm_users;
Expand Down
2 changes: 1 addition & 1 deletion fs/lockd/svc.c
Original file line number Diff line number Diff line change
Expand Up @@ -586,7 +586,7 @@ static int lockd_init_net(struct net *net)
struct lockd_net *ln = net_generic(net, lockd_net_id);

INIT_DELAYED_WORK(&ln->grace_period_end, grace_ender);
INIT_LIST_HEAD(&ln->grace_list);
INIT_LIST_HEAD(&ln->lockd_manager.list);
spin_lock_init(&ln->nsm_clnt_lock);
return 0;
}
Expand Down
3 changes: 2 additions & 1 deletion fs/nfs_common/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,6 @@
#

obj-$(CONFIG_NFS_ACL_SUPPORT) += nfs_acl.o

nfs_acl-objs := nfsacl.o

obj-$(CONFIG_GRACE_PERIOD) += grace.o
68 changes: 58 additions & 10 deletions fs/lockd/grace.c → fs/nfs_common/grace.c
Original file line number Diff line number Diff line change
@@ -1,17 +1,20 @@
/*
* Common code for control of lockd and nfsv4 grace periods.
*
* Transplanted from lockd code
*/

#include <linux/module.h>
#include <linux/lockd/bind.h>
#include <net/net_namespace.h>
#include <net/netns/generic.h>
#include <linux/fs.h>

#include "netns.h"

static int grace_net_id;
static DEFINE_SPINLOCK(grace_lock);

/**
* locks_start_grace
* @net: net namespace that this lock manager belongs to
* @lm: who this grace period is for
*
* A grace period is a period during which locks should not be given
Expand All @@ -21,18 +24,20 @@ static DEFINE_SPINLOCK(grace_lock);
*
* This function is called to start a grace period.
*/
void locks_start_grace(struct net *net, struct lock_manager *lm)
void
locks_start_grace(struct net *net, struct lock_manager *lm)
{
struct lockd_net *ln = net_generic(net, lockd_net_id);
struct list_head *grace_list = net_generic(net, grace_net_id);

spin_lock(&grace_lock);
list_add(&lm->list, &ln->grace_list);
list_add(&lm->list, grace_list);
spin_unlock(&grace_lock);
}
EXPORT_SYMBOL_GPL(locks_start_grace);

/**
* locks_end_grace
* @net: net namespace that this lock manager belongs to
* @lm: who this grace period is for
*
* Call this function to state that the given lock manager is ready to
Expand All @@ -41,7 +46,8 @@ EXPORT_SYMBOL_GPL(locks_start_grace);
* Note that callers count on it being safe to call this more than once,
* and the second call should be a no-op.
*/
void locks_end_grace(struct lock_manager *lm)
void
locks_end_grace(struct lock_manager *lm)
{
spin_lock(&grace_lock);
list_del_init(&lm->list);
Expand All @@ -56,10 +62,52 @@ EXPORT_SYMBOL_GPL(locks_end_grace);
* to answer ordinary lock requests, and when they should accept only
* lock reclaims.
*/
int locks_in_grace(struct net *net)
int
locks_in_grace(struct net *net)
{
struct lockd_net *ln = net_generic(net, lockd_net_id);
struct list_head *grace_list = net_generic(net, grace_net_id);

return !list_empty(&ln->grace_list);
return !list_empty(grace_list);
}
EXPORT_SYMBOL_GPL(locks_in_grace);

static int __net_init
grace_init_net(struct net *net)
{
struct list_head *grace_list = net_generic(net, grace_net_id);

INIT_LIST_HEAD(grace_list);
return 0;
}

static void __net_exit
grace_exit_net(struct net *net)
{
struct list_head *grace_list = net_generic(net, grace_net_id);

BUG_ON(!list_empty(grace_list));
}

static struct pernet_operations grace_net_ops = {
.init = grace_init_net,
.exit = grace_exit_net,
.id = &grace_net_id,
.size = sizeof(struct list_head),
};

static int __init
init_grace(void)
{
return register_pernet_subsys(&grace_net_ops);
}

static void __exit
exit_grace(void)
{
unregister_pernet_subsys(&grace_net_ops);
}

MODULE_AUTHOR("Jeff Layton <[email protected]>");
MODULE_LICENSE("GPL");
module_init(init_grace)
module_exit(exit_grace)
1 change: 1 addition & 0 deletions fs/nfsd/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ config NFSD_V4
select FS_POSIX_ACL
select SUNRPC_GSS
select CRYPTO
select GRACE_PERIOD
help
This option enables support in your system's NFS server for
version 4 of the NFS protocol (RFC 3530).
Expand Down
2 changes: 2 additions & 0 deletions include/linux/proc_fs.h
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,8 @@ static inline int remove_proc_subtree(const char *name, struct proc_dir_entry *p

#endif /* CONFIG_PROC_FS */

struct net;

static inline struct proc_dir_entry *proc_net_mkdir(
struct net *net, const char *name, struct proc_dir_entry *parent)
{
Expand Down

0 comments on commit f779002

Please sign in to comment.