提交 2dfded82 编写于 作者: L Linus Torvalds

Merge tag 'locks-v3.16-2' of git://git.samba.org/jlayton/linux

Pull file locking fixes from Jeff Layton:
 "File locking related bugfixes

  Nothing too earth-shattering here.  A fix for a potential regression
  due to a patch in pile #1, and the addition of a memory barrier to
  prevent a race condition between break_deleg and generic_add_lease"

* tag 'locks-v3.16-2' of git://git.samba.org/jlayton/linux:
  locks: set fl_owner for leases back to current->files
  locks: add missing memory barrier in break_deleg
...@@ -431,7 +431,7 @@ static int lease_init(struct file *filp, long type, struct file_lock *fl) ...@@ -431,7 +431,7 @@ static int lease_init(struct file *filp, long type, struct file_lock *fl)
if (assign_type(fl, type) != 0) if (assign_type(fl, type) != 0)
return -EINVAL; return -EINVAL;
fl->fl_owner = (fl_owner_t)filp; fl->fl_owner = (fl_owner_t)current->files;
fl->fl_pid = current->tgid; fl->fl_pid = current->tgid;
fl->fl_file = filp; fl->fl_file = filp;
......
...@@ -1921,6 +1921,12 @@ static inline int break_lease(struct inode *inode, unsigned int mode) ...@@ -1921,6 +1921,12 @@ static inline int break_lease(struct inode *inode, unsigned int mode)
static inline int break_deleg(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) if (inode->i_flock)
return __break_lease(inode, mode, FL_DELEG); return __break_lease(inode, mode, FL_DELEG);
return 0; return 0;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册