aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux
diff options
context:
space:
mode:
authorJeff Layton <jlayton@poochiereds.net>2014-06-10 12:24:40 -0400
committerJeff Layton <jlayton@poochiereds.net>2014-06-10 12:24:40 -0400
commit962bd40bc30e412828e091bfda041b7547e779c8 (patch)
treedc5afa02febd54262708784552b497f11bd0c080 /include/linux
parent64b2d1fbbfda07765dae3f601862796a61b2c451 (diff)
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>
Diffstat (limited to 'include/linux')
-rw-r--r--include/linux/fs.h6
1 files changed, 6 insertions, 0 deletions
diff --git a/include/linux/fs.h b/include/linux/fs.h
index c3f46e499dd0..22ae79650b82 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)
1914 1914
1915static inline int break_deleg(struct inode *inode, unsigned int mode) 1915static inline int break_deleg(struct inode *inode, unsigned int mode)
1916{ 1916{
1917 /*
1918 * Since this check is lockless, we must ensure that any refcounts
1919 * taken are done before checking inode->i_flock. Otherwise, we could
1920 * end up racing with tasks trying to set a new lease on this file.
1921 */
1922 smp_mb();
1917 if (inode->i_flock) 1923 if (inode->i_flock)
1918 return __break_lease(inode, mode, FL_DELEG); 1924 return __break_lease(inode, mode, FL_DELEG);
1919 return 0; 1925 return 0;