Whamcloud - gitweb
b=18728 allow queued write syscall termination by a signal
authorAndrew Perepechko <andrew.perepechko@oracle.com>
Mon, 4 Oct 2010 19:43:29 +0000 (23:43 +0400)
committerVitaly Fertman <vitaly.fertman@sun.com>
Mon, 4 Oct 2010 20:03:35 +0000 (00:03 +0400)
i=Alexander Zarochentsev
i=Vitaly Fertman

libcfs/include/libcfs/linux/linux-lock.h
libcfs/include/libcfs/user-lock.h
libcfs/include/libcfs/winnt/winnt-lock.h
libcfs/libcfs/user-lock.c
lustre/llite/file.c

index 83d6be1..e3a8e66 100644 (file)
@@ -217,6 +217,7 @@ typedef struct mutex cfs_mutex_t;
 #define cfs_mutex_down(x)                   down(x)
 #define cfs_up(x)                           up(x)
 #define cfs_down(x)                         down(x)
+#define cfs_down_interruptible(x)           down_interruptible(x)
 #define cfs_mutex_down_trylock(x)           down_trylock(x)
 #define cfs_mutex_lock(x)                   mutex_lock(x)
 #define cfs_mutex_unlock(x)                 mutex_unlock(x)
index d6da6a5..8c70f05 100644 (file)
@@ -282,6 +282,8 @@ void cfs_mt_atomic_sub(int b, cfs_mt_atomic_t *a);
 #define cfs_up(s)                           cfs_mutex_up(s)
 #define cfs_mutex_down(s)                   __down(s)
 #define cfs_down(s)                         cfs_mutex_down(s)
+#define cfs_mutex_down_interruptible(s)     __down_interruptible(s)
+#define cfs_down_interruptible(s)           cfs_mutex_down_interruptible(s)
 
 #define cfs_init_mutex(x)                   cfs_sema_init(x, 1)
 #define cfs_init_mutex_locked(x)            cfs_sema_init(x, 0)
index 2e92430..a6eb8bb 100644 (file)
@@ -631,10 +631,17 @@ static inline void cfs_mutex_down(cfs_mutex_t *mutex)
     __down(mutex);
 }
 
-#define cfs_mutex_lock(m) cfs_mutex_down(m)
-#define cfs_mutex_trylock(s) down_trylock(s)
-#define cfs_mutex_lock_nested(m) cfs_mutex_down(m)
-#define cfs_down(m)       cfs_mutex_down(m)
+static inline int cfs_mutex_down_interruptible(cfs_mutex_t *mutex)
+{
+    __down(mutex);
+    return 0;
+}
+
+#define cfs_mutex_lock(m)         cfs_mutex_down(m)
+#define cfs_mutex_trylock(s)      down_trylock(s)
+#define cfs_mutex_lock_nested(m)  cfs_mutex_down(m)
+#define cfs_down(m)               cfs_mutex_down(m)
+#define cfs_down_interruptible(m) cfs_mutex_down_interruptible(m)
 
 /*
  * mutex_up
index 87ba922..81d5a11 100644 (file)
@@ -132,6 +132,13 @@ void __down(cfs_semaphore_t *s)
         (void)s;
 }
 
+int __down_interruptible(cfs_semaphore_t *s)
+{
+        LASSERT(s != NULL);
+        (void)s;
+        return 0;
+}
+
 void __up(cfs_semaphore_t *s)
 {
         LASSERT(s != NULL);
index 8397433..a0619f8 100644 (file)
@@ -856,7 +856,8 @@ static ssize_t ll_file_io_generic(const struct lu_env *env,
 #endif
                         if ((iot == CIT_WRITE) &&
                             !(cio->cui_fd->fd_flags & LL_FILE_GROUP_LOCKED)) {
-                                cfs_down(&lli->lli_write_sem);
+                                if(cfs_down_interruptible(&lli->lli_write_sem))
+                                        GOTO(out, result = -ERESTARTSYS);
                                 write_sem_locked = 1;
                         }
                         break;
@@ -884,8 +885,10 @@ static ssize_t ll_file_io_generic(const struct lu_env *env,
                 result = io->ci_nob;
                 *ppos = io->u.ci_wr.wr.crw_pos;
         }
+        GOTO(out, result);
+out:
         cl_io_fini(env, io);
-        RETURN(result);
+        return result;
 }