|
@@ -4726,6 +4726,20 @@ nfs4_proc_lock(struct file *filp, int cmd, struct file_lock *request)
|
|
|
|
|
|
if (state == NULL)
|
|
|
return -ENOLCK;
|
|
|
+ /*
|
|
|
+ * Don't rely on the VFS having checked the file open mode,
|
|
|
+ * since it won't do this for flock() locks.
|
|
|
+ */
|
|
|
+ switch (request->fl_type & (F_RDLCK|F_WRLCK|F_UNLCK)) {
|
|
|
+ case F_RDLCK:
|
|
|
+ if (!(filp->f_mode & FMODE_READ))
|
|
|
+ return -EBADF;
|
|
|
+ break;
|
|
|
+ case F_WRLCK:
|
|
|
+ if (!(filp->f_mode & FMODE_WRITE))
|
|
|
+ return -EBADF;
|
|
|
+ }
|
|
|
+
|
|
|
do {
|
|
|
status = nfs4_proc_setlk(state, cmd, request);
|
|
|
if ((status != -EAGAIN) || IS_SETLK(cmd))
|