locks: add missing memory barrier in break_deleg
break_deleg is subject to the same potential race as break_lease. Add a memory barrier to prevent it. Signed-off-by: Jeff Layton <jlayton@primarydata.com>
This commit is contained in:
parent
64b2d1fbbf
commit
962bd40bc3
1 changed files with 6 additions and 0 deletions
|
@ -1914,6 +1914,12 @@ static inline int break_lease(struct inode *inode, unsigned int mode)
|
|||
|
||||
static inline int break_deleg(struct inode *inode, unsigned int mode)
|
||||
{
|
||||
/*
|
||||
* Since this check is lockless, we must ensure that any refcounts
|
||||
* taken are done before checking inode->i_flock. Otherwise, we could
|
||||
* end up racing with tasks trying to set a new lease on this file.
|
||||
*/
|
||||
smp_mb();
|
||||
if (inode->i_flock)
|
||||
return __break_lease(inode, mode, FL_DELEG);
|
||||
return 0;
|
||||
|
|
Loading…
Reference in a new issue