Recover from stateid-type error on SETATTR
authorOlga Kornievskaia <kolga@netapp.com>
Fri, 12 Jun 2015 20:53:30 +0000 (16:53 -0400)
committerTrond Myklebust <trond.myklebust@primarydata.com>
Tue, 16 Jun 2015 15:29:46 +0000 (11:29 -0400)
Client can receives stateid-type error (eg., BAD_STATEID) on SETATTR when
delegation stateid was used. When no open state exists, in case of application
calling truncate() on the file, client has no state to recover and fails with
EIO.

Instead, upon such error, return the bad delegation and then resend the
SETATTR with a zero stateid.

Signed-off: Olga Kornievskaia <kolga@netapp.com>
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
fs/nfs/nfs4proc.c

index d181090124db79dc47819c3d2c985caac51f02a8..6bcdecd61125b9d74695760a0e2f9e4dfae58322 100644 (file)
@@ -370,8 +370,14 @@ int nfs4_handle_exception(struct nfs_server *server, int errorcode, struct nfs4_
                case -NFS4ERR_DELEG_REVOKED:
                case -NFS4ERR_ADMIN_REVOKED:
                case -NFS4ERR_BAD_STATEID:
-                       if (state == NULL)
+                       if (state == NULL) {
+                               if (inode && nfs4_have_delegation(inode,
+                                               FMODE_READ)) {
+                                       nfs4_inode_return_delegation(inode);
+                                       exception->retry = 1;
+                               }
                                break;
+                       }
                        ret = nfs4_schedule_stateid_recovery(server, state);
                        if (ret < 0)
                                break;