diff options
author | J. Bruce Fields <bfields@redhat.com> | 2010-08-21 00:09:31 +0200 |
---|---|---|
committer | J. Bruce Fields <bfields@redhat.com> | 2010-08-26 19:22:02 +0200 |
commit | 7d94784293096c0a46897acdb83be5abd9278ece (patch) | |
tree | da2bc54b7d2527b465833610d80ec0285b90c8a7 /fs/nfsd/state.h | |
parent | nfsd4: typo fix in find_any_file (diff) | |
download | linux-7d94784293096c0a46897acdb83be5abd9278ece.tar.xz linux-7d94784293096c0a46897acdb83be5abd9278ece.zip |
nfsd4: fix downgrade/lock logic
If we already had a RW open for a file, and get a readonly open, we were
piggybacking on the existing RW open. That's inconsistent with the
downgrade logic which blows away the RW open assuming you'll still have
a readonly open.
Also, make sure there is a readonly or writeonly open available for
locking, again to prevent bad behavior in downgrade cases when any RW
open may be lost.
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
Diffstat (limited to 'fs/nfsd/state.h')
-rw-r--r-- | fs/nfsd/state.h | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/fs/nfsd/state.h b/fs/nfsd/state.h index 84579c86b13d..322518c88e4b 100644 --- a/fs/nfsd/state.h +++ b/fs/nfsd/state.h @@ -363,16 +363,16 @@ struct nfs4_file { * at all? */ static inline struct file *find_writeable_file(struct nfs4_file *f) { - if (f->fi_fds[O_RDWR]) - return f->fi_fds[O_RDWR]; - return f->fi_fds[O_WRONLY]; + if (f->fi_fds[O_WRONLY]) + return f->fi_fds[O_WRONLY]; + return f->fi_fds[O_RDWR]; } static inline struct file *find_readable_file(struct nfs4_file *f) { - if (f->fi_fds[O_RDWR]) - return f->fi_fds[O_RDWR]; - return f->fi_fds[O_RDONLY]; + if (f->fi_fds[O_RDONLY]) + return f->fi_fds[O_RDONLY]; + return f->fi_fds[O_RDWR]; } static inline struct file *find_any_file(struct nfs4_file *f) |