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);
 }
 
                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);
 
        /*
                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);
 
        /*