Whamcloud - gitweb
LU-3020 obdclass: Lustre returns EINTR when SA_RESTART is set
authorPatrick Farrell <paf@cray.com>
Wed, 27 Mar 2013 21:27:28 +0000 (16:27 -0500)
committerOleg Drokin <oleg.drokin@intel.com>
Tue, 23 Apr 2013 05:47:32 +0000 (01:47 -0400)
When Lustre is in a read or write system call and receives a
SIGALRM, it currently returns EINTR at this location. This is
problematic because it prevents the system call from being restarted
if SA_RESTART is set in the handler.

This patch changes behavior in this location to return ERESTARTSYS
when a signal is found.

Signed-off-by: Patrick Farrell <paf@cray.com>
Change-Id: I26e24b8e8e325c5b0bd7d5d20fa97e2180c12263
Reviewed-on: http://review.whamcloud.com/5814
Reviewed-by: Cory Spitz <spitzcor@cray.com>
Tested-by: Hudson
Reviewed-by: Bob Glossman <bob.glossman@intel.com>
Tested-by: Maloo <whamcloud.maloo@gmail.com>
Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
lustre/obdclass/cl_lock.c

index a796d7e..7a9b4d1 100644 (file)
@@ -977,7 +977,9 @@ int cl_lock_state_wait(const struct lu_env *env, struct cl_lock *lock)
 
                 LASSERT(cl_lock_nr_mutexed(env) == 0);
 
-               result = -EINTR;
+               /* Returning ERESTARTSYS instead of EINTR so syscalls
+                * can be restarted if signals are pending here */
+               result = -ERESTARTSYS;
                if (likely(!OBD_FAIL_CHECK(OBD_FAIL_LOCK_STATE_WAIT_INTR))) {
                        cfs_waitq_wait(&waiter, CFS_TASK_INTERRUPTIBLE);
                        if (!cfs_signal_pending())