Re: [PATCH 3/4] NFSv4 _nfs4_do_setattr use zero stateid on lost lock

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mar 5, 2014, at 3:51, Andy Adamson <androsadamson@xxxxxxxxx> wrote:

> On Tue, Mar 4, 2014 at 1:42 PM, Trond Myklebust
> <trond.myklebust@xxxxxxxxxxxxxxx> wrote:
>> On Tue, 2014-03-04 at 12:31 -0500, andros@xxxxxxxxxx wrote:
>>> From: Andy Adamson <andros@xxxxxxxxxx>
>>> 
>>> Use the zero stateid if nfs4_select_rw_stateid indicates a lost lock (-EIO)
>>> 
>>> Signed-off-by: Andy Adamson <andros@xxxxxxxxxx>
>>> ---
>>> fs/nfs/nfs4proc.c | 18 +++++++++++-------
>>> 1 file changed, 11 insertions(+), 7 deletions(-)
>>> 
>>> diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
>>> index de8e7f5..efe940c 100644
>>> --- a/fs/nfs/nfs4proc.c
>>> +++ b/fs/nfs/nfs4proc.c
>>> @@ -2458,18 +2458,22 @@ static int _nfs4_do_setattr(struct inode *inode, struct rpc_cred *cred,
>>>      truncate = (sattr->ia_valid & ATTR_SIZE) ? true : false;
>>>      fmode = truncate ? FMODE_WRITE : FMODE_READ;
>>> 
>>> -     if (nfs4_copy_delegation_stateid(&arg.stateid, inode, fmode)) {
>>> -             /* Use that stateid */
>>> -     } else if (truncate && state != NULL && nfs4_valid_open_stateid(state)) {
>>> +     if (nfs4_copy_delegation_stateid(&arg.stateid, inode, fmode))
>>> +             /* Use delegation stateid */
>>> +             goto do_call;
>>> +     if (truncate && state != NULL && nfs4_valid_open_stateid(state)) {
>>>              struct nfs_lockowner lockowner = {
>>>                      .l_owner = current->files,
>>>                      .l_pid = current->tgid,
>>>              };
>>> -             nfs4_select_rw_stateid(&arg.stateid, state, FMODE_WRITE,
>>> -                             &lockowner);
>>> -     } else
>>> -             nfs4_stateid_copy(&arg.stateid, &zero_stateid);
>>> +             /* Use zero stateid if lock is lost (-EIO fall through) */
>>> +             if (nfs4_select_rw_stateid(&arg.stateid, state, FMODE_WRITE,
>>> +                                             &lockowner) != -EIO)
>> 
>> Shouldn't we fail with EBADF instead?
> 
> Hmm. -EIO means lost lock, but not lost file, which is why I say we
> send it with a zero stateid.

If the application has lost the lock that was protecting the data, then why should we think it is safe to allow it to proceed to modify the file by truncating it?
_________________________________
Trond Myklebust
Linux NFS client maintainer, PrimaryData
trond.myklebust@xxxxxxxxxxxxxxx

--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Filesystem Development]     [Linux USB Development]     [Linux Media Development]     [Video for Linux]     [Linux NILFS]     [Linux Audio Users]     [Yosemite Info]     [Linux SCSI]

  Powered by Linux