diff options
| -rw-r--r-- | drivers/char/diag/diag_memorydevice.c | 6 | ||||
| -rw-r--r-- | drivers/char/diag/diagchar_core.c | 7 | ||||
| -rw-r--r-- | drivers/char/diag/diagfwd.c | 15 |
3 files changed, 18 insertions, 10 deletions
diff --git a/drivers/char/diag/diag_memorydevice.c b/drivers/char/diag/diag_memorydevice.c index 83a2c70fba02..a752cdc675a3 100644 --- a/drivers/char/diag/diag_memorydevice.c +++ b/drivers/char/diag/diag_memorydevice.c @@ -204,8 +204,10 @@ int diag_md_write(int id, unsigned char *buf, int len, int ctx) continue; found = 1; - driver->data_ready[i] |= USER_SPACE_DATA_TYPE; - atomic_inc(&driver->data_ready_notif[i]); + if (!(driver->data_ready[i] & USER_SPACE_DATA_TYPE)) { + driver->data_ready[i] |= USER_SPACE_DATA_TYPE; + atomic_inc(&driver->data_ready_notif[i]); + } pr_debug("diag: wake up logging process\n"); wake_up_interruptible(&driver->wait_q); } diff --git a/drivers/char/diag/diagchar_core.c b/drivers/char/diag/diagchar_core.c index 71af35f5474e..678e3a2b051c 100644 --- a/drivers/char/diag/diagchar_core.c +++ b/drivers/char/diag/diagchar_core.c @@ -1889,9 +1889,10 @@ static int diag_ioctl_lsm_deinit(void) mutex_unlock(&driver->diagchar_mutex); return -EINVAL; } - - driver->data_ready[i] |= DEINIT_TYPE; - atomic_inc(&driver->data_ready_notif[i]); + if (!(driver->data_ready[i] & DEINIT_TYPE)) { + driver->data_ready[i] |= DEINIT_TYPE; + atomic_inc(&driver->data_ready_notif[i]); + } mutex_unlock(&driver->diagchar_mutex); wake_up_interruptible(&driver->wait_q); diff --git a/drivers/char/diag/diagfwd.c b/drivers/char/diag/diagfwd.c index ba18db4bbdc9..2661bc48f73e 100644 --- a/drivers/char/diag/diagfwd.c +++ b/drivers/char/diag/diagfwd.c @@ -501,7 +501,8 @@ void diag_update_userspace_clients(unsigned int type) mutex_lock(&driver->diagchar_mutex); for (i = 0; i < driver->num_clients; i++) - if (driver->client_map[i].pid != 0) { + if (driver->client_map[i].pid != 0 && + !(driver->data_ready[i] & type)) { driver->data_ready[i] |= type; atomic_inc(&driver->data_ready_notif[i]); } @@ -521,9 +522,11 @@ void diag_update_md_clients(unsigned int type) if (driver->client_map[j].pid != 0 && driver->client_map[j].pid == driver->md_session_map[i]->pid) { - driver->data_ready[j] |= type; - atomic_inc( + if (!(driver->data_ready[i] & type)) { + driver->data_ready[j] |= type; + atomic_inc( &driver->data_ready_notif[j]); + } break; } } @@ -539,8 +542,10 @@ void diag_update_sleeping_process(int process_id, int data_type) mutex_lock(&driver->diagchar_mutex); for (i = 0; i < driver->num_clients; i++) if (driver->client_map[i].pid == process_id) { - driver->data_ready[i] |= data_type; - atomic_inc(&driver->data_ready_notif[i]); + if (!(driver->data_ready[i] & data_type)) { + driver->data_ready[i] |= data_type; + atomic_inc(&driver->data_ready_notif[i]); + } break; } wake_up_interruptible(&driver->wait_q); |
