Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[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>

authored by

NeilBrown and committed by
Linus Torvalds
49640001 0dd3c192

+5 -2
+4 -1
fs/nfsd/nfs4xdr.c
··· 1366 1366 if (bmval0 & FATTR4_WORD0_FH_EXPIRE_TYPE) { 1367 1367 if ((buflen -= 4) < 0) 1368 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 1374 if (bmval0 & FATTR4_WORD0_CHANGE) { 1372 1375 /*
+1 -1
include/linux/nfs4.h
··· 28 28 #define NFS4_ACCESS_DELETE 0x0010 29 29 #define NFS4_ACCESS_EXECUTE 0x0020 30 30 31 - #define NFS4_FH_PERISTENT 0x0000 31 + #define NFS4_FH_PERSISTENT 0x0000 32 32 #define NFS4_FH_NOEXPIRE_WITH_OPEN 0x0001 33 33 #define NFS4_FH_VOLATILE_ANY 0x0002 34 34 #define NFS4_FH_VOL_MIGRATION 0x0004