From: Stanislav Kinsbursky --- fs/lockd/grace.c | 18 ++---------------- fs/lockd/svc.c | 19 ++++++++++++------- include/linux/lockd/bind.h | 1 + include/linux/ve_nfs.h | 9 +++++++-- 4 files changed, 22 insertions(+), 25 deletions(-) diff --git a/fs/lockd/grace.c b/fs/lockd/grace.c index 49bd61b..94ca2f5 100644 --- a/fs/lockd/grace.c +++ b/fs/lockd/grace.c @@ -7,10 +7,7 @@ #include #include -#ifndef CONFIG_VE -static LIST_HEAD(grace_list); static DEFINE_SPINLOCK(grace_lock); -#endif /** * locks_start_grace @@ -25,15 +22,11 @@ static DEFINE_SPINLOCK(grace_lock); */ void locks_start_grace(struct lock_manager *lm) { -#ifdef CONFIG_VE printk("%s: ve%d: %pS\n", __func__, get_exec_env()->veid, lm); dump_stack(); - atomic_inc(&nlm_in_grace); -#else spin_lock(&grace_lock); list_add(&lm->list, &grace_list); spin_unlock(&grace_lock); -#endif } EXPORT_SYMBOL_GPL(locks_start_grace); @@ -49,15 +42,11 @@ EXPORT_SYMBOL_GPL(locks_start_grace); */ void locks_end_grace(struct lock_manager *lm) { -#ifdef CONFIG_VE - atomic_dec(&nlm_in_grace); printk("%s: ve%d: %pS\n", __func__, get_exec_env()->veid, lm); dump_stack(); -#else spin_lock(&grace_lock); list_del_init(&lm->list); spin_unlock(&grace_lock); -#endif } EXPORT_SYMBOL_GPL(locks_end_grace); @@ -70,11 +59,8 @@ EXPORT_SYMBOL_GPL(locks_end_grace); */ int locks_in_grace(void) { -#ifdef CONFIG_VE - printk("%s: ve%d: grace count: %d\n", __func__, get_exec_env()->veid, atomic_read(&nlm_in_grace)); - return atomic_read(&nlm_in_grace) != 0; -#else + if (!list_empty(&grace_list)) + printk("%s: ve%d: grace period\n", __func__, get_exec_env()->veid); return !list_empty(&grace_list); -#endif } EXPORT_SYMBOL_GPL(locks_in_grace); diff --git a/fs/lockd/svc.c b/fs/lockd/svc.c index b2fd417..a07d8b4 100644 --- a/fs/lockd/svc.c +++ b/fs/lockd/svc.c @@ -91,15 +91,16 @@ static unsigned long get_lockd_grace_period(void) return nlm_timeout * 5 * HZ; } -static struct lock_manager lockd_manager = { -}; - -static void grace_ender(struct work_struct *not_used) +void grace_ender(struct work_struct *grace) { - locks_end_grace(&lockd_manager); -} + struct delayed_work *dwork = container_of(grace, struct delayed_work, + work); + struct ve_nlm_data *nlm = container_of(dwork, struct ve_nlm_data, + _grace_period_end); -static DECLARE_DELAYED_WORK(grace_period_end, grace_ender); + locks_end_grace(&nlm->_lockd_manager); +} +EXPORT_SYMBOL_GPL(grace_ender); static void set_grace_period(void) { @@ -535,6 +536,10 @@ static void ve_nlm_init(struct ve_nlm_data *nlm_data) { spin_lock_init(&nlm_data->_nlm_reserved_lock); INIT_HLIST_HEAD(&nlm_data->_nlm_reserved_pids); + + INIT_DELAYED_WORK(&nlm_data->_grace_period_end, grace_ender); + INIT_LIST_HEAD(&nlm_data->_grace_list); + get_exec_env()->nlm_data = nlm_data; } diff --git a/include/linux/lockd/bind.h b/include/linux/lockd/bind.h index b9ae3e3..f6b74d0 100644 --- a/include/linux/lockd/bind.h +++ b/include/linux/lockd/bind.h @@ -55,6 +55,7 @@ extern int nlmclnt_proc(struct nlm_host *host, int cmd, struct file_lock *fl); extern int lockd_up(void); extern void lockd_down(void); +extern void grace_ender(struct work_struct *work); extern int nlmclnt_set_lockowner(struct inode *, struct file_lock *, fl_owner_t, int); diff --git a/include/linux/ve_nfs.h b/include/linux/ve_nfs.h index 72de9cf..d4b33e3 100644 --- a/include/linux/ve_nfs.h +++ b/include/linux/ve_nfs.h @@ -56,7 +56,9 @@ struct ve_nlm_data { struct hlist_head _nlm_reserved_pids; spinlock_t _nlm_reserved_lock; - atomic_t _nlm_in_grace; + struct delayed_work _grace_period_end; + struct list_head _grace_list; + struct lock_manager _lockd_manager; }; #ifdef CONFIG_VE @@ -151,7 +153,10 @@ static void ve_nfs_data_put(struct ve_struct *ve) #define nlm_reserved_pids NLM_CTX_FIELD(nlm_reserved_pids) #define nlm_reserved_lock NLM_CTX_FIELD(nlm_reserved_lock) -#define nlm_in_grace NLM_CTX_FIELD(nlm_in_grace) + +#define grace_period_end NLM_CTX_FIELD(grace_period_end) +#define grace_list NLM_CTX_FIELD(grace_list) +#define lockd_manager NLM_CTX_FIELD(lockd_manager) #define nfsiod_workqueue NFS_CTX_FIELD(nfsiod_workqueue)