diff options
author | NeilBrown <neilb@cse.unsw.edu.au> | 2005-06-24 01:02:58 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-06-24 03:06:28 -0400 |
commit | 496400014f22c4dbdbc1e89249a2feba46939708 (patch) | |
tree | 1d05116cef2e6ecfeef9fab0a733a9f2cf2a18e3 | |
parent | 0dd3c19212961453817f219cd6200981c38564bc (diff) |
[PATCH] nfsd4: fix fh_expire_type
We're returning NFS4_FH_NOEXPIRE_WITH_OPEN | NFS4_FH_VOL_RENAME for the
fh_expire_type attribute. This is incorrect:
1. The spec actually only allows NOEXPIRE_WITH_OPEN when
VOLATILE_ANY is also set.
2. Filehandles for open files can expire, if the file is removed
and there is a reboot.
3. Filehandles are only volatile on rename in the nosubtree check
case.
Unfortunately, there's no way to indicate that we only expire on remove. So
our only choice is FH4_VOLATILE_ANY. Although it's redundant, we also set
FH4_VOL_RENAME in the subtree check case, since subtreecheck does actually
cause problems in practice and it seems possibly useful to give clients some
way to distinguish that case.
Fix a mispelled #define while we're at it.
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/nfs4xdr.c | 5 | ||||
-rw-r--r-- | include/linux/nfs4.h | 2 |
2 files changed, 5 insertions, 2 deletions
diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c index 36a058a112d..0ae1467c3bc 100644 --- a/fs/nfsd/nfs4xdr.c +++ b/fs/nfsd/nfs4xdr.c | |||
@@ -1366,7 +1366,10 @@ nfsd4_encode_fattr(struct svc_fh *fhp, struct svc_export *exp, | |||
1366 | if (bmval0 & FATTR4_WORD0_FH_EXPIRE_TYPE) { | 1366 | if (bmval0 & FATTR4_WORD0_FH_EXPIRE_TYPE) { |
1367 | if ((buflen -= 4) < 0) | 1367 | if ((buflen -= 4) < 0) |
1368 | goto out_resource; | 1368 | goto out_resource; |
1369 | WRITE32( NFS4_FH_NOEXPIRE_WITH_OPEN | NFS4_FH_VOL_RENAME ); | 1369 | if (exp->ex_flags & NFSEXP_NOSUBTREECHECK) |
1370 | WRITE32(NFS4_FH_VOLATILE_ANY); | ||
1371 | else | ||
1372 | WRITE32(NFS4_FH_VOLATILE_ANY|NFS4_FH_VOL_RENAME); | ||
1370 | } | 1373 | } |
1371 | if (bmval0 & FATTR4_WORD0_CHANGE) { | 1374 | if (bmval0 & FATTR4_WORD0_CHANGE) { |
1372 | /* | 1375 | /* |
diff --git a/include/linux/nfs4.h b/include/linux/nfs4.h index 5bb5b2fd7ba..0c1c306cdae 100644 --- a/include/linux/nfs4.h +++ b/include/linux/nfs4.h | |||
@@ -28,7 +28,7 @@ | |||
28 | #define NFS4_ACCESS_DELETE 0x0010 | 28 | #define NFS4_ACCESS_DELETE 0x0010 |
29 | #define NFS4_ACCESS_EXECUTE 0x0020 | 29 | #define NFS4_ACCESS_EXECUTE 0x0020 |
30 | 30 | ||
31 | #define NFS4_FH_PERISTENT 0x0000 | 31 | #define NFS4_FH_PERSISTENT 0x0000 |
32 | #define NFS4_FH_NOEXPIRE_WITH_OPEN 0x0001 | 32 | #define NFS4_FH_NOEXPIRE_WITH_OPEN 0x0001 |
33 | #define NFS4_FH_VOLATILE_ANY 0x0002 | 33 | #define NFS4_FH_VOLATILE_ANY 0x0002 |
34 | #define NFS4_FH_VOL_MIGRATION 0x0004 | 34 | #define NFS4_FH_VOL_MIGRATION 0x0004 |