locks: consolidate checks for compatible filp->f_mode values in setlk handlers
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 <bfields@fieldses.org> Signed-off-by: Jeff Layton <jlayton@redhat.com>
This commit is contained in:
parent
ef12e72a01
commit
bce7560d49
46
fs/locks.c
46
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_ops = NULL;
|
||||||
fl->fl_lmops = 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);
|
return assign_type(fl, l->l_type);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2025,23 +2037,6 @@ again:
|
|||||||
file_lock->fl_flags |= FL_SLEEP;
|
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);
|
error = do_lock_file_wait(filp, cmd, file_lock);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -2143,23 +2138,6 @@ again:
|
|||||||
file_lock->fl_flags |= FL_SLEEP;
|
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);
|
error = do_lock_file_wait(filp, cmd, file_lock);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
Reference in New Issue
Block a user