OSDN Git Service

diag: Modify md_info and diag client map synchronization
authorManoj Prabhu B <bmanoj@codeaurora.org>
Wed, 25 Jul 2018 09:36:11 +0000 (15:06 +0530)
committerGerrit - the friendly Code Review server <code-review@localhost>
Thu, 2 Aug 2018 06:26:31 +0000 (23:26 -0700)
Extend the scope of protection to md_info till queueing
the write to sdcard. Patch adds protection to diag client map
synchronizing access by various clients.

CRs-Fixed: 2282558
Change-Id: If076af2d09180a282a9077b4ebcda0184e9f67b5
Signed-off-by: Manoj Prabhu B <bmanoj@codeaurora.org>
drivers/char/diag/diag_memorydevice.c
drivers/char/diag/diagfwd_peripheral.c

index aa45c2e..befc015 100644 (file)
@@ -206,6 +206,7 @@ int diag_md_write(int id, unsigned char *buf, int len, int ctx)
        }
 
        found = 0;
+       mutex_lock(&driver->diagchar_mutex);
        for (i = 0; i < driver->num_clients && !found; i++) {
                if ((driver->client_map[i].pid != pid) ||
                    (driver->client_map[i].pid == 0))
@@ -219,6 +220,7 @@ int diag_md_write(int id, unsigned char *buf, int len, int ctx)
                pr_debug("diag: wake up logging process\n");
                wake_up_interruptible(&driver->wait_q);
        }
+       mutex_unlock(&driver->diagchar_mutex);
 
        if (!found)
                return -EINVAL;
index bfdce05..6c16d80 100644 (file)
@@ -357,6 +357,8 @@ static void diagfwd_data_process_done(struct diagfwd_info *fwd_info,
                        goto end;
                }
        }
+       mutex_unlock(&fwd_info->data_mutex);
+       mutex_unlock(&driver->hdlc_disable_mutex);
 
        if (write_len > 0) {
                err = diag_mux_write(DIAG_LOCAL_PROC, write_buf, write_len,
@@ -364,18 +366,18 @@ static void diagfwd_data_process_done(struct diagfwd_info *fwd_info,
                if (err) {
                        pr_err_ratelimited("diag: In %s, unable to write to mux error: %d\n",
                                           __func__, err);
-                       goto end;
+                       goto end_write;
                }
        }
-       mutex_unlock(&fwd_info->data_mutex);
-       mutex_unlock(&driver->hdlc_disable_mutex);
+
        diagfwd_queue_read(fwd_info);
        return;
 
 end:
-       diag_ws_release();
        mutex_unlock(&fwd_info->data_mutex);
        mutex_unlock(&driver->hdlc_disable_mutex);
+end_write:
+       diag_ws_release();
        if (buf) {
                DIAG_LOG(DIAG_DEBUG_PERIPHERALS,
                "Marking buffer as free p: %d, t: %d, buf_num: %d\n",
@@ -694,24 +696,26 @@ static void diagfwd_data_read_done(struct diagfwd_info *fwd_info,
                }
        }
 
+       mutex_unlock(&fwd_info->data_mutex);
+       mutex_unlock(&driver->hdlc_disable_mutex);
+
        if (write_len > 0) {
                err = diag_mux_write(DIAG_LOCAL_PROC, write_buf, write_len,
                                     temp_buf->ctxt);
                if (err) {
                        pr_err_ratelimited("diag: In %s, unable to write to mux error: %d\n",
                                           __func__, err);
-                       goto end;
+                       goto end_write;
                }
        }
-       mutex_unlock(&fwd_info->data_mutex);
-       mutex_unlock(&driver->hdlc_disable_mutex);
        diagfwd_queue_read(fwd_info);
        return;
 
 end:
-       diag_ws_release();
        mutex_unlock(&fwd_info->data_mutex);
        mutex_unlock(&driver->hdlc_disable_mutex);
+end_write:
+       diag_ws_release();
        if (temp_buf) {
                DIAG_LOG(DIAG_DEBUG_PERIPHERALS,
                "Marking buffer as free p: %d, t: %d, buf_num: %d\n",