staging: r8188eu: Add _enter_critical_mutex() error handling
authorAlexey Khoroshilov <khoroshilov@ispras.ru>
Sat, 17 Oct 2015 21:33:09 +0000 (00:33 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 18 Oct 2015 03:56:10 +0000 (20:56 -0700)
_enter_critical_mutex() is a simple call to mutex_lock_interruptible(),
but there is no error handling code for it.

The patch removes wrapper _enter_critical_mutex() and
adds error handling for mutex_lock_interruptible().

Found by Linux Driver Verification project (linuxtesting.org).

Signed-off-by: Alexey Khoroshilov <khoroshilov@ispras.ru>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/rtl8188eu/core/rtw_mlme_ext.c
drivers/staging/rtl8188eu/include/osdep_service.h
drivers/staging/rtl8188eu/os_dep/os_intfs.c
drivers/staging/rtl8188eu/os_dep/usb_ops_linux.c

index d8a0895aa86f35f2e24c7d857f8233f3467d4b64..e15c198abbe33dd4eee96871e9984de2b1c1625a 100644 (file)
@@ -271,7 +271,8 @@ static s32 dump_mgntframe_and_wait_ack(struct adapter *padapter,
        if (padapter->bSurpriseRemoved || padapter->bDriverStopped)
                return -1;
 
-       _enter_critical_mutex(&pxmitpriv->ack_tx_mutex, NULL);
+       if (mutex_lock_interruptible(&pxmitpriv->ack_tx_mutex))
+               return _FAIL;
        pxmitpriv->ack_tx = true;
 
        pmgntframe->ack_report = 1;
@@ -282,7 +283,7 @@ static s32 dump_mgntframe_and_wait_ack(struct adapter *padapter,
        pxmitpriv->ack_tx = false;
        mutex_unlock(&pxmitpriv->ack_tx_mutex);
 
-        return ret;
+       return ret;
 }
 
 static int update_hidden_ssid(u8 *ies, u32 ies_len, u8 hidden_ssid_mode)
index cf9ca685eb7776d69aa634ec6f603d211c3c1930..96505a6dbe2cc77be6069939644533dd0644e225 100644 (file)
@@ -67,15 +67,6 @@ static inline struct list_head *get_list_head(struct __queue *queue)
        return &(queue->queue);
 }
 
-static inline int _enter_critical_mutex(struct mutex *pmutex,
-                                       unsigned long *pirqL)
-{
-       int ret;
-
-       ret = mutex_lock_interruptible(pmutex);
-       return ret;
-}
-
 static inline int rtw_netif_queue_stopped(struct net_device *pnetdev)
 {
        return  netif_tx_queue_stopped(netdev_get_tx_queue(pnetdev, 0)) &&
index d85647c07c6cb4dda408ec07a5979c67f82a7753..d063d02db7f0977e3339070791f440db4541b0e1 100644 (file)
@@ -1058,7 +1058,8 @@ static int netdev_open(struct net_device *pnetdev)
        int ret;
        struct adapter *padapter = (struct adapter *)rtw_netdev_priv(pnetdev);
 
-       _enter_critical_mutex(&padapter->hw_init_mutex, NULL);
+       if (mutex_lock_interruptible(&padapter->hw_init_mutex))
+               return -ERESTARTSYS;
        ret = _netdev_open(pnetdev);
        mutex_unlock(&padapter->hw_init_mutex);
        return ret;
index 7e599bc5b2d3c9f515bb2c3bb94eb1e702a8cd12..0fea338d7313fe07b22fac1185a95d8200e5c446 100644 (file)
@@ -249,7 +249,10 @@ static int usbctrl_vendorreq(struct adapter *adapt, u8 request, u16 value, u16 i
                goto exit;
        }
 
-       _enter_critical_mutex(&dvobjpriv->usb_vendor_req_mutex, NULL);
+       if (mutex_lock_interruptible(&dvobjpriv->usb_vendor_req_mutex)) {
+               status = -ERESTARTSYS;
+               goto exit;
+       }
 
        /*  Acquire IO memory for vendorreq */
        pIo_buf = dvobjpriv->usb_vendor_req_buf;