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.

Signed-off-by: Jeff Layton <jlay...@redhat.com>
---
 fs/locks.c | 46 ++++++++++++----------------------------------
 1 file changed, 12 insertions(+), 34 deletions(-)

diff --git a/fs/locks.c b/fs/locks.c
index b49e853..4cd2578 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.4.2

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to