diff options
author | Trond Myklebust <Trond.Myklebust@netapp.com> | 2005-11-04 15:33:38 -0500 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2005-11-04 15:33:38 -0500 |
commit | d530838bfa507d67b40d13b00d9cbd7a46a47e78 (patch) | |
tree | f4b2be26c0a7b9ed3233a2be016b7e97427f8705 /fs/nfs/read.c | |
parent | 4cecb76ff86db46d2823550256c828b6597f418e (diff) |
NFSv4: Fix problem with OPEN_DOWNGRADE
RFC 3530 states that for OPEN_DOWNGRADE "The share_access and share_deny
bits specified must be exactly equal to the union of the share_access and
share_deny bits specified for some subset of the OPENs in effect for
current openowner on the current file.
Setattr is currently violating the NFSv4 rules for OPEN_DOWNGRADE in that
it may cause a downgrade from OPEN4_SHARE_ACCESS_BOTH to
OPEN4_SHARE_ACCESS_WRITE despite the fact that there exists no open file
with O_WRONLY access mode.
Fix the problem by replacing nfs4_find_state() with a modified version of
nfs_find_open_context().
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'fs/nfs/read.c')
-rw-r--r-- | fs/nfs/read.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/fs/nfs/read.c b/fs/nfs/read.c index 43b03b19731b..5f20eafba8ec 100644 --- a/fs/nfs/read.c +++ b/fs/nfs/read.c | |||
@@ -507,7 +507,7 @@ int nfs_readpage(struct file *file, struct page *page) | |||
507 | goto out_error; | 507 | goto out_error; |
508 | 508 | ||
509 | if (file == NULL) { | 509 | if (file == NULL) { |
510 | ctx = nfs_find_open_context(inode, FMODE_READ); | 510 | ctx = nfs_find_open_context(inode, NULL, FMODE_READ); |
511 | if (ctx == NULL) | 511 | if (ctx == NULL) |
512 | return -EBADF; | 512 | return -EBADF; |
513 | } else | 513 | } else |
@@ -576,7 +576,7 @@ int nfs_readpages(struct file *filp, struct address_space *mapping, | |||
576 | nr_pages); | 576 | nr_pages); |
577 | 577 | ||
578 | if (filp == NULL) { | 578 | if (filp == NULL) { |
579 | desc.ctx = nfs_find_open_context(inode, FMODE_READ); | 579 | desc.ctx = nfs_find_open_context(inode, NULL, FMODE_READ); |
580 | if (desc.ctx == NULL) | 580 | if (desc.ctx == NULL) |
581 | return -EBADF; | 581 | return -EBADF; |
582 | } else | 582 | } else |