diff options
author | J. Bruce Fields <bfields@redhat.com> | 2011-09-21 10:58:13 -0400 |
---|---|---|
committer | root <root@serles.lst.de> | 2011-10-28 08:59:00 -0400 |
commit | f3c7691e8d30d88899b514675c7c86d19057b5fd (patch) | |
tree | 0065bcc05b19a99d8785ce523f992a48fe573e79 /fs/namei.c | |
parent | 79835a710d6ff811659c8de46f89c7577c3b8cc6 (diff) |
leases: fix write-open/read-lease race
In setlease, we use i_writecount to decide whether we can give out a
read lease.
In open, we break leases before incrementing i_writecount.
There is therefore a window between the break lease and the i_writecount
increment when setlease could add a new read lease.
This would leave us with a simultaneous write open and read lease, which
shouldn't happen.
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
Diffstat (limited to 'fs/namei.c')
-rw-r--r-- | fs/namei.c | 5 |
1 files changed, 1 insertions, 4 deletions
diff --git a/fs/namei.c b/fs/namei.c index 9061157e39d6..7657be4352bf 100644 --- a/fs/namei.c +++ b/fs/namei.c | |||
@@ -2035,10 +2035,7 @@ static int may_open(struct path *path, int acc_mode, int flag) | |||
2035 | if (flag & O_NOATIME && !inode_owner_or_capable(inode)) | 2035 | if (flag & O_NOATIME && !inode_owner_or_capable(inode)) |
2036 | return -EPERM; | 2036 | return -EPERM; |
2037 | 2037 | ||
2038 | /* | 2038 | return 0; |
2039 | * Ensure there are no outstanding leases on the file. | ||
2040 | */ | ||
2041 | return break_lease(inode, flag); | ||
2042 | } | 2039 | } |
2043 | 2040 | ||
2044 | static int handle_truncate(struct file *filp) | 2041 | static int handle_truncate(struct file *filp) |