From mboxrd@z Thu Jan 1 00:00:00 1970 From: "J. Bruce Fields" Subject: Re: [PATCH 1/2] locks: add missing memory barrier in break_deleg Date: Tue, 10 Jun 2014 16:48:28 -0400 Message-ID: <20140610204828.GL3957@fieldses.org> References: <1402431276-14350-1-git-send-email-jlayton@poochiereds.net> <1402431276-14350-2-git-send-email-jlayton@poochiereds.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Cc: linux-fsdevel@vger.kernel.org To: Jeff Layton Return-path: Received: from fieldses.org ([174.143.236.118]:47220 "EHLO fieldses.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753219AbaFJUs3 (ORCPT ); Tue, 10 Jun 2014 16:48:29 -0400 Content-Disposition: inline In-Reply-To: <1402431276-14350-2-git-send-email-jlayton@poochiereds.net> Sender: linux-fsdevel-owner@vger.kernel.org List-ID: On Tue, Jun 10, 2014 at 04:14:35PM -0400, Jeff Layton wrote: > break_deleg is subject to the same potential race as break_lease. Add > a memory barrier to prevent it. Acked-by: J. Bruce Fields Though we might now just move the comment, smp_mb(), and inode->i_flock calls into __break_lease? --b. > > Signed-off-by: Jeff Layton > --- > include/linux/fs.h | 6 ++++++ > 1 file changed, 6 insertions(+) > > 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) > > 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; > -- > 1.9.3 >