This patch changes that only F_SETLKW will be killable. As the man page
of fcntl() states out that F_SETLKW is the only one interruptible cmd as
I supposed it can block an unknown amount of time when it hits
contention. We use killable for the same reason just that the process
isn't alive anymore.

The command F_SETLK is a trylock command, a result can be expected very
close as the operation was send to the user space like unlock or get
operations which uses wait_event() only.

Cc: sta...@vger.kernel.org
Signed-off-by: Alexander Aring <aahri...@redhat.com>
---
 fs/dlm/plock.c | 38 +++++++++++++++++++++-----------------
 1 file changed, 21 insertions(+), 17 deletions(-)

diff --git a/fs/dlm/plock.c b/fs/dlm/plock.c
index 31bc601ee3d8..c9e1d5f54194 100644
--- a/fs/dlm/plock.c
+++ b/fs/dlm/plock.c
@@ -155,25 +155,29 @@ int dlm_posix_lock(dlm_lockspace_t *lockspace, u64 
number, struct file *file,
 
        send_op(op);
 
-       rv = wait_event_killable(recv_wq, (op->done != 0));
-       if (rv == -ERESTARTSYS) {
-               spin_lock(&ops_lock);
-               /* recheck under ops_lock if we got a done != 0,
-                * if so this interrupt case should be ignored
-                */
-               if (op->done != 0) {
+       if (op->info.wait) {
+               rv = wait_event_killable(recv_wq, (op->done != 0));
+               if (rv == -ERESTARTSYS) {
+                       spin_lock(&ops_lock);
+                       /* recheck under ops_lock if we got a done != 0,
+                        * if so this interrupt case should be ignored
+                        */
+                       if (op->done != 0) {
+                               spin_unlock(&ops_lock);
+                               goto do_lock_wait;
+                       }
+                       list_del(&op->list);
                        spin_unlock(&ops_lock);
-                       goto do_lock_wait;
-               }
-               list_del(&op->list);
-               spin_unlock(&ops_lock);
 
-               log_debug(ls, "%s: wait interrupted %x %llx pid %d",
-                         __func__, ls->ls_global_id,
-                         (unsigned long long)number, op->info.pid);
-               do_unlock_close(&op->info);
-               dlm_release_plock_op(op);
-               goto out;
+                       log_debug(ls, "%s: wait interrupted %x %llx pid %d",
+                                 __func__, ls->ls_global_id,
+                                 (unsigned long long)number, op->info.pid);
+                       do_unlock_close(&op->info);
+                       dlm_release_plock_op(op);
+                       goto out;
+               }
+       } else {
+               wait_event(recv_wq, (op->done != 0));
        }
 
 do_lock_wait:
-- 
2.31.1

Reply via email to