return ret;
 }
 
+static void hci_update_scan_state(struct hci_dev *hdev, u8 scan)
+{
+       bool conn_changed;
+
+       BT_DBG("%s scan 0x%02x", hdev->name, scan);
+
+       if ((scan & SCAN_PAGE))
+               conn_changed = !test_and_set_bit(HCI_CONNECTABLE,
+                                                &hdev->dev_flags);
+       else
+               conn_changed = test_and_clear_bit(HCI_CONNECTABLE,
+                                                 &hdev->dev_flags);
+
+       if (!test_bit(HCI_MGMT, &hdev->dev_flags))
+               return;
+
+       if (conn_changed)
+               mgmt_new_settings(hdev);
+}
+
 int hci_dev_cmd(unsigned int cmd, void __user *arg)
 {
        struct hci_dev *hdev;
                /* Ensure that the connectable state gets correctly
                 * modified as this was a non-mgmt change.
                 */
-               if (!err) {
-                       bool changed;
-
-                       if ((dr.dev_opt & SCAN_PAGE))
-                               changed = !test_and_set_bit(HCI_CONNECTABLE,
-                                                           &hdev->dev_flags);
-                       else
-                               changed = test_and_clear_bit(HCI_CONNECTABLE,
-                                                            &hdev->dev_flags);
-
-                       if (changed && test_bit(HCI_MGMT, &hdev->dev_flags))
-                               mgmt_new_settings(hdev);
-               }
+               if (!err)
+                       hci_update_scan_state(hdev, dr.dev_opt);
                break;
 
        case HCISETLINKPOL: