瀏覽代碼

[block] Gracefully close SAN device if registration fails

Signed-off-by: Michael Brown <mcb30@ipxe.org>
tags/v1.20.1
Michael Brown 7 年之前
父節點
當前提交
539088a27b
共有 1 個文件被更改,包括 16 次插入6 次删除
  1. 16
    6
      src/core/sanboot.c

+ 16
- 6
src/core/sanboot.c 查看文件

@@ -733,7 +733,8 @@ int register_sandev ( struct san_device *sandev ) {
733 733
 	/* Check that drive number is not in use */
734 734
 	if ( sandev_find ( sandev->drive ) != NULL ) {
735 735
 		DBGC ( sandev, "SAN %#02x is already in use\n", sandev->drive );
736
-		return -EADDRINUSE;
736
+		rc = -EADDRINUSE;
737
+		goto err_in_use;
737 738
 	}
738 739
 
739 740
 	/* Check that device is capable of being opened (i.e. that all
@@ -741,22 +742,30 @@ int register_sandev ( struct san_device *sandev ) {
741 742
 	 * working).
742 743
 	 */
743 744
 	if ( ( rc = sandev_reopen ( sandev ) ) != 0 )
744
-		return rc;
745
+		goto err_reopen;
745 746
 
746 747
 	/* Read device capacity */
747 748
 	if ( ( rc = sandev_command ( sandev, sandev_command_read_capacity,
748 749
 				     NULL ) ) != 0 )
749
-		return rc;
750
+		goto err_capacity;
750 751
 
751 752
 	/* Configure as a CD-ROM, if applicable */
752 753
 	if ( ( rc = sandev_parse_iso9660 ( sandev ) ) != 0 )
753
-		return rc;
754
+		goto err_iso9660;
754 755
 
755 756
 	/* Add to list of SAN devices */
756 757
 	list_add_tail ( &sandev->list, &san_devices );
757 758
 	DBGC ( sandev, "SAN %#02x registered\n", sandev->drive );
758 759
 
759 760
 	return 0;
761
+
762
+	list_del ( &sandev->list );
763
+ err_iso9660:
764
+ err_capacity:
765
+ err_reopen:
766
+	sandev_restart ( sandev, rc );
767
+ err_in_use:
768
+	return rc;
760 769
 }
761 770
 
762 771
 /**
@@ -769,11 +778,12 @@ void unregister_sandev ( struct san_device *sandev ) {
769 778
 	/* Sanity check */
770 779
 	assert ( ! timer_running ( &sandev->timer ) );
771 780
 
781
+	/* Remove from list of SAN devices */
782
+	list_del ( &sandev->list );
783
+
772 784
 	/* Shut down interfaces */
773 785
 	sandev_restart ( sandev, 0 );
774 786
 
775
-	/* Remove from list of SAN devices */
776
-	list_del ( &sandev->list );
777 787
 	DBGC ( sandev, "SAN %#02x unregistered\n", sandev->drive );
778 788
 }
779 789
 

Loading…
取消
儲存