Lines Matching full:device
18 * - A device is connected to an lcu as long as the device exists.
20 * device is checked by the eckd discipline and
22 * before the device is deleted.
24 * functions mark the point when a device is 'ready for service'.
28 * - dasd_alias_get_start_dev will find an alias device that can be used
29 * instead of the base device and does some (very simple) load balancing.
173 * so this function must be called first for a new device.
178 int dasd_alias_make_device_known_to_lcu(struct dasd_device *device) in dasd_alias_make_device_known_to_lcu() argument
180 struct dasd_eckd_private *private = device->private; in dasd_alias_make_device_known_to_lcu()
186 device->discipline->get_uid(device, &uid); in dasd_alias_make_device_known_to_lcu()
222 list_add(&device->alias_list, &lcu->inactive_devices); in dasd_alias_make_device_known_to_lcu()
231 * This function removes a device from the scope of alias management.
235 void dasd_alias_disconnect_device_from_lcu(struct dasd_device *device) in dasd_alias_disconnect_device_from_lcu() argument
237 struct dasd_eckd_private *private = device->private; in dasd_alias_disconnect_device_from_lcu()
248 device->discipline->get_uid(device, &uid); in dasd_alias_disconnect_device_from_lcu()
250 /* make sure that the workers don't use this device */ in dasd_alias_disconnect_device_from_lcu()
251 if (device == lcu->suc_data.device) { in dasd_alias_disconnect_device_from_lcu()
255 if (device == lcu->suc_data.device) { in dasd_alias_disconnect_device_from_lcu()
256 dasd_put_device(device); in dasd_alias_disconnect_device_from_lcu()
257 lcu->suc_data.device = NULL; in dasd_alias_disconnect_device_from_lcu()
261 if (device == lcu->ruac_data.device) { in dasd_alias_disconnect_device_from_lcu()
266 if (device == lcu->ruac_data.device) { in dasd_alias_disconnect_device_from_lcu()
267 dasd_put_device(device); in dasd_alias_disconnect_device_from_lcu()
268 lcu->ruac_data.device = NULL; in dasd_alias_disconnect_device_from_lcu()
276 list_del_init(&device->alias_list); in dasd_alias_disconnect_device_from_lcu()
299 * in the lcu is up to date and will update the device uid before
304 struct dasd_device *device, in _add_device_to_lcu() argument
308 struct dasd_eckd_private *private = device->private; in _add_device_to_lcu()
312 spin_lock(get_ccwdev_lock(device->cdev)); in _add_device_to_lcu()
317 spin_unlock(get_ccwdev_lock(device->cdev)); in _add_device_to_lcu()
320 list_move(&device->alias_list, &lcu->active_devices); in _add_device_to_lcu()
342 list_move(&device->alias_list, &group->baselist); in _add_device_to_lcu()
344 list_move(&device->alias_list, &group->aliaslist); in _add_device_to_lcu()
350 struct dasd_device *device) in _remove_device_from_lcu() argument
352 struct dasd_eckd_private *private = device->private; in _remove_device_from_lcu()
355 list_move(&device->alias_list, &lcu->inactive_devices); in _remove_device_from_lcu()
365 if (group->next == device) in _remove_device_from_lcu()
406 static int read_unit_address_configuration(struct dasd_device *device, in read_unit_address_configuration() argument
417 device, NULL); in read_unit_address_configuration()
420 cqr->startdev = device; in read_unit_address_configuration()
421 cqr->memdev = device; in read_unit_address_configuration()
460 /* suborder not supported or device unusable for IO */ in read_unit_address_configuration()
477 struct dasd_device *device, *tempdev; in _lcu_update() local
483 list_for_each_entry_safe(device, tempdev, &pavgroup->baselist, in _lcu_update()
485 list_move(&device->alias_list, &lcu->active_devices); in _lcu_update()
486 private = device->private; in _lcu_update()
489 list_for_each_entry_safe(device, tempdev, &pavgroup->aliaslist, in _lcu_update()
491 list_move(&device->alias_list, &lcu->active_devices); in _lcu_update()
492 private = device->private; in _lcu_update()
508 * but especially do not add the device to an LCU with pending in _lcu_update()
527 list_for_each_entry_safe(device, tempdev, &lcu->active_devices, in _lcu_update()
529 _add_device_to_lcu(lcu, device, refdev); in _lcu_update()
540 struct dasd_device *device; in lcu_update_work() local
546 device = ruac_data->device; in lcu_update_work()
547 rc = _lcu_update(device, lcu); in lcu_update_work()
550 * prepare_update or a new device a new device while we were still in lcu_update_work()
555 DBF_DEV_EVENT(DBF_WARNING, device, "could not update" in lcu_update_work()
558 dasd_put_device(device); in lcu_update_work()
560 dasd_put_device(device); in lcu_update_work()
561 lcu->ruac_data.device = NULL; in lcu_update_work()
568 struct dasd_device *device) in _schedule_lcu_update() argument
574 if (lcu->ruac_data.device) { in _schedule_lcu_update()
578 if (device && !list_empty(&device->alias_list)) in _schedule_lcu_update()
579 usedev = device; in _schedule_lcu_update()
598 * if we haven't found a proper device yet, give up for now, the next in _schedule_lcu_update()
599 * device that will be set active will trigger an lcu update in _schedule_lcu_update()
604 lcu->ruac_data.device = usedev; in _schedule_lcu_update()
610 int dasd_alias_add_device(struct dasd_device *device) in dasd_alias_add_device() argument
612 struct dasd_eckd_private *private = device->private; in dasd_alias_add_device()
621 * Check if device and lcu type differ. If so, the uac data may be in dasd_alias_add_device()
626 DBF_DEV_EVENT(DBF_WARNING, device, "%s", in dasd_alias_add_device()
630 rc = _add_device_to_lcu(lcu, device, device); in dasd_alias_add_device()
635 list_move(&device->alias_list, &lcu->active_devices); in dasd_alias_add_device()
637 _schedule_lcu_update(lcu, device); in dasd_alias_add_device()
643 int dasd_alias_update_add_device(struct dasd_device *device) in dasd_alias_update_add_device() argument
645 struct dasd_eckd_private *private = device->private; in dasd_alias_update_add_device()
648 return dasd_alias_add_device(device); in dasd_alias_update_add_device()
651 int dasd_alias_remove_device(struct dasd_device *device) in dasd_alias_remove_device() argument
653 struct dasd_eckd_private *private = device->private; in dasd_alias_remove_device()
661 _remove_device_from_lcu(lcu, device); in dasd_alias_remove_device()
683 * use base device to do IO in dasd_alias_get_start_dev()
727 struct dasd_device *device, in reset_summary_unit_check() argument
746 cqr->startdev = device; in reset_summary_unit_check()
747 cqr->memdev = device; in reset_summary_unit_check()
760 struct dasd_device *device; in _restart_all_base_devices_on_lcu() local
764 list_for_each_entry(device, &lcu->active_devices, alias_list) { in _restart_all_base_devices_on_lcu()
765 private = device->private; in _restart_all_base_devices_on_lcu()
768 dasd_schedule_block_bh(device->block); in _restart_all_base_devices_on_lcu()
769 dasd_schedule_device_bh(device); in _restart_all_base_devices_on_lcu()
771 list_for_each_entry(device, &lcu->inactive_devices, alias_list) { in _restart_all_base_devices_on_lcu()
772 private = device->private; in _restart_all_base_devices_on_lcu()
775 dasd_schedule_block_bh(device->block); in _restart_all_base_devices_on_lcu()
776 dasd_schedule_device_bh(device); in _restart_all_base_devices_on_lcu()
779 list_for_each_entry(device, &pavgroup->baselist, alias_list) { in _restart_all_base_devices_on_lcu()
780 dasd_schedule_block_bh(device->block); in _restart_all_base_devices_on_lcu()
781 dasd_schedule_device_bh(device); in _restart_all_base_devices_on_lcu()
789 struct dasd_device *device, *temp; in flush_all_alias_devices_on_lcu() local
806 list_for_each_entry_safe(device, temp, &lcu->active_devices, in flush_all_alias_devices_on_lcu()
808 private = device->private; in flush_all_alias_devices_on_lcu()
811 list_move(&device->alias_list, &active); in flush_all_alias_devices_on_lcu()
818 device = list_first_entry(&active, struct dasd_device, in flush_all_alias_devices_on_lcu()
821 dasd_flush_device_queue(device); in flush_all_alias_devices_on_lcu()
824 * only move device around if it wasn't moved away while we in flush_all_alias_devices_on_lcu()
827 if (device == list_first_entry(&active, in flush_all_alias_devices_on_lcu()
829 list_move(&device->alias_list, &lcu->active_devices); in flush_all_alias_devices_on_lcu()
830 private = device->private; in flush_all_alias_devices_on_lcu()
840 struct dasd_device *device; in _stop_all_devices_on_lcu() local
842 list_for_each_entry(device, &lcu->active_devices, alias_list) { in _stop_all_devices_on_lcu()
843 spin_lock(get_ccwdev_lock(device->cdev)); in _stop_all_devices_on_lcu()
844 dasd_device_set_stop_bits(device, DASD_STOPPED_SU); in _stop_all_devices_on_lcu()
845 spin_unlock(get_ccwdev_lock(device->cdev)); in _stop_all_devices_on_lcu()
847 list_for_each_entry(device, &lcu->inactive_devices, alias_list) { in _stop_all_devices_on_lcu()
848 spin_lock(get_ccwdev_lock(device->cdev)); in _stop_all_devices_on_lcu()
849 dasd_device_set_stop_bits(device, DASD_STOPPED_SU); in _stop_all_devices_on_lcu()
850 spin_unlock(get_ccwdev_lock(device->cdev)); in _stop_all_devices_on_lcu()
853 list_for_each_entry(device, &pavgroup->baselist, alias_list) { in _stop_all_devices_on_lcu()
854 spin_lock(get_ccwdev_lock(device->cdev)); in _stop_all_devices_on_lcu()
855 dasd_device_set_stop_bits(device, DASD_STOPPED_SU); in _stop_all_devices_on_lcu()
856 spin_unlock(get_ccwdev_lock(device->cdev)); in _stop_all_devices_on_lcu()
858 list_for_each_entry(device, &pavgroup->aliaslist, alias_list) { in _stop_all_devices_on_lcu()
859 spin_lock(get_ccwdev_lock(device->cdev)); in _stop_all_devices_on_lcu()
860 dasd_device_set_stop_bits(device, DASD_STOPPED_SU); in _stop_all_devices_on_lcu()
861 spin_unlock(get_ccwdev_lock(device->cdev)); in _stop_all_devices_on_lcu()
869 struct dasd_device *device; in _unstop_all_devices_on_lcu() local
871 list_for_each_entry(device, &lcu->active_devices, alias_list) { in _unstop_all_devices_on_lcu()
872 spin_lock(get_ccwdev_lock(device->cdev)); in _unstop_all_devices_on_lcu()
873 dasd_device_remove_stop_bits(device, DASD_STOPPED_SU); in _unstop_all_devices_on_lcu()
874 spin_unlock(get_ccwdev_lock(device->cdev)); in _unstop_all_devices_on_lcu()
876 list_for_each_entry(device, &lcu->inactive_devices, alias_list) { in _unstop_all_devices_on_lcu()
877 spin_lock(get_ccwdev_lock(device->cdev)); in _unstop_all_devices_on_lcu()
878 dasd_device_remove_stop_bits(device, DASD_STOPPED_SU); in _unstop_all_devices_on_lcu()
879 spin_unlock(get_ccwdev_lock(device->cdev)); in _unstop_all_devices_on_lcu()
882 list_for_each_entry(device, &pavgroup->baselist, alias_list) { in _unstop_all_devices_on_lcu()
883 spin_lock(get_ccwdev_lock(device->cdev)); in _unstop_all_devices_on_lcu()
884 dasd_device_remove_stop_bits(device, DASD_STOPPED_SU); in _unstop_all_devices_on_lcu()
885 spin_unlock(get_ccwdev_lock(device->cdev)); in _unstop_all_devices_on_lcu()
887 list_for_each_entry(device, &pavgroup->aliaslist, alias_list) { in _unstop_all_devices_on_lcu()
888 spin_lock(get_ccwdev_lock(device->cdev)); in _unstop_all_devices_on_lcu()
889 dasd_device_remove_stop_bits(device, DASD_STOPPED_SU); in _unstop_all_devices_on_lcu()
890 spin_unlock(get_ccwdev_lock(device->cdev)); in _unstop_all_devices_on_lcu()
900 struct dasd_device *device; in summary_unit_check_handling_work() local
905 device = suc_data->device; in summary_unit_check_handling_work()
911 spin_lock_irqsave(get_ccwdev_lock(device->cdev), flags); in summary_unit_check_handling_work()
912 dasd_device_remove_stop_bits(device, in summary_unit_check_handling_work()
914 spin_unlock_irqrestore(get_ccwdev_lock(device->cdev), flags); in summary_unit_check_handling_work()
915 reset_summary_unit_check(lcu, device, suc_data->reason); in summary_unit_check_handling_work()
921 _schedule_lcu_update(lcu, device); in summary_unit_check_handling_work()
922 lcu->suc_data.device = NULL; in summary_unit_check_handling_work()
923 dasd_put_device(device); in summary_unit_check_handling_work()
929 struct dasd_device *device = container_of(work, struct dasd_device, in dasd_alias_handle_summary_unit_check() local
931 struct dasd_eckd_private *private = device->private; in dasd_alias_handle_summary_unit_check()
937 DBF_DEV_EVENT(DBF_WARNING, device, "%s", in dasd_alias_handle_summary_unit_check()
938 "device not ready to handle summary" in dasd_alias_handle_summary_unit_check()
943 /* If this device is about to be removed just return and wait for in dasd_alias_handle_summary_unit_check()
944 * the next interrupt on a different device in dasd_alias_handle_summary_unit_check()
946 if (list_empty(&device->alias_list)) { in dasd_alias_handle_summary_unit_check()
947 DBF_DEV_EVENT(DBF_WARNING, device, "%s", in dasd_alias_handle_summary_unit_check()
948 "device is in offline processing," in dasd_alias_handle_summary_unit_check()
952 if (lcu->suc_data.device) { in dasd_alias_handle_summary_unit_check()
954 DBF_DEV_EVENT(DBF_WARNING, device, "%s", in dasd_alias_handle_summary_unit_check()
963 lcu->suc_data.device = device; in dasd_alias_handle_summary_unit_check()
964 dasd_get_device(device); in dasd_alias_handle_summary_unit_check()
966 dasd_put_device(device); in dasd_alias_handle_summary_unit_check()
970 clear_bit(DASD_FLAG_SUC, &device->flags); in dasd_alias_handle_summary_unit_check()
971 dasd_put_device(device); in dasd_alias_handle_summary_unit_check()