Forráskód Böngészése

BT_Kernel: fix page fault error due to mutex

 - Fixing page fault error due to accessing
   the mutex after free.

Change-Id: Ib8433a923424d7bc4a54b01769d6c2f206321d04
Signed-off-by: Girish BN <[email protected]>
Girish BN 9 hónapja
szülő
commit
6f153842d6
2 módosított fájl, 9 hozzáadás és 8 törlés
  1. 0 1
      include/btpower.h
  2. 9 7
      pwr/btpower.c

+ 0 - 1
include/btpower.h

@@ -676,7 +676,6 @@ struct platform_pwr_data {
 	struct work_struct wq_pwr_voting;
 	struct sk_buff_head rxq;
 	struct mutex pwr_mtx;
-	struct mutex pwr_release;
 };
 
 int btpower_register_slimdev(struct device *dev);

+ 9 - 7
pwr/btpower.c

@@ -309,6 +309,8 @@ static struct class *bt_class;
 static int bt_major;
 static int soc_id;
 static bool probe_finished;
+struct mutex pwr_release;
+
 static void bt_power_vote(struct work_struct *work);
 
 static struct {
@@ -1576,7 +1578,7 @@ static int bt_power_probe(struct platform_device *pdev)
 	skb_queue_head_init(&pwr_data->rxq);
 	mutex_init(&pwr_data->pwr_mtx);
 	mutex_init(&pwr_data->btpower_state.state_machine_lock);
-	mutex_init(&pwr_data->pwr_release);
+	mutex_init(&pwr_release);
 	pwr_data->btpower_state.power_state = IDLE;
 	pwr_data->btpower_state.retention_mode = RETENTION_IDLE;
 	pwr_data->btpower_state.grant_state = NO_GRANT_FOR_ANY_SS;
@@ -1622,21 +1624,21 @@ static int bt_power_probe(struct platform_device *pdev)
 	return 0;
 
 free_pdata:
-	mutex_lock(&pwr_data->pwr_release);
+	mutex_lock(&pwr_release);
 	kfree(pwr_data);
-	mutex_unlock(&pwr_data->pwr_release);
+	mutex_unlock(&pwr_release);
 	return ret;
 }
 
 static int bt_power_remove(struct platform_device *pdev)
 {
-	mutex_lock(&pwr_data->pwr_release);
+	mutex_lock(&pwr_release);
 	dev_dbg(&pdev->dev, "%s\n", __func__);
 	probe_finished = false;
 	btpower_rfkill_remove(pdev);
 	bt_power_vreg_put();
 	kfree(pwr_data);
-	mutex_unlock(&pwr_data->pwr_release);
+	mutex_unlock(&pwr_release);
 	return 0;
 }
 
@@ -2517,7 +2519,7 @@ static long bt_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
 static int bt_power_release(struct inode *inode, struct file *file)
 {
 
-	mutex_lock(&pwr_data->pwr_release);
+	mutex_lock(&pwr_release);
 
 	if (!pwr_data || !probe_finished) {
 		pr_err("%s: BTPower Probing Pending.Try Again\n", __func__);
@@ -2566,7 +2568,7 @@ static int bt_power_release(struct inode *inode, struct file *file)
 */
 		}
 	}
-	mutex_unlock(&pwr_data->pwr_release);
+	mutex_unlock(&pwr_release);
 	return 0;
 }