提交 f3c7691e 编写于 作者: J J. Bruce Fields 提交者: root

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: NJ. Bruce Fields <bfields@redhat.com>
Signed-off-by: NChristoph Hellwig <hch@lst.de>
上级 79835a71
...@@ -2035,10 +2035,7 @@ static int may_open(struct path *path, int acc_mode, int flag) ...@@ -2035,10 +2035,7 @@ static int may_open(struct path *path, int acc_mode, int flag)
if (flag & O_NOATIME && !inode_owner_or_capable(inode)) if (flag & O_NOATIME && !inode_owner_or_capable(inode))
return -EPERM; return -EPERM;
/* return 0;
* Ensure there are no outstanding leases on the file.
*/
return break_lease(inode, flag);
} }
static int handle_truncate(struct file *filp) static int handle_truncate(struct file *filp)
......
...@@ -685,6 +685,10 @@ static struct file *__dentry_open(struct dentry *dentry, struct vfsmount *mnt, ...@@ -685,6 +685,10 @@ static struct file *__dentry_open(struct dentry *dentry, struct vfsmount *mnt,
if (error) if (error)
goto cleanup_all; goto cleanup_all;
error = break_lease(inode, f->f_flags);
if (error)
goto cleanup_all;
if (!open && f->f_op) if (!open && f->f_op)
open = f->f_op->open; open = f->f_op->open;
if (open) { if (open) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册