From: Andrew Perepechko Date: Mon, 4 Oct 2010 19:43:29 +0000 (+0400) Subject: b=18728 allow queued write syscall termination by a signal X-Git-Tag: 2.0.53.0~13 X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=commitdiff_plain;h=6c78cf84c0d79bd047e7b628de2575199ead7fbf b=18728 allow queued write syscall termination by a signal i=Alexander Zarochentsev i=Vitaly Fertman --- diff --git a/libcfs/include/libcfs/linux/linux-lock.h b/libcfs/include/libcfs/linux/linux-lock.h index 83d6be1..e3a8e66 100644 --- a/libcfs/include/libcfs/linux/linux-lock.h +++ b/libcfs/include/libcfs/linux/linux-lock.h @@ -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) diff --git a/libcfs/include/libcfs/user-lock.h b/libcfs/include/libcfs/user-lock.h index d6da6a5..8c70f05 100644 --- a/libcfs/include/libcfs/user-lock.h +++ b/libcfs/include/libcfs/user-lock.h @@ -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) diff --git a/libcfs/include/libcfs/winnt/winnt-lock.h b/libcfs/include/libcfs/winnt/winnt-lock.h index 2e92430..a6eb8bb 100644 --- a/libcfs/include/libcfs/winnt/winnt-lock.h +++ b/libcfs/include/libcfs/winnt/winnt-lock.h @@ -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 diff --git a/libcfs/libcfs/user-lock.c b/libcfs/libcfs/user-lock.c index 87ba922..81d5a11 100644 --- a/libcfs/libcfs/user-lock.c +++ b/libcfs/libcfs/user-lock.c @@ -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); diff --git a/lustre/llite/file.c b/lustre/llite/file.c index 8397433..a0619f8 100644 --- a/lustre/llite/file.c +++ b/lustre/llite/file.c @@ -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; }