2015-04-21 22:36:41

by Olga Kornievskaia

[permalink] [raw]
Subject: [PATCH 1/1] Recover from stateid-type error on SETATTR

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 <[email protected]>
---
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;
--


2015-04-27 17:48:20

by Olga Kornievskaia

[permalink] [raw]
Subject: Re: [PATCH 1/1] Recover from stateid-type error on SETATTR

Any comments on this patch?

On Tue, Apr 21, 2015 at 6:36 PM, Olga Kornievskaia <[email protected]> wrote:
> 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 <[email protected]>
> ---
> 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;
> --

2015-05-04 16:24:45

by Olga Kornievskaia

[permalink] [raw]
Subject: Re: [PATCH 1/1] Recover from stateid-type error on SETATTR

Trond,

Can you provide comments on this patch? Thanks.

On Mon, Apr 27, 2015 at 1:48 PM, Olga Kornievskaia <[email protected]> wrote:
> Any comments on this patch?
>
> On Tue, Apr 21, 2015 at 6:36 PM, Olga Kornievskaia <[email protected]> wrote:
>> 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 <[email protected]>
>> ---
>> 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;
>> --