Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f3c7691e authored by J. Bruce Fields's avatar J. Bruce Fields Committed by root
Browse files

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: default avatarJ. Bruce Fields <bfields@redhat.com>
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
parent 79835a71
Loading
Loading
Loading
Loading
+1 −4
Original line number Diff line number Diff line
@@ -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))
		return -EPERM;

	/*
	 * Ensure there are no outstanding leases on the file.
	 */
	return break_lease(inode, flag);
	return 0;
}

static int handle_truncate(struct file *filp)
+4 −0
Original line number Diff line number Diff line
@@ -685,6 +685,10 @@ static struct file *__dentry_open(struct dentry *dentry, struct vfsmount *mnt,
	if (error)
		goto cleanup_all;

	error = break_lease(inode, f->f_flags);
	if (error)
		goto cleanup_all;

	if (!open && f->f_op)
		open = f->f_op->open;
	if (open) {