aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeilBrown <neilb@cse.unsw.edu.au>2005-06-24 01:03:00 -0400
committerLinus Torvalds <torvalds@ppc970.osdl.org>2005-06-24 03:06:28 -0400
commitc815afc73eeef089922449857ca4ed4d2e8950cb (patch)
tree7cdaa0ab416d54b1966c399f61b05510b6d7c7a9
parent496400014f22c4dbdbc1e89249a2feba46939708 (diff)
[PATCH] nfsd4: block metadata ops during grace period
We currently return err_grace if a user attempts a non-reclaim open during the grace period. But we also need to prevent renames and removes, at least, to ensure clients have the chance to recover state on files before they are moved or deleted. Of course, local users could also do renames and removes during the lease period, and there's not much we can do about that. This at least will help with remote users. Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu> Signed-off-by: Neil Brown <neilb@cse.unsw.edu.au> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r--fs/nfsd/nfs4proc.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c
index eb8c1337d9ba..ac4878ac2213 100644
--- a/fs/nfsd/nfs4proc.c
+++ b/fs/nfsd/nfs4proc.c
@@ -536,6 +536,8 @@ nfsd4_remove(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfsd4_rem
536{ 536{
537 int status; 537 int status;
538 538
539 if (nfs4_in_grace())
540 return nfserr_grace;
539 status = nfsd_unlink(rqstp, current_fh, 0, remove->rm_name, remove->rm_namelen); 541 status = nfsd_unlink(rqstp, current_fh, 0, remove->rm_name, remove->rm_namelen);
540 if (status == nfserr_symlink) 542 if (status == nfserr_symlink)
541 return nfserr_notdir; 543 return nfserr_notdir;
@@ -554,6 +556,9 @@ nfsd4_rename(struct svc_rqst *rqstp, struct svc_fh *current_fh,
554 556
555 if (!save_fh->fh_dentry) 557 if (!save_fh->fh_dentry)
556 return status; 558 return status;
559 if (nfs4_in_grace() && !(save_fh->fh_export->ex_flags
560 & NFSEXP_NOSUBTREECHECK))
561 return nfserr_grace;
557 status = nfsd_rename(rqstp, save_fh, rename->rn_sname, 562 status = nfsd_rename(rqstp, save_fh, rename->rn_sname,
558 rename->rn_snamelen, current_fh, 563 rename->rn_snamelen, current_fh,
559 rename->rn_tname, rename->rn_tnamelen); 564 rename->rn_tname, rename->rn_tnamelen);