Kernel bump from 4.1.3-rt to 4.1.7-rt.
[kvmfornfv.git] / kernel / net / bluetooth / hci_sock.c
index 56f9edb..e11a5cf 100644 (file)
@@ -741,10 +741,11 @@ static int hci_sock_bind(struct socket *sock, struct sockaddr *addr,
                        goto done;
                }
 
-               if (test_bit(HCI_UP, &hdev->flags) ||
-                   test_bit(HCI_INIT, &hdev->flags) ||
+               if (test_bit(HCI_INIT, &hdev->flags) ||
                    hci_dev_test_flag(hdev, HCI_SETUP) ||
-                   hci_dev_test_flag(hdev, HCI_CONFIG)) {
+                   hci_dev_test_flag(hdev, HCI_CONFIG) ||
+                   (!hci_dev_test_flag(hdev, HCI_AUTO_OFF) &&
+                    test_bit(HCI_UP, &hdev->flags))) {
                        err = -EBUSY;
                        hci_dev_put(hdev);
                        goto done;
@@ -760,10 +761,21 @@ static int hci_sock_bind(struct socket *sock, struct sockaddr *addr,
 
                err = hci_dev_open(hdev->id);
                if (err) {
-                       hci_dev_clear_flag(hdev, HCI_USER_CHANNEL);
-                       mgmt_index_added(hdev);
-                       hci_dev_put(hdev);
-                       goto done;
+                       if (err == -EALREADY) {
+                               /* In case the transport is already up and
+                                * running, clear the error here.
+                                *
+                                * This can happen when opening an user
+                                * channel and HCI_AUTO_OFF grace period
+                                * is still active.
+                                */
+                               err = 0;
+                       } else {
+                               hci_dev_clear_flag(hdev, HCI_USER_CHANNEL);
+                               mgmt_index_added(hdev);
+                               hci_dev_put(hdev);
+                               goto done;
+                       }
                }
 
                atomic_inc(&hdev->promisc);