|
@@ -1930,6 +1930,12 @@ int fcntl_getlk(struct file *filp, unsigned int cmd, struct flock __user *l)
|
|
|
if (error)
|
|
|
goto out;
|
|
|
|
|
|
+ if (cmd == F_GETLKP) {
|
|
|
+ cmd = F_GETLK;
|
|
|
+ file_lock.fl_flags |= FL_FILE_PVT;
|
|
|
+ file_lock.fl_owner = (fl_owner_t)filp;
|
|
|
+ }
|
|
|
+
|
|
|
error = vfs_test_lock(filp, &file_lock);
|
|
|
if (error)
|
|
|
goto out;
|
|
@@ -2049,10 +2055,26 @@ again:
|
|
|
error = flock_to_posix_lock(filp, file_lock, &flock);
|
|
|
if (error)
|
|
|
goto out;
|
|
|
- if (cmd == F_SETLKW) {
|
|
|
+
|
|
|
+ /*
|
|
|
+ * If the cmd is requesting file-private locks, then set the
|
|
|
+ * FL_FILE_PVT flag and override the owner.
|
|
|
+ */
|
|
|
+ switch (cmd) {
|
|
|
+ case F_SETLKP:
|
|
|
+ cmd = F_SETLK;
|
|
|
+ file_lock->fl_flags |= FL_FILE_PVT;
|
|
|
+ file_lock->fl_owner = (fl_owner_t)filp;
|
|
|
+ break;
|
|
|
+ case F_SETLKPW:
|
|
|
+ cmd = F_SETLKW;
|
|
|
+ file_lock->fl_flags |= FL_FILE_PVT;
|
|
|
+ file_lock->fl_owner = (fl_owner_t)filp;
|
|
|
+ /* Fallthrough */
|
|
|
+ case F_SETLKW:
|
|
|
file_lock->fl_flags |= FL_SLEEP;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
error = do_lock_file_wait(filp, cmd, file_lock);
|
|
|
|
|
|
/*
|
|
@@ -2098,6 +2120,12 @@ int fcntl_getlk64(struct file *filp, unsigned int cmd, struct flock64 __user *l)
|
|
|
if (error)
|
|
|
goto out;
|
|
|
|
|
|
+ if (cmd == F_GETLKP) {
|
|
|
+ cmd = F_GETLK64;
|
|
|
+ file_lock.fl_flags |= FL_FILE_PVT;
|
|
|
+ file_lock.fl_owner = (fl_owner_t)filp;
|
|
|
+ }
|
|
|
+
|
|
|
error = vfs_test_lock(filp, &file_lock);
|
|
|
if (error)
|
|
|
goto out;
|
|
@@ -2150,10 +2178,26 @@ again:
|
|
|
error = flock64_to_posix_lock(filp, file_lock, &flock);
|
|
|
if (error)
|
|
|
goto out;
|
|
|
- if (cmd == F_SETLKW64) {
|
|
|
+
|
|
|
+ /*
|
|
|
+ * If the cmd is requesting file-private locks, then set the
|
|
|
+ * FL_FILE_PVT flag and override the owner.
|
|
|
+ */
|
|
|
+ switch (cmd) {
|
|
|
+ case F_SETLKP:
|
|
|
+ cmd = F_SETLK64;
|
|
|
+ file_lock->fl_flags |= FL_FILE_PVT;
|
|
|
+ file_lock->fl_owner = (fl_owner_t)filp;
|
|
|
+ break;
|
|
|
+ case F_SETLKPW:
|
|
|
+ cmd = F_SETLKW64;
|
|
|
+ file_lock->fl_flags |= FL_FILE_PVT;
|
|
|
+ file_lock->fl_owner = (fl_owner_t)filp;
|
|
|
+ /* Fallthrough */
|
|
|
+ case F_SETLKW64:
|
|
|
file_lock->fl_flags |= FL_SLEEP;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
error = do_lock_file_wait(filp, cmd, file_lock);
|
|
|
|
|
|
/*
|
|
@@ -2221,6 +2265,8 @@ void locks_remove_file(struct file *filp)
|
|
|
if (!inode->i_flock)
|
|
|
return;
|
|
|
|
|
|
+ locks_remove_posix(filp, (fl_owner_t)filp);
|
|
|
+
|
|
|
if (filp->f_op->flock) {
|
|
|
struct file_lock fl = {
|
|
|
.fl_pid = current->tgid,
|