aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStanislav Kinsbursky <skinsbursky@parallels.com>2012-07-25 08:57:22 -0400
committerJ. Bruce Fields <bfields@redhat.com>2012-07-27 16:49:22 -0400
commit5ccb0066f2d561549cc4d73d7f56b4ce3ca7a8a1 (patch)
tree43ca9eff5c94fc3609d858ce2a430c544fcc5f99
parentdb9c4553412d72c6a05e0168d1d487f66e0660b3 (diff)
LockD: pass actual network namespace to grace period management functions
Passed network namespace replaced hard-coded init_net Signed-off-by: Stanislav Kinsbursky <skinsbursky@parallels.com> Signed-off-by: J. Bruce Fields <bfields@redhat.com>
-rw-r--r--fs/lockd/grace.c6
-rw-r--r--fs/lockd/svc.c16
-rw-r--r--fs/lockd/svc4proc.c13
-rw-r--r--fs/lockd/svclock.c16
-rw-r--r--fs/lockd/svcproc.c15
-rw-r--r--fs/nfsd/nfs4proc.c18
-rw-r--r--fs/nfsd/nfs4state.c29
-rw-r--r--fs/nfsd/state.h3
-rw-r--r--include/linux/fs.h5
-rw-r--r--include/linux/lockd/lockd.h4
10 files changed, 67 insertions, 58 deletions
diff --git a/fs/lockd/grace.c b/fs/lockd/grace.c
index 8dbaff782098..6d1ee7204c88 100644
--- a/fs/lockd/grace.c
+++ b/fs/lockd/grace.c
@@ -21,9 +21,8 @@ static DEFINE_SPINLOCK(grace_lock);
21 * 21 *
22 * This function is called to start a grace period. 22 * This function is called to start a grace period.
23 */ 23 */
24void locks_start_grace(struct lock_manager *lm) 24void locks_start_grace(struct net *net, struct lock_manager *lm)
25{ 25{
26 struct net *net = &init_net;
27 struct lockd_net *ln = net_generic(net, lockd_net_id); 26 struct lockd_net *ln = net_generic(net, lockd_net_id);
28 27
29 spin_lock(&grace_lock); 28 spin_lock(&grace_lock);
@@ -57,9 +56,8 @@ EXPORT_SYMBOL_GPL(locks_end_grace);
57 * to answer ordinary lock requests, and when they should accept only 56 * to answer ordinary lock requests, and when they should accept only
58 * lock reclaims. 57 * lock reclaims.
59 */ 58 */
60int locks_in_grace(void) 59int locks_in_grace(struct net *net)
61{ 60{
62 struct net *net = &init_net;
63 struct lockd_net *ln = net_generic(net, lockd_net_id); 61 struct lockd_net *ln = net_generic(net, lockd_net_id);
64 62
65 return !list_empty(&ln->grace_list); 63 return !list_empty(&ln->grace_list);
diff --git a/fs/lockd/svc.c b/fs/lockd/svc.c
index 834dfe2ed2e9..68271c206bdc 100644
--- a/fs/lockd/svc.c
+++ b/fs/lockd/svc.c
@@ -97,12 +97,12 @@ static void grace_ender(struct work_struct *grace)
97 locks_end_grace(&ln->lockd_manager); 97 locks_end_grace(&ln->lockd_manager);
98} 98}
99 99
100static void set_grace_period(void) 100static void set_grace_period(struct net *net)
101{ 101{
102 unsigned long grace_period = get_lockd_grace_period(); 102 unsigned long grace_period = get_lockd_grace_period();
103 struct lockd_net *ln = net_generic(&init_net, lockd_net_id); 103 struct lockd_net *ln = net_generic(net, lockd_net_id);
104 104
105 locks_start_grace(&ln->lockd_manager); 105 locks_start_grace(net, &ln->lockd_manager);
106 cancel_delayed_work_sync(&ln->grace_period_end); 106 cancel_delayed_work_sync(&ln->grace_period_end);
107 schedule_delayed_work(&ln->grace_period_end, grace_period); 107 schedule_delayed_work(&ln->grace_period_end, grace_period);
108} 108}
@@ -110,12 +110,13 @@ static void set_grace_period(void)
110static void restart_grace(void) 110static void restart_grace(void)
111{ 111{
112 if (nlmsvc_ops) { 112 if (nlmsvc_ops) {
113 struct lockd_net *ln = net_generic(&init_net, lockd_net_id); 113 struct net *net = &init_net;
114 struct lockd_net *ln = net_generic(net, lockd_net_id);
114 115
115 cancel_delayed_work_sync(&ln->grace_period_end); 116 cancel_delayed_work_sync(&ln->grace_period_end);
116 locks_end_grace(&ln->lockd_manager); 117 locks_end_grace(&ln->lockd_manager);
117 nlmsvc_invalidate_all(); 118 nlmsvc_invalidate_all();
118 set_grace_period(); 119 set_grace_period(net);
119 } 120 }
120} 121}
121 122
@@ -127,7 +128,8 @@ lockd(void *vrqstp)
127{ 128{
128 int err = 0, preverr = 0; 129 int err = 0, preverr = 0;
129 struct svc_rqst *rqstp = vrqstp; 130 struct svc_rqst *rqstp = vrqstp;
130 struct lockd_net *ln = net_generic(&init_net, lockd_net_id); 131 struct net *net = &init_net;
132 struct lockd_net *ln = net_generic(net, lockd_net_id);
131 133
132 /* try_to_freeze() is called from svc_recv() */ 134 /* try_to_freeze() is called from svc_recv() */
133 set_freezable(); 135 set_freezable();
@@ -141,7 +143,7 @@ lockd(void *vrqstp)
141 nlm_timeout = LOCKD_DFLT_TIMEO; 143 nlm_timeout = LOCKD_DFLT_TIMEO;
142 nlmsvc_timeout = nlm_timeout * HZ; 144 nlmsvc_timeout = nlm_timeout * HZ;
143 145
144 set_grace_period(); 146 set_grace_period(net);
145 147
146 /* 148 /*
147 * The main request loop. We don't terminate until the last 149 * The main request loop. We don't terminate until the last
diff --git a/fs/lockd/svc4proc.c b/fs/lockd/svc4proc.c
index 9a41fdc19511..4a43d253c045 100644
--- a/fs/lockd/svc4proc.c
+++ b/fs/lockd/svc4proc.c
@@ -11,6 +11,7 @@
11#include <linux/time.h> 11#include <linux/time.h>
12#include <linux/lockd/lockd.h> 12#include <linux/lockd/lockd.h>
13#include <linux/lockd/share.h> 13#include <linux/lockd/share.h>
14#include <linux/sunrpc/svc_xprt.h>
14 15
15#define NLMDBG_FACILITY NLMDBG_CLIENT 16#define NLMDBG_FACILITY NLMDBG_CLIENT
16 17
@@ -151,7 +152,7 @@ nlm4svc_proc_cancel(struct svc_rqst *rqstp, struct nlm_args *argp,
151 resp->cookie = argp->cookie; 152 resp->cookie = argp->cookie;
152 153
153 /* Don't accept requests during grace period */ 154 /* Don't accept requests during grace period */
154 if (locks_in_grace()) { 155 if (locks_in_grace(SVC_NET(rqstp))) {
155 resp->status = nlm_lck_denied_grace_period; 156 resp->status = nlm_lck_denied_grace_period;
156 return rpc_success; 157 return rpc_success;
157 } 158 }
@@ -161,7 +162,7 @@ nlm4svc_proc_cancel(struct svc_rqst *rqstp, struct nlm_args *argp,
161 return resp->status == nlm_drop_reply ? rpc_drop_reply :rpc_success; 162 return resp->status == nlm_drop_reply ? rpc_drop_reply :rpc_success;
162 163
163 /* Try to cancel request. */ 164 /* Try to cancel request. */
164 resp->status = nlmsvc_cancel_blocked(file, &argp->lock); 165 resp->status = nlmsvc_cancel_blocked(SVC_NET(rqstp), file, &argp->lock);
165 166
166 dprintk("lockd: CANCEL status %d\n", ntohl(resp->status)); 167 dprintk("lockd: CANCEL status %d\n", ntohl(resp->status));
167 nlmsvc_release_host(host); 168 nlmsvc_release_host(host);
@@ -184,7 +185,7 @@ nlm4svc_proc_unlock(struct svc_rqst *rqstp, struct nlm_args *argp,
184 resp->cookie = argp->cookie; 185 resp->cookie = argp->cookie;
185 186
186 /* Don't accept new lock requests during grace period */ 187 /* Don't accept new lock requests during grace period */
187 if (locks_in_grace()) { 188 if (locks_in_grace(SVC_NET(rqstp))) {
188 resp->status = nlm_lck_denied_grace_period; 189 resp->status = nlm_lck_denied_grace_period;
189 return rpc_success; 190 return rpc_success;
190 } 191 }
@@ -194,7 +195,7 @@ nlm4svc_proc_unlock(struct svc_rqst *rqstp, struct nlm_args *argp,
194 return resp->status == nlm_drop_reply ? rpc_drop_reply :rpc_success; 195 return resp->status == nlm_drop_reply ? rpc_drop_reply :rpc_success;
195 196
196 /* Now try to remove the lock */ 197 /* Now try to remove the lock */
197 resp->status = nlmsvc_unlock(file, &argp->lock); 198 resp->status = nlmsvc_unlock(SVC_NET(rqstp), file, &argp->lock);
198 199
199 dprintk("lockd: UNLOCK status %d\n", ntohl(resp->status)); 200 dprintk("lockd: UNLOCK status %d\n", ntohl(resp->status));
200 nlmsvc_release_host(host); 201 nlmsvc_release_host(host);
@@ -321,7 +322,7 @@ nlm4svc_proc_share(struct svc_rqst *rqstp, struct nlm_args *argp,
321 resp->cookie = argp->cookie; 322 resp->cookie = argp->cookie;
322 323
323 /* Don't accept new lock requests during grace period */ 324 /* Don't accept new lock requests during grace period */
324 if (locks_in_grace() && !argp->reclaim) { 325 if (locks_in_grace(SVC_NET(rqstp)) && !argp->reclaim) {
325 resp->status = nlm_lck_denied_grace_period; 326 resp->status = nlm_lck_denied_grace_period;
326 return rpc_success; 327 return rpc_success;
327 } 328 }
@@ -354,7 +355,7 @@ nlm4svc_proc_unshare(struct svc_rqst *rqstp, struct nlm_args *argp,
354 resp->cookie = argp->cookie; 355 resp->cookie = argp->cookie;
355 356
356 /* Don't accept requests during grace period */ 357 /* Don't accept requests during grace period */
357 if (locks_in_grace()) { 358 if (locks_in_grace(SVC_NET(rqstp))) {
358 resp->status = nlm_lck_denied_grace_period; 359 resp->status = nlm_lck_denied_grace_period;
359 return rpc_success; 360 return rpc_success;
360 } 361 }
diff --git a/fs/lockd/svclock.c b/fs/lockd/svclock.c
index e46353f41a42..afe4488c33d8 100644
--- a/fs/lockd/svclock.c
+++ b/fs/lockd/svclock.c
@@ -26,7 +26,7 @@
26#include <linux/kernel.h> 26#include <linux/kernel.h>
27#include <linux/sched.h> 27#include <linux/sched.h>
28#include <linux/sunrpc/clnt.h> 28#include <linux/sunrpc/clnt.h>
29#include <linux/sunrpc/svc.h> 29#include <linux/sunrpc/svc_xprt.h>
30#include <linux/lockd/nlm.h> 30#include <linux/lockd/nlm.h>
31#include <linux/lockd/lockd.h> 31#include <linux/lockd/lockd.h>
32#include <linux/kthread.h> 32#include <linux/kthread.h>
@@ -447,11 +447,11 @@ nlmsvc_lock(struct svc_rqst *rqstp, struct nlm_file *file,
447 goto out; 447 goto out;
448 } 448 }
449 449
450 if (locks_in_grace() && !reclaim) { 450 if (locks_in_grace(SVC_NET(rqstp)) && !reclaim) {
451 ret = nlm_lck_denied_grace_period; 451 ret = nlm_lck_denied_grace_period;
452 goto out; 452 goto out;
453 } 453 }
454 if (reclaim && !locks_in_grace()) { 454 if (reclaim && !locks_in_grace(SVC_NET(rqstp))) {
455 ret = nlm_lck_denied_grace_period; 455 ret = nlm_lck_denied_grace_period;
456 goto out; 456 goto out;
457 } 457 }
@@ -559,7 +559,7 @@ nlmsvc_testlock(struct svc_rqst *rqstp, struct nlm_file *file,
559 goto out; 559 goto out;
560 } 560 }
561 561
562 if (locks_in_grace()) { 562 if (locks_in_grace(SVC_NET(rqstp))) {
563 ret = nlm_lck_denied_grace_period; 563 ret = nlm_lck_denied_grace_period;
564 goto out; 564 goto out;
565 } 565 }
@@ -603,7 +603,7 @@ out:
603 * must be removed. 603 * must be removed.
604 */ 604 */
605__be32 605__be32
606nlmsvc_unlock(struct nlm_file *file, struct nlm_lock *lock) 606nlmsvc_unlock(struct net *net, struct nlm_file *file, struct nlm_lock *lock)
607{ 607{
608 int error; 608 int error;
609 609
@@ -615,7 +615,7 @@ nlmsvc_unlock(struct nlm_file *file, struct nlm_lock *lock)
615 (long long)lock->fl.fl_end); 615 (long long)lock->fl.fl_end);
616 616
617 /* First, cancel any lock that might be there */ 617 /* First, cancel any lock that might be there */
618 nlmsvc_cancel_blocked(file, lock); 618 nlmsvc_cancel_blocked(net, file, lock);
619 619
620 lock->fl.fl_type = F_UNLCK; 620 lock->fl.fl_type = F_UNLCK;
621 error = vfs_lock_file(file->f_file, F_SETLK, &lock->fl, NULL); 621 error = vfs_lock_file(file->f_file, F_SETLK, &lock->fl, NULL);
@@ -631,7 +631,7 @@ nlmsvc_unlock(struct nlm_file *file, struct nlm_lock *lock)
631 * The calling procedure must check whether the file can be closed. 631 * The calling procedure must check whether the file can be closed.
632 */ 632 */
633__be32 633__be32
634nlmsvc_cancel_blocked(struct nlm_file *file, struct nlm_lock *lock) 634nlmsvc_cancel_blocked(struct net *net, struct nlm_file *file, struct nlm_lock *lock)
635{ 635{
636 struct nlm_block *block; 636 struct nlm_block *block;
637 int status = 0; 637 int status = 0;
@@ -643,7 +643,7 @@ nlmsvc_cancel_blocked(struct nlm_file *file, struct nlm_lock *lock)
643 (long long)lock->fl.fl_start, 643 (long long)lock->fl.fl_start,
644 (long long)lock->fl.fl_end); 644 (long long)lock->fl.fl_end);
645 645
646 if (locks_in_grace()) 646 if (locks_in_grace(net))
647 return nlm_lck_denied_grace_period; 647 return nlm_lck_denied_grace_period;
648 648
649 mutex_lock(&file->f_mutex); 649 mutex_lock(&file->f_mutex);
diff --git a/fs/lockd/svcproc.c b/fs/lockd/svcproc.c
index d27aab11f324..de8f2caa2235 100644
--- a/fs/lockd/svcproc.c
+++ b/fs/lockd/svcproc.c
@@ -11,6 +11,7 @@
11#include <linux/time.h> 11#include <linux/time.h>
12#include <linux/lockd/lockd.h> 12#include <linux/lockd/lockd.h>
13#include <linux/lockd/share.h> 13#include <linux/lockd/share.h>
14#include <linux/sunrpc/svc_xprt.h>
14 15
15#define NLMDBG_FACILITY NLMDBG_CLIENT 16#define NLMDBG_FACILITY NLMDBG_CLIENT
16 17
@@ -175,13 +176,14 @@ nlmsvc_proc_cancel(struct svc_rqst *rqstp, struct nlm_args *argp,
175{ 176{
176 struct nlm_host *host; 177 struct nlm_host *host;
177 struct nlm_file *file; 178 struct nlm_file *file;
179 struct net *net = SVC_NET(rqstp);
178 180
179 dprintk("lockd: CANCEL called\n"); 181 dprintk("lockd: CANCEL called\n");
180 182
181 resp->cookie = argp->cookie; 183 resp->cookie = argp->cookie;
182 184
183 /* Don't accept requests during grace period */ 185 /* Don't accept requests during grace period */
184 if (locks_in_grace()) { 186 if (locks_in_grace(net)) {
185 resp->status = nlm_lck_denied_grace_period; 187 resp->status = nlm_lck_denied_grace_period;
186 return rpc_success; 188 return rpc_success;
187 } 189 }
@@ -191,7 +193,7 @@ nlmsvc_proc_cancel(struct svc_rqst *rqstp, struct nlm_args *argp,
191 return resp->status == nlm_drop_reply ? rpc_drop_reply :rpc_success; 193 return resp->status == nlm_drop_reply ? rpc_drop_reply :rpc_success;
192 194
193 /* Try to cancel request. */ 195 /* Try to cancel request. */
194 resp->status = cast_status(nlmsvc_cancel_blocked(file, &argp->lock)); 196 resp->status = cast_status(nlmsvc_cancel_blocked(net, file, &argp->lock));
195 197
196 dprintk("lockd: CANCEL status %d\n", ntohl(resp->status)); 198 dprintk("lockd: CANCEL status %d\n", ntohl(resp->status));
197 nlmsvc_release_host(host); 199 nlmsvc_release_host(host);
@@ -208,13 +210,14 @@ nlmsvc_proc_unlock(struct svc_rqst *rqstp, struct nlm_args *argp,
208{ 210{
209 struct nlm_host *host; 211 struct nlm_host *host;
210 struct nlm_file *file; 212 struct nlm_file *file;
213 struct net *net = SVC_NET(rqstp);
211 214
212 dprintk("lockd: UNLOCK called\n"); 215 dprintk("lockd: UNLOCK called\n");
213 216
214 resp->cookie = argp->cookie; 217 resp->cookie = argp->cookie;
215 218
216 /* Don't accept new lock requests during grace period */ 219 /* Don't accept new lock requests during grace period */
217 if (locks_in_grace()) { 220 if (locks_in_grace(net)) {
218 resp->status = nlm_lck_denied_grace_period; 221 resp->status = nlm_lck_denied_grace_period;
219 return rpc_success; 222 return rpc_success;
220 } 223 }
@@ -224,7 +227,7 @@ nlmsvc_proc_unlock(struct svc_rqst *rqstp, struct nlm_args *argp,
224 return resp->status == nlm_drop_reply ? rpc_drop_reply :rpc_success; 227 return resp->status == nlm_drop_reply ? rpc_drop_reply :rpc_success;
225 228
226 /* Now try to remove the lock */ 229 /* Now try to remove the lock */
227 resp->status = cast_status(nlmsvc_unlock(file, &argp->lock)); 230 resp->status = cast_status(nlmsvc_unlock(net, file, &argp->lock));
228 231
229 dprintk("lockd: UNLOCK status %d\n", ntohl(resp->status)); 232 dprintk("lockd: UNLOCK status %d\n", ntohl(resp->status));
230 nlmsvc_release_host(host); 233 nlmsvc_release_host(host);
@@ -361,7 +364,7 @@ nlmsvc_proc_share(struct svc_rqst *rqstp, struct nlm_args *argp,
361 resp->cookie = argp->cookie; 364 resp->cookie = argp->cookie;
362 365
363 /* Don't accept new lock requests during grace period */ 366 /* Don't accept new lock requests during grace period */
364 if (locks_in_grace() && !argp->reclaim) { 367 if (locks_in_grace(SVC_NET(rqstp)) && !argp->reclaim) {
365 resp->status = nlm_lck_denied_grace_period; 368 resp->status = nlm_lck_denied_grace_period;
366 return rpc_success; 369 return rpc_success;
367 } 370 }
@@ -394,7 +397,7 @@ nlmsvc_proc_unshare(struct svc_rqst *rqstp, struct nlm_args *argp,
394 resp->cookie = argp->cookie; 397 resp->cookie = argp->cookie;
395 398
396 /* Don't accept requests during grace period */ 399 /* Don't accept requests during grace period */
397 if (locks_in_grace()) { 400 if (locks_in_grace(SVC_NET(rqstp))) {
398 resp->status = nlm_lck_denied_grace_period; 401 resp->status = nlm_lck_denied_grace_period;
399 return rpc_success; 402 return rpc_success;
400 } 403 }
diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c
index 987e719fbae8..c9c1c0a25417 100644
--- a/fs/nfsd/nfs4proc.c
+++ b/fs/nfsd/nfs4proc.c
@@ -354,10 +354,10 @@ nfsd4_open(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
354 /* Openowner is now set, so sequence id will get bumped. Now we need 354 /* Openowner is now set, so sequence id will get bumped. Now we need
355 * these checks before we do any creates: */ 355 * these checks before we do any creates: */
356 status = nfserr_grace; 356 status = nfserr_grace;
357 if (locks_in_grace() && open->op_claim_type != NFS4_OPEN_CLAIM_PREVIOUS) 357 if (locks_in_grace(SVC_NET(rqstp)) && open->op_claim_type != NFS4_OPEN_CLAIM_PREVIOUS)
358 goto out; 358 goto out;
359 status = nfserr_no_grace; 359 status = nfserr_no_grace;
360 if (!locks_in_grace() && open->op_claim_type == NFS4_OPEN_CLAIM_PREVIOUS) 360 if (!locks_in_grace(SVC_NET(rqstp)) && open->op_claim_type == NFS4_OPEN_CLAIM_PREVIOUS)
361 goto out; 361 goto out;
362 362
363 switch (open->op_claim_type) { 363 switch (open->op_claim_type) {
@@ -686,7 +686,8 @@ nfsd4_read(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
686 686
687 nfs4_lock_state(); 687 nfs4_lock_state();
688 /* check stateid */ 688 /* check stateid */
689 if ((status = nfs4_preprocess_stateid_op(cstate, &read->rd_stateid, 689 if ((status = nfs4_preprocess_stateid_op(SVC_NET(rqstp),
690 cstate, &read->rd_stateid,
690 RD_STATE, &read->rd_filp))) { 691 RD_STATE, &read->rd_filp))) {
691 dprintk("NFSD: nfsd4_read: couldn't process stateid!\n"); 692 dprintk("NFSD: nfsd4_read: couldn't process stateid!\n");
692 goto out; 693 goto out;
@@ -741,7 +742,7 @@ nfsd4_remove(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
741{ 742{
742 __be32 status; 743 __be32 status;
743 744
744 if (locks_in_grace()) 745 if (locks_in_grace(SVC_NET(rqstp)))
745 return nfserr_grace; 746 return nfserr_grace;
746 status = nfsd_unlink(rqstp, &cstate->current_fh, 0, 747 status = nfsd_unlink(rqstp, &cstate->current_fh, 0,
747 remove->rm_name, remove->rm_namelen); 748 remove->rm_name, remove->rm_namelen);
@@ -760,8 +761,8 @@ nfsd4_rename(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
760 761
761 if (!cstate->save_fh.fh_dentry) 762 if (!cstate->save_fh.fh_dentry)
762 return status; 763 return status;
763 if (locks_in_grace() && !(cstate->save_fh.fh_export->ex_flags 764 if (locks_in_grace(SVC_NET(rqstp)) &&
764 & NFSEXP_NOSUBTREECHECK)) 765 !(cstate->save_fh.fh_export->ex_flags & NFSEXP_NOSUBTREECHECK))
765 return nfserr_grace; 766 return nfserr_grace;
766 status = nfsd_rename(rqstp, &cstate->save_fh, rename->rn_sname, 767 status = nfsd_rename(rqstp, &cstate->save_fh, rename->rn_sname,
767 rename->rn_snamelen, &cstate->current_fh, 768 rename->rn_snamelen, &cstate->current_fh,
@@ -845,7 +846,7 @@ nfsd4_setattr(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
845 846
846 if (setattr->sa_iattr.ia_valid & ATTR_SIZE) { 847 if (setattr->sa_iattr.ia_valid & ATTR_SIZE) {
847 nfs4_lock_state(); 848 nfs4_lock_state();
848 status = nfs4_preprocess_stateid_op(cstate, 849 status = nfs4_preprocess_stateid_op(SVC_NET(rqstp), cstate,
849 &setattr->sa_stateid, WR_STATE, NULL); 850 &setattr->sa_stateid, WR_STATE, NULL);
850 nfs4_unlock_state(); 851 nfs4_unlock_state();
851 if (status) { 852 if (status) {
@@ -890,7 +891,8 @@ nfsd4_write(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
890 return nfserr_inval; 891 return nfserr_inval;
891 892
892 nfs4_lock_state(); 893 nfs4_lock_state();
893 status = nfs4_preprocess_stateid_op(cstate, stateid, WR_STATE, &filp); 894 status = nfs4_preprocess_stateid_op(SVC_NET(rqstp),
895 cstate, stateid, WR_STATE, &filp);
894 if (filp) 896 if (filp)
895 get_file(filp); 897 get_file(filp);
896 nfs4_unlock_state(); 898 nfs4_unlock_state();
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index 4a44b50c2f58..34f65f10fa43 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -2885,7 +2885,8 @@ static void nfsd4_open_deleg_none_ext(struct nfsd4_open *open, int status)
2885 * Attempt to hand out a delegation. 2885 * Attempt to hand out a delegation.
2886 */ 2886 */
2887static void 2887static void
2888nfs4_open_delegation(struct svc_fh *fh, struct nfsd4_open *open, struct nfs4_ol_stateid *stp) 2888nfs4_open_delegation(struct net *net, struct svc_fh *fh,
2889 struct nfsd4_open *open, struct nfs4_ol_stateid *stp)
2889{ 2890{
2890 struct nfs4_delegation *dp; 2891 struct nfs4_delegation *dp;
2891 struct nfs4_openowner *oo = container_of(stp->st_stateowner, struct nfs4_openowner, oo_owner); 2892 struct nfs4_openowner *oo = container_of(stp->st_stateowner, struct nfs4_openowner, oo_owner);
@@ -2906,7 +2907,7 @@ nfs4_open_delegation(struct svc_fh *fh, struct nfsd4_open *open, struct nfs4_ol_
2906 case NFS4_OPEN_CLAIM_NULL: 2907 case NFS4_OPEN_CLAIM_NULL:
2907 /* Let's not give out any delegations till everyone's 2908 /* Let's not give out any delegations till everyone's
2908 * had the chance to reclaim theirs.... */ 2909 * had the chance to reclaim theirs.... */
2909 if (locks_in_grace()) 2910 if (locks_in_grace(net))
2910 goto out; 2911 goto out;
2911 if (!cb_up || !(oo->oo_flags & NFS4_OO_CONFIRMED)) 2912 if (!cb_up || !(oo->oo_flags & NFS4_OO_CONFIRMED))
2912 goto out; 2913 goto out;
@@ -3040,7 +3041,7 @@ nfsd4_process_open2(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nf
3040 * Attempt to hand out a delegation. No error return, because the 3041 * Attempt to hand out a delegation. No error return, because the
3041 * OPEN succeeds even if we fail. 3042 * OPEN succeeds even if we fail.
3042 */ 3043 */
3043 nfs4_open_delegation(current_fh, open, stp); 3044 nfs4_open_delegation(SVC_NET(rqstp), current_fh, open, stp);
3044nodeleg: 3045nodeleg:
3045 status = nfs_ok; 3046 status = nfs_ok;
3046 3047
@@ -3279,11 +3280,11 @@ out:
3279} 3280}
3280 3281
3281static inline __be32 3282static inline __be32
3282check_special_stateids(svc_fh *current_fh, stateid_t *stateid, int flags) 3283check_special_stateids(struct net *net, svc_fh *current_fh, stateid_t *stateid, int flags)
3283{ 3284{
3284 if (ONE_STATEID(stateid) && (flags & RD_STATE)) 3285 if (ONE_STATEID(stateid) && (flags & RD_STATE))
3285 return nfs_ok; 3286 return nfs_ok;
3286 else if (locks_in_grace()) { 3287 else if (locks_in_grace(net)) {
3287 /* Answer in remaining cases depends on existence of 3288 /* Answer in remaining cases depends on existence of
3288 * conflicting state; so we must wait out the grace period. */ 3289 * conflicting state; so we must wait out the grace period. */
3289 return nfserr_grace; 3290 return nfserr_grace;
@@ -3300,9 +3301,9 @@ check_special_stateids(svc_fh *current_fh, stateid_t *stateid, int flags)
3300 * that are not able to provide mandatory locking. 3301 * that are not able to provide mandatory locking.
3301 */ 3302 */
3302static inline int 3303static inline int
3303grace_disallows_io(struct inode *inode) 3304grace_disallows_io(struct net *net, struct inode *inode)
3304{ 3305{
3305 return locks_in_grace() && mandatory_lock(inode); 3306 return locks_in_grace(net) && mandatory_lock(inode);
3306} 3307}
3307 3308
3308/* Returns true iff a is later than b: */ 3309/* Returns true iff a is later than b: */
@@ -3393,7 +3394,7 @@ static __be32 nfsd4_lookup_stateid(stateid_t *stateid, unsigned char typemask, s
3393* Checks for stateid operations 3394* Checks for stateid operations
3394*/ 3395*/
3395__be32 3396__be32
3396nfs4_preprocess_stateid_op(struct nfsd4_compound_state *cstate, 3397nfs4_preprocess_stateid_op(struct net *net, struct nfsd4_compound_state *cstate,
3397 stateid_t *stateid, int flags, struct file **filpp) 3398 stateid_t *stateid, int flags, struct file **filpp)
3398{ 3399{
3399 struct nfs4_stid *s; 3400 struct nfs4_stid *s;
@@ -3406,11 +3407,11 @@ nfs4_preprocess_stateid_op(struct nfsd4_compound_state *cstate,
3406 if (filpp) 3407 if (filpp)
3407 *filpp = NULL; 3408 *filpp = NULL;
3408 3409
3409 if (grace_disallows_io(ino)) 3410 if (grace_disallows_io(net, ino))
3410 return nfserr_grace; 3411 return nfserr_grace;
3411 3412
3412 if (ZERO_STATEID(stateid) || ONE_STATEID(stateid)) 3413 if (ZERO_STATEID(stateid) || ONE_STATEID(stateid))
3413 return check_special_stateids(current_fh, stateid, flags); 3414 return check_special_stateids(net, current_fh, stateid, flags);
3414 3415
3415 status = nfsd4_lookup_stateid(stateid, NFS4_DELEG_STID|NFS4_OPEN_STID|NFS4_LOCK_STID, &s); 3416 status = nfsd4_lookup_stateid(stateid, NFS4_DELEG_STID|NFS4_OPEN_STID|NFS4_LOCK_STID, &s);
3416 if (status) 3417 if (status)
@@ -4107,10 +4108,10 @@ nfsd4_lock(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
4107 goto out; 4108 goto out;
4108 4109
4109 status = nfserr_grace; 4110 status = nfserr_grace;
4110 if (locks_in_grace() && !lock->lk_reclaim) 4111 if (locks_in_grace(SVC_NET(rqstp)) && !lock->lk_reclaim)
4111 goto out; 4112 goto out;
4112 status = nfserr_no_grace; 4113 status = nfserr_no_grace;
4113 if (!locks_in_grace() && lock->lk_reclaim) 4114 if (!locks_in_grace(SVC_NET(rqstp)) && lock->lk_reclaim)
4114 goto out; 4115 goto out;
4115 4116
4116 locks_init_lock(&file_lock); 4117 locks_init_lock(&file_lock);
@@ -4210,7 +4211,7 @@ nfsd4_lockt(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
4210 struct nfs4_lockowner *lo; 4211 struct nfs4_lockowner *lo;
4211 __be32 status; 4212 __be32 status;
4212 4213
4213 if (locks_in_grace()) 4214 if (locks_in_grace(SVC_NET(rqstp)))
4214 return nfserr_grace; 4215 return nfserr_grace;
4215 4216
4216 if (check_lock_length(lockt->lt_offset, lockt->lt_length)) 4217 if (check_lock_length(lockt->lt_offset, lockt->lt_length))
@@ -4703,7 +4704,7 @@ nfs4_state_start(void)
4703 get_net(net); 4704 get_net(net);
4704 nfsd4_client_tracking_init(net); 4705 nfsd4_client_tracking_init(net);
4705 boot_time = get_seconds(); 4706 boot_time = get_seconds();
4706 locks_start_grace(&nn->nfsd4_manager); 4707 locks_start_grace(net, &nn->nfsd4_manager);
4707 grace_ended = false; 4708 grace_ended = false;
4708 printk(KERN_INFO "NFSD: starting %ld-second grace period\n", 4709 printk(KERN_INFO "NFSD: starting %ld-second grace period\n",
4709 nfsd4_grace); 4710 nfsd4_grace);
diff --git a/fs/nfsd/state.h b/fs/nfsd/state.h
index 495df4e3aa67..981ef10141b3 100644
--- a/fs/nfsd/state.h
+++ b/fs/nfsd/state.h
@@ -451,7 +451,8 @@ static inline struct nfs4_ol_stateid *openlockstateid(struct nfs4_stid *s)
451 451
452struct nfsd4_compound_state; 452struct nfsd4_compound_state;
453 453
454extern __be32 nfs4_preprocess_stateid_op(struct nfsd4_compound_state *cstate, 454extern __be32 nfs4_preprocess_stateid_op(struct net *net,
455 struct nfsd4_compound_state *cstate,
455 stateid_t *stateid, int flags, struct file **filp); 456 stateid_t *stateid, int flags, struct file **filp);
456extern void nfs4_lock_state(void); 457extern void nfs4_lock_state(void);
457extern void nfs4_unlock_state(void); 458extern void nfs4_unlock_state(void);
diff --git a/include/linux/fs.h b/include/linux/fs.h
index 17fd887c798f..a1e77270f5a5 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -1163,9 +1163,10 @@ struct lock_manager {
1163 struct list_head list; 1163 struct list_head list;
1164}; 1164};
1165 1165
1166void locks_start_grace(struct lock_manager *); 1166struct net;
1167void locks_start_grace(struct net *, struct lock_manager *);
1167void locks_end_grace(struct lock_manager *); 1168void locks_end_grace(struct lock_manager *);
1168int locks_in_grace(void); 1169int locks_in_grace(struct net *);
1169 1170
1170/* that will die - we need it for nfs_lock_info */ 1171/* that will die - we need it for nfs_lock_info */
1171#include <linux/nfs_fs_i.h> 1172#include <linux/nfs_fs_i.h>
diff --git a/include/linux/lockd/lockd.h b/include/linux/lockd/lockd.h
index 50e31a2c1a97..f5a051a79273 100644
--- a/include/linux/lockd/lockd.h
+++ b/include/linux/lockd/lockd.h
@@ -262,11 +262,11 @@ typedef int (*nlm_host_match_fn_t)(void *cur, struct nlm_host *ref);
262__be32 nlmsvc_lock(struct svc_rqst *, struct nlm_file *, 262__be32 nlmsvc_lock(struct svc_rqst *, struct nlm_file *,
263 struct nlm_host *, struct nlm_lock *, int, 263 struct nlm_host *, struct nlm_lock *, int,
264 struct nlm_cookie *, int); 264 struct nlm_cookie *, int);
265__be32 nlmsvc_unlock(struct nlm_file *, struct nlm_lock *); 265__be32 nlmsvc_unlock(struct net *net, struct nlm_file *, struct nlm_lock *);
266__be32 nlmsvc_testlock(struct svc_rqst *, struct nlm_file *, 266__be32 nlmsvc_testlock(struct svc_rqst *, struct nlm_file *,
267 struct nlm_host *, struct nlm_lock *, 267 struct nlm_host *, struct nlm_lock *,
268 struct nlm_lock *, struct nlm_cookie *); 268 struct nlm_lock *, struct nlm_cookie *);
269__be32 nlmsvc_cancel_blocked(struct nlm_file *, struct nlm_lock *); 269__be32 nlmsvc_cancel_blocked(struct net *net, struct nlm_file *, struct nlm_lock *);
270unsigned long nlmsvc_retry_blocked(void); 270unsigned long nlmsvc_retry_blocked(void);
271void nlmsvc_traverse_blocks(struct nlm_host *, struct nlm_file *, 271void nlmsvc_traverse_blocks(struct nlm_host *, struct nlm_file *,
272 nlm_host_match_fn_t match); 272 nlm_host_match_fn_t match);