From: Jeff Layton Date: Tue, 10 Jun 2014 16:24:40 +0000 (-0400) Subject: locks: add missing memory barrier in break_deleg X-Git-Url: http://git.maquefel.me/?a=commitdiff_plain;h=962bd40bc30e412828e091bfda041b7547e779c8;p=linux.git 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 --- diff --git a/include/linux/fs.h b/include/linux/fs.h index c3f46e499dd00..22ae79650b820 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -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;