Return-Path: Received: from mail-ig0-f174.google.com ([209.85.213.174]:35522 "EHLO mail-ig0-f174.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753466AbbDUWgl (ORCPT ); Tue, 21 Apr 2015 18:36:41 -0400 Received: by igbyr2 with SMTP id yr2so99670651igb.0 for ; Tue, 21 Apr 2015 15:36:41 -0700 (PDT) MIME-Version: 1.0 Date: Tue, 21 Apr 2015 18:36:41 -0400 Message-ID: Subject: [PATCH 1/1] Recover from stateid-type error on SETATTR From: Olga Kornievskaia To: Trond Myklebust , Anna Schumaker Cc: linux-nfs Content-Type: text/plain; charset=UTF-8 Sender: linux-nfs-owner@vger.kernel.org List-ID: 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. In general, when something calls nfs4_handle_exception() with a null state, the operation should be retried after bad delegation is removed. Signed-off: Olga Kornievskaia --- fs/nfs/nfs4proc.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index ad7cf7e..fbde292 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c @@ -360,8 +360,11 @@ static int nfs4_handle_exception(struct nfs_server *server, int errorcode, struc case -NFS4ERR_DELEG_REVOKED: case -NFS4ERR_ADMIN_REVOKED: case -NFS4ERR_BAD_STATEID: - if (state == NULL) + if (state == NULL) { + nfs4_inode_return_delegation(inode); + exception->retry = 1; break; + } ret = nfs4_schedule_stateid_recovery(server, state); if (ret < 0) break; --