Lines Matching full:device
26 * - A device is connected to an lcu as long as the device exists.
28 * device is checked by the eckd discipline and
30 * before the device is deleted.
32 * functions mark the point when a device is 'ready for service'.
36 * - dasd_alias_get_start_dev will find an alias device that can be used
37 * instead of the base device and does some (very simple) load balancing.
182 * so this function must be called first for a new device.
187 int dasd_alias_make_device_known_to_lcu(struct dasd_device *device) in dasd_alias_make_device_known_to_lcu() argument
189 struct dasd_eckd_private *private = device->private; in dasd_alias_make_device_known_to_lcu()
195 device->discipline->get_uid(device, &uid); in dasd_alias_make_device_known_to_lcu()
231 list_add(&device->alias_list, &lcu->inactive_devices); in dasd_alias_make_device_known_to_lcu()
240 * This function removes a device from the scope of alias management.
244 void dasd_alias_disconnect_device_from_lcu(struct dasd_device *device) in dasd_alias_disconnect_device_from_lcu() argument
246 struct dasd_eckd_private *private = device->private; in dasd_alias_disconnect_device_from_lcu()
257 device->discipline->get_uid(device, &uid); in dasd_alias_disconnect_device_from_lcu()
259 list_del_init(&device->alias_list); in dasd_alias_disconnect_device_from_lcu()
260 /* make sure that the workers don't use this device */ in dasd_alias_disconnect_device_from_lcu()
261 if (device == lcu->suc_data.device) { in dasd_alias_disconnect_device_from_lcu()
265 if (device == lcu->suc_data.device) { in dasd_alias_disconnect_device_from_lcu()
266 dasd_put_device(device); in dasd_alias_disconnect_device_from_lcu()
267 lcu->suc_data.device = NULL; in dasd_alias_disconnect_device_from_lcu()
271 if (device == lcu->ruac_data.device) { in dasd_alias_disconnect_device_from_lcu()
276 if (device == lcu->ruac_data.device) { in dasd_alias_disconnect_device_from_lcu()
277 dasd_put_device(device); in dasd_alias_disconnect_device_from_lcu()
278 lcu->ruac_data.device = NULL; in dasd_alias_disconnect_device_from_lcu()
308 * in the lcu is up to date and will update the device uid before
313 struct dasd_device *device, in _add_device_to_lcu() argument
317 struct dasd_eckd_private *private = device->private; in _add_device_to_lcu()
321 spin_lock(get_ccwdev_lock(device->cdev)); in _add_device_to_lcu()
326 spin_unlock(get_ccwdev_lock(device->cdev)); in _add_device_to_lcu()
329 list_move(&device->alias_list, &lcu->active_devices); in _add_device_to_lcu()
351 list_move(&device->alias_list, &group->baselist); in _add_device_to_lcu()
353 list_move(&device->alias_list, &group->aliaslist); in _add_device_to_lcu()
359 struct dasd_device *device) in _remove_device_from_lcu() argument
361 struct dasd_eckd_private *private = device->private; in _remove_device_from_lcu()
364 list_move(&device->alias_list, &lcu->inactive_devices); in _remove_device_from_lcu()
374 if (group->next == device) in _remove_device_from_lcu()
415 static int read_unit_address_configuration(struct dasd_device *device, in read_unit_address_configuration() argument
426 device, NULL); in read_unit_address_configuration()
429 cqr->startdev = device; in read_unit_address_configuration()
430 cqr->memdev = device; in read_unit_address_configuration()
478 struct dasd_device *device, *tempdev; in _lcu_update() local
484 list_for_each_entry_safe(device, tempdev, &pavgroup->baselist, in _lcu_update()
486 list_move(&device->alias_list, &lcu->active_devices); in _lcu_update()
487 private = device->private; in _lcu_update()
490 list_for_each_entry_safe(device, tempdev, &pavgroup->aliaslist, in _lcu_update()
492 list_move(&device->alias_list, &lcu->active_devices); in _lcu_update()
493 private = device->private; in _lcu_update()
520 list_for_each_entry_safe(device, tempdev, &lcu->active_devices, in _lcu_update()
522 _add_device_to_lcu(lcu, device, refdev); in _lcu_update()
532 struct dasd_device *device; in lcu_update_work() local
538 device = ruac_data->device; in lcu_update_work()
539 rc = _lcu_update(device, lcu); in lcu_update_work()
542 * prepare_update or a new device a new device while we were still in lcu_update_work()
547 DBF_DEV_EVENT(DBF_WARNING, device, "could not update" in lcu_update_work()
550 dasd_put_device(device); in lcu_update_work()
552 dasd_put_device(device); in lcu_update_work()
553 lcu->ruac_data.device = NULL; in lcu_update_work()
560 struct dasd_device *device) in _schedule_lcu_update() argument
566 if (lcu->ruac_data.device) { in _schedule_lcu_update()
570 if (device && !list_empty(&device->alias_list)) in _schedule_lcu_update()
571 usedev = device; in _schedule_lcu_update()
590 * if we haven't found a proper device yet, give up for now, the next in _schedule_lcu_update()
591 * device that will be set active will trigger an lcu update in _schedule_lcu_update()
596 lcu->ruac_data.device = usedev; in _schedule_lcu_update()
602 int dasd_alias_add_device(struct dasd_device *device) in dasd_alias_add_device() argument
604 struct dasd_eckd_private *private = device->private; in dasd_alias_add_device()
613 * Check if device and lcu type differ. If so, the uac data may be in dasd_alias_add_device()
618 DBF_DEV_EVENT(DBF_WARNING, device, "%s", in dasd_alias_add_device()
622 rc = _add_device_to_lcu(lcu, device, device); in dasd_alias_add_device()
627 list_move(&device->alias_list, &lcu->active_devices); in dasd_alias_add_device()
628 _schedule_lcu_update(lcu, device); in dasd_alias_add_device()
634 int dasd_alias_update_add_device(struct dasd_device *device) in dasd_alias_update_add_device() argument
636 struct dasd_eckd_private *private = device->private; in dasd_alias_update_add_device()
639 return dasd_alias_add_device(device); in dasd_alias_update_add_device()
642 int dasd_alias_remove_device(struct dasd_device *device) in dasd_alias_remove_device() argument
644 struct dasd_eckd_private *private = device->private; in dasd_alias_remove_device()
652 _remove_device_from_lcu(lcu, device); in dasd_alias_remove_device()
674 * use base device to do IO in dasd_alias_get_start_dev()
713 struct dasd_device *device, in reset_summary_unit_check() argument
732 cqr->startdev = device; in reset_summary_unit_check()
733 cqr->memdev = device; in reset_summary_unit_check()
746 struct dasd_device *device; in _restart_all_base_devices_on_lcu() local
750 list_for_each_entry(device, &lcu->active_devices, alias_list) { in _restart_all_base_devices_on_lcu()
751 private = device->private; in _restart_all_base_devices_on_lcu()
754 dasd_schedule_block_bh(device->block); in _restart_all_base_devices_on_lcu()
755 dasd_schedule_device_bh(device); in _restart_all_base_devices_on_lcu()
757 list_for_each_entry(device, &lcu->inactive_devices, alias_list) { in _restart_all_base_devices_on_lcu()
758 private = device->private; in _restart_all_base_devices_on_lcu()
761 dasd_schedule_block_bh(device->block); in _restart_all_base_devices_on_lcu()
762 dasd_schedule_device_bh(device); in _restart_all_base_devices_on_lcu()
765 list_for_each_entry(device, &pavgroup->baselist, alias_list) { in _restart_all_base_devices_on_lcu()
766 dasd_schedule_block_bh(device->block); in _restart_all_base_devices_on_lcu()
767 dasd_schedule_device_bh(device); in _restart_all_base_devices_on_lcu()
775 struct dasd_device *device, *temp; in flush_all_alias_devices_on_lcu() local
792 list_for_each_entry_safe(device, temp, &lcu->active_devices, in flush_all_alias_devices_on_lcu()
794 private = device->private; in flush_all_alias_devices_on_lcu()
797 list_move(&device->alias_list, &active); in flush_all_alias_devices_on_lcu()
804 device = list_first_entry(&active, struct dasd_device, in flush_all_alias_devices_on_lcu()
807 dasd_flush_device_queue(device); in flush_all_alias_devices_on_lcu()
810 * only move device around if it wasn't moved away while we in flush_all_alias_devices_on_lcu()
813 if (device == list_first_entry(&active, in flush_all_alias_devices_on_lcu()
815 list_move(&device->alias_list, &lcu->active_devices); in flush_all_alias_devices_on_lcu()
816 private = device->private; in flush_all_alias_devices_on_lcu()
826 struct dasd_device *device; in _stop_all_devices_on_lcu() local
828 list_for_each_entry(device, &lcu->active_devices, alias_list) { in _stop_all_devices_on_lcu()
829 spin_lock(get_ccwdev_lock(device->cdev)); in _stop_all_devices_on_lcu()
830 dasd_device_set_stop_bits(device, DASD_STOPPED_SU); in _stop_all_devices_on_lcu()
831 spin_unlock(get_ccwdev_lock(device->cdev)); in _stop_all_devices_on_lcu()
833 list_for_each_entry(device, &lcu->inactive_devices, alias_list) { in _stop_all_devices_on_lcu()
834 spin_lock(get_ccwdev_lock(device->cdev)); in _stop_all_devices_on_lcu()
835 dasd_device_set_stop_bits(device, DASD_STOPPED_SU); in _stop_all_devices_on_lcu()
836 spin_unlock(get_ccwdev_lock(device->cdev)); in _stop_all_devices_on_lcu()
839 list_for_each_entry(device, &pavgroup->baselist, alias_list) { in _stop_all_devices_on_lcu()
840 spin_lock(get_ccwdev_lock(device->cdev)); in _stop_all_devices_on_lcu()
841 dasd_device_set_stop_bits(device, DASD_STOPPED_SU); in _stop_all_devices_on_lcu()
842 spin_unlock(get_ccwdev_lock(device->cdev)); in _stop_all_devices_on_lcu()
844 list_for_each_entry(device, &pavgroup->aliaslist, alias_list) { in _stop_all_devices_on_lcu()
845 spin_lock(get_ccwdev_lock(device->cdev)); in _stop_all_devices_on_lcu()
846 dasd_device_set_stop_bits(device, DASD_STOPPED_SU); in _stop_all_devices_on_lcu()
847 spin_unlock(get_ccwdev_lock(device->cdev)); in _stop_all_devices_on_lcu()
855 struct dasd_device *device; in _unstop_all_devices_on_lcu() local
857 list_for_each_entry(device, &lcu->active_devices, alias_list) { in _unstop_all_devices_on_lcu()
858 spin_lock(get_ccwdev_lock(device->cdev)); in _unstop_all_devices_on_lcu()
859 dasd_device_remove_stop_bits(device, DASD_STOPPED_SU); in _unstop_all_devices_on_lcu()
860 spin_unlock(get_ccwdev_lock(device->cdev)); in _unstop_all_devices_on_lcu()
862 list_for_each_entry(device, &lcu->inactive_devices, alias_list) { in _unstop_all_devices_on_lcu()
863 spin_lock(get_ccwdev_lock(device->cdev)); in _unstop_all_devices_on_lcu()
864 dasd_device_remove_stop_bits(device, DASD_STOPPED_SU); in _unstop_all_devices_on_lcu()
865 spin_unlock(get_ccwdev_lock(device->cdev)); in _unstop_all_devices_on_lcu()
868 list_for_each_entry(device, &pavgroup->baselist, alias_list) { in _unstop_all_devices_on_lcu()
869 spin_lock(get_ccwdev_lock(device->cdev)); in _unstop_all_devices_on_lcu()
870 dasd_device_remove_stop_bits(device, DASD_STOPPED_SU); in _unstop_all_devices_on_lcu()
871 spin_unlock(get_ccwdev_lock(device->cdev)); in _unstop_all_devices_on_lcu()
873 list_for_each_entry(device, &pavgroup->aliaslist, alias_list) { in _unstop_all_devices_on_lcu()
874 spin_lock(get_ccwdev_lock(device->cdev)); in _unstop_all_devices_on_lcu()
875 dasd_device_remove_stop_bits(device, DASD_STOPPED_SU); in _unstop_all_devices_on_lcu()
876 spin_unlock(get_ccwdev_lock(device->cdev)); in _unstop_all_devices_on_lcu()
886 struct dasd_device *device; in summary_unit_check_handling_work() local
891 device = suc_data->device; in summary_unit_check_handling_work()
897 spin_lock_irqsave(get_ccwdev_lock(device->cdev), flags); in summary_unit_check_handling_work()
898 dasd_device_remove_stop_bits(device, in summary_unit_check_handling_work()
900 spin_unlock_irqrestore(get_ccwdev_lock(device->cdev), flags); in summary_unit_check_handling_work()
901 reset_summary_unit_check(lcu, device, suc_data->reason); in summary_unit_check_handling_work()
907 _schedule_lcu_update(lcu, device); in summary_unit_check_handling_work()
908 lcu->suc_data.device = NULL; in summary_unit_check_handling_work()
909 dasd_put_device(device); in summary_unit_check_handling_work()
915 struct dasd_device *device = container_of(work, struct dasd_device, in dasd_alias_handle_summary_unit_check() local
917 struct dasd_eckd_private *private = device->private; in dasd_alias_handle_summary_unit_check()
923 DBF_DEV_EVENT(DBF_WARNING, device, "%s", in dasd_alias_handle_summary_unit_check()
924 "device not ready to handle summary" in dasd_alias_handle_summary_unit_check()
929 /* If this device is about to be removed just return and wait for in dasd_alias_handle_summary_unit_check()
930 * the next interrupt on a different device in dasd_alias_handle_summary_unit_check()
932 if (list_empty(&device->alias_list)) { in dasd_alias_handle_summary_unit_check()
933 DBF_DEV_EVENT(DBF_WARNING, device, "%s", in dasd_alias_handle_summary_unit_check()
934 "device is in offline processing," in dasd_alias_handle_summary_unit_check()
938 if (lcu->suc_data.device) { in dasd_alias_handle_summary_unit_check()
940 DBF_DEV_EVENT(DBF_WARNING, device, "%s", in dasd_alias_handle_summary_unit_check()
949 lcu->suc_data.device = device; in dasd_alias_handle_summary_unit_check()
950 dasd_get_device(device); in dasd_alias_handle_summary_unit_check()
952 dasd_put_device(device); in dasd_alias_handle_summary_unit_check()
956 clear_bit(DASD_FLAG_SUC, &device->flags); in dasd_alias_handle_summary_unit_check()
957 dasd_put_device(device); in dasd_alias_handle_summary_unit_check()