From mboxrd@z Thu Jan 1 00:00:00 1970 From: "J. Bruce Fields" Subject: Re: [PATCH v7 07/17] locks: consolidate checks for compatible filp->f_mode values in setlk handlers Date: Sun, 23 Mar 2014 16:08:30 -0400 Message-ID: <20140323200829.GE6103@fieldses.org> References: <1395261961-10855-1-git-send-email-jlayton@redhat.com> <1395261961-10855-8-git-send-email-jlayton@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Cc: viro@ZenIV.linux.org.uk, linux-fsdevel@vger.kernel.org To: Jeff Layton Return-path: Received: from fieldses.org ([174.143.236.118]:48388 "EHLO fieldses.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750858AbaCWUId (ORCPT ); Sun, 23 Mar 2014 16:08:33 -0400 Content-Disposition: inline In-Reply-To: <1395261961-10855-8-git-send-email-jlayton@redhat.com> Sender: linux-fsdevel-owner@vger.kernel.org List-ID: On Wed, Mar 19, 2014 at 04:45:51PM -0400, Jeff Layton wrote: > Move this check into flock64_to_posix_lock instead of duplicating it in > two places. This also fixes a minor wart in the code where we continue > referring to the struct flock after converting it to struct file_lock. Acked-by: J. Bruce Fields > > Signed-off-by: Jeff Layton > --- > fs/locks.c | 46 ++++++++++++---------------------------------- > 1 file changed, 12 insertions(+), 34 deletions(-) > > diff --git a/fs/locks.c b/fs/locks.c > index b49e853a9c7b..4cd25781b0a4 100644 > --- a/fs/locks.c > +++ b/fs/locks.c > @@ -388,6 +388,18 @@ static int flock64_to_posix_lock(struct file *filp, struct file_lock *fl, > fl->fl_ops = NULL; > fl->fl_lmops = NULL; > > + /* Ensure that fl->fl_filp has compatible f_mode */ > + switch (l->l_type) { > + case F_RDLCK: > + if (!(filp->f_mode & FMODE_READ)) > + return -EBADF; > + break; > + case F_WRLCK: > + if (!(filp->f_mode & FMODE_WRITE)) > + return -EBADF; > + break; > + } > + > return assign_type(fl, l->l_type); > } > > @@ -2025,23 +2037,6 @@ again: > file_lock->fl_flags |= FL_SLEEP; > } > > - error = -EBADF; > - switch (flock.l_type) { > - case F_RDLCK: > - if (!(filp->f_mode & FMODE_READ)) > - goto out; > - break; > - case F_WRLCK: > - if (!(filp->f_mode & FMODE_WRITE)) > - goto out; > - break; > - case F_UNLCK: > - break; > - default: > - error = -EINVAL; > - goto out; > - } > - > error = do_lock_file_wait(filp, cmd, file_lock); > > /* > @@ -2143,23 +2138,6 @@ again: > file_lock->fl_flags |= FL_SLEEP; > } > > - error = -EBADF; > - switch (flock.l_type) { > - case F_RDLCK: > - if (!(filp->f_mode & FMODE_READ)) > - goto out; > - break; > - case F_WRLCK: > - if (!(filp->f_mode & FMODE_WRITE)) > - goto out; > - break; > - case F_UNLCK: > - break; > - default: > - error = -EINVAL; > - goto out; > - } > - > error = do_lock_file_wait(filp, cmd, file_lock); > > /* > -- > 1.8.5.3 >