[PATCH] nfsd4: fix fh_expire_type
authorNeilBrown <neilb@cse.unsw.edu.au>
Fri, 24 Jun 2005 05:02:58 +0000 (22:02 -0700)
committerLinus Torvalds <torvalds@ppc970.osdl.org>
Fri, 24 Jun 2005 07:06:28 +0000 (00:06 -0700)
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>
fs/nfsd/nfs4xdr.c
include/linux/nfs4.h

index 36a058a112d57e261e7eded168b01da0f6d7274c..0ae1467c3bc3f7def4048118dc42ecf68ca7d615 100644 (file)
@@ -1366,7 +1366,10 @@ nfsd4_encode_fattr(struct svc_fh *fhp, struct svc_export *exp,
        if (bmval0 & FATTR4_WORD0_FH_EXPIRE_TYPE) {
                if ((buflen -= 4) < 0)
                        goto out_resource;
-               WRITE32( NFS4_FH_NOEXPIRE_WITH_OPEN | NFS4_FH_VOL_RENAME );
+               if (exp->ex_flags & NFSEXP_NOSUBTREECHECK)
+                       WRITE32(NFS4_FH_VOLATILE_ANY);
+               else
+                       WRITE32(NFS4_FH_VOLATILE_ANY|NFS4_FH_VOL_RENAME);
        }
        if (bmval0 & FATTR4_WORD0_CHANGE) {
                /*
index 5bb5b2fd7ba21edb9585b6495754239cecfa7cb3..0c1c306cdaec7e77749319f68978e8785d2486dd 100644 (file)
@@ -28,7 +28,7 @@
 #define NFS4_ACCESS_DELETE      0x0010
 #define NFS4_ACCESS_EXECUTE     0x0020
 
-#define NFS4_FH_PERISTENT              0x0000
+#define NFS4_FH_PERSISTENT             0x0000
 #define NFS4_FH_NOEXPIRE_WITH_OPEN     0x0001
 #define NFS4_FH_VOLATILE_ANY           0x0002
 #define NFS4_FH_VOL_MIGRATION          0x0004