Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[S390] dasd: remove uid from devmap

Remove the duplicate of the DASD uid from the devmap structure.
Use the uid from the device private structure instead.
This also removes a lockdep warning complaining about a possible
SOFTIRQ-safe -> SOFTIRQ-unsafe lock order.

Signed-off-by: Stefan Haberland <stefan.haberland@de.ibm.com>
Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>

authored by

Stefan Haberland and committed by
Martin Schwidefsky
2dedf0d9 501183f2

+218 -195
+75 -42
drivers/s390/block/dasd_alias.c
··· 190 190 struct alias_server *server, *newserver; 191 191 struct alias_lcu *lcu, *newlcu; 192 192 int is_lcu_known; 193 - struct dasd_uid *uid; 193 + struct dasd_uid uid; 194 194 195 195 private = (struct dasd_eckd_private *) device->private; 196 - uid = &private->uid; 196 + 197 + device->discipline->get_uid(device, &uid); 197 198 spin_lock_irqsave(&aliastree.lock, flags); 198 199 is_lcu_known = 1; 199 - server = _find_server(uid); 200 + server = _find_server(&uid); 200 201 if (!server) { 201 202 spin_unlock_irqrestore(&aliastree.lock, flags); 202 - newserver = _allocate_server(uid); 203 + newserver = _allocate_server(&uid); 203 204 if (IS_ERR(newserver)) 204 205 return PTR_ERR(newserver); 205 206 spin_lock_irqsave(&aliastree.lock, flags); 206 - server = _find_server(uid); 207 + server = _find_server(&uid); 207 208 if (!server) { 208 209 list_add(&newserver->server, &aliastree.serverlist); 209 210 server = newserver; ··· 215 214 } 216 215 } 217 216 218 - lcu = _find_lcu(server, uid); 217 + lcu = _find_lcu(server, &uid); 219 218 if (!lcu) { 220 219 spin_unlock_irqrestore(&aliastree.lock, flags); 221 - newlcu = _allocate_lcu(uid); 220 + newlcu = _allocate_lcu(&uid); 222 221 if (IS_ERR(newlcu)) 223 222 return PTR_ERR(newlcu); 224 223 spin_lock_irqsave(&aliastree.lock, flags); 225 - lcu = _find_lcu(server, uid); 224 + lcu = _find_lcu(server, &uid); 226 225 if (!lcu) { 227 226 list_add(&newlcu->lcu, &server->lculist); 228 227 lcu = newlcu; ··· 257 256 unsigned long flags; 258 257 struct alias_server *server; 259 258 struct alias_lcu *lcu; 260 - struct dasd_uid *uid; 259 + struct dasd_uid uid; 261 260 262 261 private = (struct dasd_eckd_private *) device->private; 263 - uid = &private->uid; 262 + device->discipline->get_uid(device, &uid); 264 263 lcu = NULL; 265 264 spin_lock_irqsave(&aliastree.lock, flags); 266 - server = _find_server(uid); 265 + server = _find_server(&uid); 267 266 if (server) 268 - lcu = _find_lcu(server, uid); 267 + lcu = _find_lcu(server, &uid); 269 268 spin_unlock_irqrestore(&aliastree.lock, flags); 270 269 if (!lcu) { 271 270 DBF_EVENT_DEVID(DBF_ERR, device->cdev, 272 271 "could not find lcu for %04x %02x", 273 - uid->ssid, uid->real_unit_addr); 272 + uid.ssid, uid.real_unit_addr); 274 273 WARN_ON(1); 275 274 return; 276 275 } ··· 283 282 unsigned long flags; 284 283 struct alias_server *server; 285 284 struct alias_lcu *lcu; 286 - struct dasd_uid *uid; 285 + struct dasd_uid uid; 287 286 288 287 private = (struct dasd_eckd_private *) device->private; 289 - uid = &private->uid; 288 + device->discipline->get_uid(device, &uid); 290 289 lcu = NULL; 291 290 spin_lock_irqsave(&aliastree.lock, flags); 292 - server = _find_server(uid); 291 + server = _find_server(&uid); 293 292 if (server) 294 - lcu = _find_lcu(server, uid); 293 + lcu = _find_lcu(server, &uid); 295 294 spin_unlock_irqrestore(&aliastree.lock, flags); 296 295 if (!lcu) { 297 296 DBF_EVENT_DEVID(DBF_ERR, device->cdev, 298 297 "could not find lcu for %04x %02x", 299 - uid->ssid, uid->real_unit_addr); 298 + uid.ssid, uid.real_unit_addr); 300 299 WARN_ON(1); 301 300 return; 302 301 } ··· 315 314 struct alias_lcu *lcu; 316 315 struct alias_server *server; 317 316 int was_pending; 317 + struct dasd_uid uid; 318 318 319 319 private = (struct dasd_eckd_private *) device->private; 320 320 lcu = private->lcu; 321 + device->discipline->get_uid(device, &uid); 321 322 spin_lock_irqsave(&lcu->lock, flags); 322 323 list_del_init(&device->alias_list); 323 324 /* make sure that the workers don't use this device */ ··· 356 353 _schedule_lcu_update(lcu, NULL); 357 354 spin_unlock(&lcu->lock); 358 355 } 359 - server = _find_server(&private->uid); 356 + server = _find_server(&uid); 360 357 if (server && list_empty(&server->lculist)) { 361 358 list_del(&server->server); 362 359 _free_server(server); ··· 369 366 * in the lcu is up to date and will update the device uid before 370 367 * adding it to a pav group. 371 368 */ 369 + 372 370 static int _add_device_to_lcu(struct alias_lcu *lcu, 373 - struct dasd_device *device) 371 + struct dasd_device *device, 372 + struct dasd_device *pos) 374 373 { 375 374 376 375 struct dasd_eckd_private *private; 377 376 struct alias_pav_group *group; 378 - struct dasd_uid *uid; 377 + struct dasd_uid uid; 378 + unsigned long flags; 379 379 380 380 private = (struct dasd_eckd_private *) device->private; 381 - uid = &private->uid; 382 - uid->type = lcu->uac->unit[uid->real_unit_addr].ua_type; 383 - uid->base_unit_addr = lcu->uac->unit[uid->real_unit_addr].base_ua; 384 - dasd_set_uid(device->cdev, &private->uid); 381 + 382 + /* only lock if not already locked */ 383 + if (device != pos) 384 + spin_lock_irqsave_nested(get_ccwdev_lock(device->cdev), flags, 385 + CDEV_NESTED_SECOND); 386 + private->uid.type = lcu->uac->unit[private->uid.real_unit_addr].ua_type; 387 + private->uid.base_unit_addr = 388 + lcu->uac->unit[private->uid.real_unit_addr].base_ua; 389 + uid = private->uid; 390 + 391 + if (device != pos) 392 + spin_unlock_irqrestore(get_ccwdev_lock(device->cdev), flags); 385 393 386 394 /* if we have no PAV anyway, we don't need to bother with PAV groups */ 387 395 if (lcu->pav == NO_PAV) { ··· 400 386 return 0; 401 387 } 402 388 403 - group = _find_group(lcu, uid); 389 + group = _find_group(lcu, &uid); 404 390 if (!group) { 405 391 group = kzalloc(sizeof(*group), GFP_ATOMIC); 406 392 if (!group) 407 393 return -ENOMEM; 408 - memcpy(group->uid.vendor, uid->vendor, sizeof(uid->vendor)); 409 - memcpy(group->uid.serial, uid->serial, sizeof(uid->serial)); 410 - group->uid.ssid = uid->ssid; 411 - if (uid->type == UA_BASE_DEVICE) 412 - group->uid.base_unit_addr = uid->real_unit_addr; 394 + memcpy(group->uid.vendor, uid.vendor, sizeof(uid.vendor)); 395 + memcpy(group->uid.serial, uid.serial, sizeof(uid.serial)); 396 + group->uid.ssid = uid.ssid; 397 + if (uid.type == UA_BASE_DEVICE) 398 + group->uid.base_unit_addr = uid.real_unit_addr; 413 399 else 414 - group->uid.base_unit_addr = uid->base_unit_addr; 415 - memcpy(group->uid.vduit, uid->vduit, sizeof(uid->vduit)); 400 + group->uid.base_unit_addr = uid.base_unit_addr; 401 + memcpy(group->uid.vduit, uid.vduit, sizeof(uid.vduit)); 416 402 INIT_LIST_HEAD(&group->group); 417 403 INIT_LIST_HEAD(&group->baselist); 418 404 INIT_LIST_HEAD(&group->aliaslist); 419 405 list_add(&group->group, &lcu->grouplist); 420 406 } 421 - if (uid->type == UA_BASE_DEVICE) 407 + if (uid.type == UA_BASE_DEVICE) 422 408 list_move(&device->alias_list, &group->baselist); 423 409 else 424 410 list_move(&device->alias_list, &group->aliaslist); ··· 539 525 if (rc) 540 526 return rc; 541 527 542 - spin_lock_irqsave(&lcu->lock, flags); 528 + /* need to take cdev lock before lcu lock */ 529 + spin_lock_irqsave_nested(get_ccwdev_lock(refdev->cdev), flags, 530 + CDEV_NESTED_FIRST); 531 + spin_lock(&lcu->lock); 543 532 lcu->pav = NO_PAV; 544 533 for (i = 0; i < MAX_DEVICES_PER_LCU; ++i) { 545 534 switch (lcu->uac->unit[i].ua_type) { ··· 559 542 560 543 list_for_each_entry_safe(device, tempdev, &lcu->active_devices, 561 544 alias_list) { 562 - _add_device_to_lcu(lcu, device); 545 + _add_device_to_lcu(lcu, device, refdev); 563 546 } 564 - spin_unlock_irqrestore(&lcu->lock, flags); 547 + spin_unlock(&lcu->lock); 548 + spin_unlock_irqrestore(get_ccwdev_lock(refdev->cdev), flags); 565 549 return 0; 566 550 } 567 551 ··· 646 628 private = (struct dasd_eckd_private *) device->private; 647 629 lcu = private->lcu; 648 630 rc = 0; 649 - spin_lock_irqsave(&lcu->lock, flags); 631 + 632 + /* need to take cdev lock before lcu lock */ 633 + spin_lock_irqsave(get_ccwdev_lock(device->cdev), flags); 634 + spin_lock(&lcu->lock); 650 635 if (!(lcu->flags & UPDATE_PENDING)) { 651 - rc = _add_device_to_lcu(lcu, device); 636 + rc = _add_device_to_lcu(lcu, device, device); 652 637 if (rc) 653 638 lcu->flags |= UPDATE_PENDING; 654 639 } ··· 659 638 list_move(&device->alias_list, &lcu->active_devices); 660 639 _schedule_lcu_update(lcu, device); 661 640 } 662 - spin_unlock_irqrestore(&lcu->lock, flags); 641 + spin_unlock(&lcu->lock); 642 + spin_unlock_irqrestore(get_ccwdev_lock(device->cdev), flags); 663 643 return rc; 664 644 } 665 645 ··· 770 748 struct alias_pav_group *pavgroup; 771 749 struct dasd_device *device; 772 750 struct dasd_eckd_private *private; 751 + unsigned long flags; 773 752 774 753 /* active and inactive list can contain alias as well as base devices */ 775 754 list_for_each_entry(device, &lcu->active_devices, alias_list) { 776 755 private = (struct dasd_eckd_private *) device->private; 777 - if (private->uid.type != UA_BASE_DEVICE) 756 + spin_lock_irqsave(get_ccwdev_lock(device->cdev), flags); 757 + if (private->uid.type != UA_BASE_DEVICE) { 758 + spin_unlock_irqrestore(get_ccwdev_lock(device->cdev), 759 + flags); 778 760 continue; 761 + } 762 + spin_unlock_irqrestore(get_ccwdev_lock(device->cdev), flags); 779 763 dasd_schedule_block_bh(device->block); 780 764 dasd_schedule_device_bh(device); 781 765 } 782 766 list_for_each_entry(device, &lcu->inactive_devices, alias_list) { 783 767 private = (struct dasd_eckd_private *) device->private; 784 - if (private->uid.type != UA_BASE_DEVICE) 768 + spin_lock_irqsave(get_ccwdev_lock(device->cdev), flags); 769 + if (private->uid.type != UA_BASE_DEVICE) { 770 + spin_unlock_irqrestore(get_ccwdev_lock(device->cdev), 771 + flags); 785 772 continue; 773 + } 774 + spin_unlock_irqrestore(get_ccwdev_lock(device->cdev), flags); 786 775 dasd_schedule_block_bh(device->block); 787 776 dasd_schedule_device_bh(device); 788 777 }
+68 -106
drivers/s390/block/dasd_devmap.c
··· 49 49 unsigned int devindex; 50 50 unsigned short features; 51 51 struct dasd_device *device; 52 - struct dasd_uid uid; 53 52 }; 54 53 55 54 /* ··· 935 936 936 937 static DEVICE_ATTR(status, 0444, dasd_device_status_show, NULL); 937 938 938 - static ssize_t 939 - dasd_alias_show(struct device *dev, struct device_attribute *attr, char *buf) 939 + static ssize_t dasd_alias_show(struct device *dev, 940 + struct device_attribute *attr, char *buf) 940 941 { 941 - struct dasd_devmap *devmap; 942 - int alias; 942 + struct dasd_device *device; 943 + struct dasd_uid uid; 943 944 944 - devmap = dasd_find_busid(dev_name(dev)); 945 - spin_lock(&dasd_devmap_lock); 946 - if (IS_ERR(devmap) || strlen(devmap->uid.vendor) == 0) { 947 - spin_unlock(&dasd_devmap_lock); 945 + device = dasd_device_from_cdev(to_ccwdev(dev)); 946 + if (IS_ERR(device)) 948 947 return sprintf(buf, "0\n"); 948 + 949 + if (device->discipline && device->discipline->get_uid && 950 + !device->discipline->get_uid(device, &uid)) { 951 + if (uid.type == UA_BASE_PAV_ALIAS || 952 + uid.type == UA_HYPER_PAV_ALIAS) 953 + return sprintf(buf, "1\n"); 949 954 } 950 - if (devmap->uid.type == UA_BASE_PAV_ALIAS || 951 - devmap->uid.type == UA_HYPER_PAV_ALIAS) 952 - alias = 1; 953 - else 954 - alias = 0; 955 - spin_unlock(&dasd_devmap_lock); 956 - return sprintf(buf, alias ? "1\n" : "0\n"); 955 + dasd_put_device(device); 956 + 957 + return sprintf(buf, "0\n"); 957 958 } 958 959 959 960 static DEVICE_ATTR(alias, 0444, dasd_alias_show, NULL); 960 961 961 - static ssize_t 962 - dasd_vendor_show(struct device *dev, struct device_attribute *attr, char *buf) 962 + static ssize_t dasd_vendor_show(struct device *dev, 963 + struct device_attribute *attr, char *buf) 963 964 { 964 - struct dasd_devmap *devmap; 965 + struct dasd_device *device; 966 + struct dasd_uid uid; 965 967 char *vendor; 966 968 967 - devmap = dasd_find_busid(dev_name(dev)); 968 - spin_lock(&dasd_devmap_lock); 969 - if (!IS_ERR(devmap) && strlen(devmap->uid.vendor) > 0) 970 - vendor = devmap->uid.vendor; 971 - else 972 - vendor = ""; 973 - spin_unlock(&dasd_devmap_lock); 969 + device = dasd_device_from_cdev(to_ccwdev(dev)); 970 + vendor = ""; 971 + if (IS_ERR(device)) 972 + return snprintf(buf, PAGE_SIZE, "%s\n", vendor); 973 + 974 + if (device->discipline && device->discipline->get_uid && 975 + !device->discipline->get_uid(device, &uid)) 976 + vendor = uid.vendor; 977 + 978 + dasd_put_device(device); 974 979 975 980 return snprintf(buf, PAGE_SIZE, "%s\n", vendor); 976 981 } ··· 988 985 static ssize_t 989 986 dasd_uid_show(struct device *dev, struct device_attribute *attr, char *buf) 990 987 { 991 - struct dasd_devmap *devmap; 988 + struct dasd_device *device; 989 + struct dasd_uid uid; 992 990 char uid_string[UID_STRLEN]; 993 991 char ua_string[3]; 994 - struct dasd_uid *uid; 995 992 996 - devmap = dasd_find_busid(dev_name(dev)); 997 - spin_lock(&dasd_devmap_lock); 998 - if (IS_ERR(devmap) || strlen(devmap->uid.vendor) == 0) { 999 - spin_unlock(&dasd_devmap_lock); 1000 - return sprintf(buf, "\n"); 993 + device = dasd_device_from_cdev(to_ccwdev(dev)); 994 + uid_string[0] = 0; 995 + if (IS_ERR(device)) 996 + return snprintf(buf, PAGE_SIZE, "%s\n", uid_string); 997 + 998 + if (device->discipline && device->discipline->get_uid && 999 + !device->discipline->get_uid(device, &uid)) { 1000 + switch (uid.type) { 1001 + case UA_BASE_DEVICE: 1002 + snprintf(ua_string, sizeof(ua_string), "%02x", 1003 + uid.real_unit_addr); 1004 + break; 1005 + case UA_BASE_PAV_ALIAS: 1006 + snprintf(ua_string, sizeof(ua_string), "%02x", 1007 + uid.base_unit_addr); 1008 + break; 1009 + case UA_HYPER_PAV_ALIAS: 1010 + snprintf(ua_string, sizeof(ua_string), "xx"); 1011 + break; 1012 + default: 1013 + /* should not happen, treat like base device */ 1014 + snprintf(ua_string, sizeof(ua_string), "%02x", 1015 + uid.real_unit_addr); 1016 + break; 1017 + } 1018 + 1019 + if (strlen(uid.vduit) > 0) 1020 + snprintf(uid_string, sizeof(uid_string), 1021 + "%s.%s.%04x.%s.%s", 1022 + uid.vendor, uid.serial, uid.ssid, ua_string, 1023 + uid.vduit); 1024 + else 1025 + snprintf(uid_string, sizeof(uid_string), 1026 + "%s.%s.%04x.%s", 1027 + uid.vendor, uid.serial, uid.ssid, ua_string); 1001 1028 } 1002 - uid = &devmap->uid; 1003 - switch (uid->type) { 1004 - case UA_BASE_DEVICE: 1005 - sprintf(ua_string, "%02x", uid->real_unit_addr); 1006 - break; 1007 - case UA_BASE_PAV_ALIAS: 1008 - sprintf(ua_string, "%02x", uid->base_unit_addr); 1009 - break; 1010 - case UA_HYPER_PAV_ALIAS: 1011 - sprintf(ua_string, "xx"); 1012 - break; 1013 - default: 1014 - /* should not happen, treat like base device */ 1015 - sprintf(ua_string, "%02x", uid->real_unit_addr); 1016 - break; 1017 - } 1018 - if (strlen(uid->vduit) > 0) 1019 - snprintf(uid_string, sizeof(uid_string), 1020 - "%s.%s.%04x.%s.%s", 1021 - uid->vendor, uid->serial, 1022 - uid->ssid, ua_string, 1023 - uid->vduit); 1024 - else 1025 - snprintf(uid_string, sizeof(uid_string), 1026 - "%s.%s.%04x.%s", 1027 - uid->vendor, uid->serial, 1028 - uid->ssid, ua_string); 1029 - spin_unlock(&dasd_devmap_lock); 1029 + dasd_put_device(device); 1030 + 1030 1031 return snprintf(buf, PAGE_SIZE, "%s\n", uid_string); 1031 1032 } 1032 - 1033 1033 static DEVICE_ATTR(uid, 0444, dasd_uid_show, NULL); 1034 1034 1035 1035 /* ··· 1098 1092 static struct attribute_group dasd_attr_group = { 1099 1093 .attrs = dasd_attrs, 1100 1094 }; 1101 - 1102 - /* 1103 - * Return copy of the device unique identifier. 1104 - */ 1105 - int 1106 - dasd_get_uid(struct ccw_device *cdev, struct dasd_uid *uid) 1107 - { 1108 - struct dasd_devmap *devmap; 1109 - 1110 - devmap = dasd_find_busid(dev_name(&cdev->dev)); 1111 - if (IS_ERR(devmap)) 1112 - return PTR_ERR(devmap); 1113 - spin_lock(&dasd_devmap_lock); 1114 - *uid = devmap->uid; 1115 - spin_unlock(&dasd_devmap_lock); 1116 - return 0; 1117 - } 1118 - EXPORT_SYMBOL_GPL(dasd_get_uid); 1119 - 1120 - /* 1121 - * Register the given device unique identifier into devmap struct. 1122 - * In addition check if the related storage server subsystem ID is already 1123 - * contained in the dasd_server_ssid_list. If subsystem ID is not contained, 1124 - * create new entry. 1125 - * Return 0 if server was already in serverlist, 1126 - * 1 if the server was added successful 1127 - * <0 in case of error. 1128 - */ 1129 - int 1130 - dasd_set_uid(struct ccw_device *cdev, struct dasd_uid *uid) 1131 - { 1132 - struct dasd_devmap *devmap; 1133 - 1134 - devmap = dasd_find_busid(dev_name(&cdev->dev)); 1135 - if (IS_ERR(devmap)) 1136 - return PTR_ERR(devmap); 1137 - 1138 - spin_lock(&dasd_devmap_lock); 1139 - devmap->uid = *uid; 1140 - spin_unlock(&dasd_devmap_lock); 1141 - 1142 - return 0; 1143 - } 1144 - EXPORT_SYMBOL_GPL(dasd_set_uid); 1145 1095 1146 1096 /* 1147 1097 * Return value of the specified feature.
+51 -27
drivers/s390/block/dasd_eckd.c
··· 692 692 /* 693 693 * Generate device unique id that specifies the physical device. 694 694 */ 695 - static int dasd_eckd_generate_uid(struct dasd_device *device, 696 - struct dasd_uid *uid) 695 + static int dasd_eckd_generate_uid(struct dasd_device *device) 697 696 { 698 697 struct dasd_eckd_private *private; 698 + struct dasd_uid *uid; 699 699 int count; 700 + unsigned long flags; 700 701 701 702 private = (struct dasd_eckd_private *) device->private; 702 703 if (!private) 703 704 return -ENODEV; 704 705 if (!private->ned || !private->gneq) 705 706 return -ENODEV; 706 - 707 + uid = &private->uid; 708 + spin_lock_irqsave(get_ccwdev_lock(device->cdev), flags); 707 709 memset(uid, 0, sizeof(struct dasd_uid)); 708 710 memcpy(uid->vendor, private->ned->HDA_manufacturer, 709 711 sizeof(uid->vendor) - 1); ··· 728 726 private->vdsneq->uit[count]); 729 727 } 730 728 } 729 + spin_unlock_irqrestore(get_ccwdev_lock(device->cdev), flags); 731 730 return 0; 731 + } 732 + 733 + static int dasd_eckd_get_uid(struct dasd_device *device, struct dasd_uid *uid) 734 + { 735 + struct dasd_eckd_private *private; 736 + unsigned long flags; 737 + 738 + if (device->private) { 739 + private = (struct dasd_eckd_private *)device->private; 740 + spin_lock_irqsave(get_ccwdev_lock(device->cdev), flags); 741 + *uid = private->uid; 742 + spin_unlock_irqrestore(get_ccwdev_lock(device->cdev), flags); 743 + return 0; 744 + } 745 + return -EINVAL; 732 746 } 733 747 734 748 static struct dasd_ccw_req *dasd_eckd_build_rcd_lpm(struct dasd_device *device, ··· 1106 1088 { 1107 1089 struct dasd_eckd_private *private; 1108 1090 struct dasd_block *block; 1091 + struct dasd_uid temp_uid; 1109 1092 int is_known, rc; 1110 1093 int readonly; 1111 1094 ··· 1143 1124 if (rc) 1144 1125 goto out_err1; 1145 1126 1146 - /* Generate device unique id and register in devmap */ 1147 - rc = dasd_eckd_generate_uid(device, &private->uid); 1127 + /* Generate device unique id */ 1128 + rc = dasd_eckd_generate_uid(device); 1148 1129 if (rc) 1149 1130 goto out_err1; 1150 - dasd_set_uid(device->cdev, &private->uid); 1151 1131 1152 - if (private->uid.type == UA_BASE_DEVICE) { 1132 + dasd_eckd_get_uid(device, &temp_uid); 1133 + if (temp_uid.type == UA_BASE_DEVICE) { 1153 1134 block = dasd_alloc_block(); 1154 1135 if (IS_ERR(block)) { 1155 1136 DBF_EVENT_DEVID(DBF_WARNING, device->cdev, "%s", ··· 3324 3305 if (rc) 3325 3306 goto out_err; 3326 3307 3327 - /* Generate device unique id and register in devmap */ 3328 - rc = dasd_eckd_generate_uid(device, &private->uid); 3329 - dasd_get_uid(device->cdev, &temp_uid); 3308 + dasd_eckd_get_uid(device, &temp_uid); 3309 + /* Generate device unique id */ 3310 + rc = dasd_eckd_generate_uid(device); 3311 + spin_lock_irqsave(get_ccwdev_lock(device->cdev), flags); 3330 3312 if (memcmp(&private->uid, &temp_uid, sizeof(struct dasd_uid)) != 0) 3331 3313 dev_err(&device->cdev->dev, "The UID of the DASD has " 3332 3314 "changed\n"); 3315 + spin_unlock_irqrestore(get_ccwdev_lock(device->cdev), flags); 3333 3316 if (rc) 3334 3317 goto out_err; 3335 - dasd_set_uid(device->cdev, &private->uid); 3336 3318 3337 3319 /* register lcu with alias handling, enable PAV if this is a new lcu */ 3338 3320 is_known = dasd_alias_make_device_known_to_lcu(device); ··· 3378 3358 { 3379 3359 struct dasd_eckd_private *private; 3380 3360 int rc, old_base; 3381 - char uid[60]; 3361 + char print_uid[60]; 3362 + struct dasd_uid uid; 3363 + unsigned long flags; 3382 3364 3383 3365 private = (struct dasd_eckd_private *) device->private; 3366 + 3367 + spin_lock_irqsave(get_ccwdev_lock(device->cdev), flags); 3384 3368 old_base = private->uid.base_unit_addr; 3369 + spin_unlock_irqrestore(get_ccwdev_lock(device->cdev), flags); 3370 + 3385 3371 /* Read Configuration Data */ 3386 3372 rc = dasd_eckd_read_conf(device); 3387 3373 if (rc) 3388 3374 goto out_err; 3389 3375 3390 - rc = dasd_eckd_generate_uid(device, &private->uid); 3376 + rc = dasd_eckd_generate_uid(device); 3391 3377 if (rc) 3392 3378 goto out_err; 3393 - 3394 - dasd_set_uid(device->cdev, &private->uid); 3395 - 3396 3379 /* 3397 3380 * update unit address configuration and 3398 3381 * add device to alias management 3399 3382 */ 3400 3383 dasd_alias_update_add_device(device); 3401 3384 3402 - if (old_base != private->uid.base_unit_addr) { 3403 - if (strlen(private->uid.vduit) > 0) 3404 - snprintf(uid, 60, "%s.%s.%04x.%02x.%s", 3405 - private->uid.vendor, private->uid.serial, 3406 - private->uid.ssid, private->uid.base_unit_addr, 3407 - private->uid.vduit); 3385 + dasd_eckd_get_uid(device, &uid); 3386 + 3387 + if (old_base != uid.base_unit_addr) { 3388 + if (strlen(uid.vduit) > 0) 3389 + snprintf(print_uid, sizeof(print_uid), 3390 + "%s.%s.%04x.%02x.%s", uid.vendor, uid.serial, 3391 + uid.ssid, uid.base_unit_addr, uid.vduit); 3408 3392 else 3409 - snprintf(uid, 60, "%s.%s.%04x.%02x", 3410 - private->uid.vendor, private->uid.serial, 3411 - private->uid.ssid, 3412 - private->uid.base_unit_addr); 3393 + snprintf(print_uid, sizeof(print_uid), 3394 + "%s.%s.%04x.%02x", uid.vendor, uid.serial, 3395 + uid.ssid, uid.base_unit_addr); 3413 3396 3414 3397 dev_info(&device->cdev->dev, 3415 3398 "An Alias device was reassigned to a new base device " 3416 - "with UID: %s\n", uid); 3399 + "with UID: %s\n", print_uid); 3417 3400 } 3418 3401 return 0; 3419 3402 ··· 3478 3455 .freeze = dasd_eckd_pm_freeze, 3479 3456 .restore = dasd_eckd_restore_device, 3480 3457 .reload = dasd_eckd_reload_device, 3458 + .get_uid = dasd_eckd_get_uid, 3481 3459 }; 3482 3460 3483 3461 static int __init
+24 -20
drivers/s390/block/dasd_int.h
··· 81 81 #define DASD_SIM_MSG_TO_OP 0x03 82 82 #define DASD_SIM_LOG 0x0C 83 83 84 + /* lock class for nested cdev lock */ 85 + #define CDEV_NESTED_FIRST 1 86 + #define CDEV_NESTED_SECOND 2 87 + 84 88 /* 85 89 * SECTION: MACROs for klogd and s390 debug feature (dbf) 86 90 */ ··· 233 229 typedef struct dasd_ccw_req *(*dasd_erp_fn_t) (struct dasd_ccw_req *); 234 230 235 231 /* 232 + * Unique identifier for dasd device. 233 + */ 234 + #define UA_NOT_CONFIGURED 0x00 235 + #define UA_BASE_DEVICE 0x01 236 + #define UA_BASE_PAV_ALIAS 0x02 237 + #define UA_HYPER_PAV_ALIAS 0x03 238 + 239 + struct dasd_uid { 240 + __u8 type; 241 + char vendor[4]; 242 + char serial[15]; 243 + __u16 ssid; 244 + __u8 real_unit_addr; 245 + __u8 base_unit_addr; 246 + char vduit[33]; 247 + }; 248 + 249 + /* 236 250 * the struct dasd_discipline is 237 251 * sth like a table of virtual functions, if you think of dasd_eckd 238 252 * inheriting dasd... ··· 337 315 338 316 /* reload device after state change */ 339 317 int (*reload) (struct dasd_device *); 318 + 319 + int (*get_uid) (struct dasd_device *, struct dasd_uid *); 340 320 }; 341 321 342 322 extern struct dasd_discipline *dasd_diag_discipline_pointer; 343 - 344 - /* 345 - * Unique identifier for dasd device. 346 - */ 347 - #define UA_NOT_CONFIGURED 0x00 348 - #define UA_BASE_DEVICE 0x01 349 - #define UA_BASE_PAV_ALIAS 0x02 350 - #define UA_HYPER_PAV_ALIAS 0x03 351 - 352 - struct dasd_uid { 353 - __u8 type; 354 - char vendor[4]; 355 - char serial[15]; 356 - __u16 ssid; 357 - __u8 real_unit_addr; 358 - __u8 base_unit_addr; 359 - char vduit[33]; 360 - }; 361 323 362 324 /* 363 325 * Notification numbers for extended error reporting notifications: ··· 640 634 struct dasd_device *dasd_create_device(struct ccw_device *); 641 635 void dasd_delete_device(struct dasd_device *); 642 636 643 - int dasd_get_uid(struct ccw_device *, struct dasd_uid *); 644 - int dasd_set_uid(struct ccw_device *, struct dasd_uid *); 645 637 int dasd_get_feature(struct ccw_device *, int); 646 638 int dasd_set_feature(struct ccw_device *, int, int); 647 639