@@ -1499,70 +1499,54 @@ static const struct blk_mq_ops carm_mq_ops = {
14991499 .queue_rq = carm_queue_rq ,
15001500};
15011501
1502- static int carm_init_disks (struct carm_host * host )
1502+ static int carm_init_disk (struct carm_host * host , unsigned int port_no )
15031503{
1504- unsigned int i ;
1505- int rc = 0 ;
1506-
1507- for (i = 0 ; i < CARM_MAX_PORTS ; i ++ ) {
1508- struct gendisk * disk ;
1509- struct request_queue * q ;
1510- struct carm_port * port ;
1511-
1512- port = & host -> port [i ];
1513- port -> host = host ;
1514- port -> port_no = i ;
1515-
1516- disk = alloc_disk (CARM_MINORS_PER_MAJOR );
1517- if (!disk ) {
1518- rc = - ENOMEM ;
1519- break ;
1520- }
1504+ struct carm_port * port = & host -> port [port_no ];
1505+ struct gendisk * disk ;
1506+ struct request_queue * q ;
15211507
1522- port -> disk = disk ;
1523- sprintf (disk -> disk_name , DRV_NAME "/%u" ,
1524- (unsigned int ) (host -> id * CARM_MAX_PORTS ) + i );
1525- disk -> major = host -> major ;
1526- disk -> first_minor = i * CARM_MINORS_PER_MAJOR ;
1527- disk -> fops = & carm_bd_ops ;
1528- disk -> private_data = port ;
1529-
1530- q = blk_mq_init_sq_queue (& port -> tag_set , & carm_mq_ops ,
1531- max_queue , BLK_MQ_F_SHOULD_MERGE );
1532- if (IS_ERR (q )) {
1533- rc = PTR_ERR (q );
1534- break ;
1535- }
1536- disk -> queue = q ;
1537- blk_queue_max_segments (q , CARM_MAX_REQ_SG );
1538- blk_queue_segment_boundary (q , CARM_SG_BOUNDARY );
1508+ port -> host = host ;
1509+ port -> port_no = port_no ;
15391510
1540- q -> queuedata = port ;
1541- }
1511+ disk = alloc_disk (CARM_MINORS_PER_MAJOR );
1512+ if (!disk )
1513+ return - ENOMEM ;
15421514
1543- return rc ;
1515+ port -> disk = disk ;
1516+ sprintf (disk -> disk_name , DRV_NAME "/%u" ,
1517+ (unsigned int )host -> id * CARM_MAX_PORTS + port_no );
1518+ disk -> major = host -> major ;
1519+ disk -> first_minor = port_no * CARM_MINORS_PER_MAJOR ;
1520+ disk -> fops = & carm_bd_ops ;
1521+ disk -> private_data = port ;
1522+
1523+ q = blk_mq_init_sq_queue (& port -> tag_set , & carm_mq_ops ,
1524+ max_queue , BLK_MQ_F_SHOULD_MERGE );
1525+ if (IS_ERR (q ))
1526+ return PTR_ERR (q );
1527+ disk -> queue = q ;
1528+ blk_queue_max_segments (q , CARM_MAX_REQ_SG );
1529+ blk_queue_segment_boundary (q , CARM_SG_BOUNDARY );
1530+
1531+ q -> queuedata = port ;
1532+ return 0 ;
15441533}
15451534
1546- static void carm_free_disks (struct carm_host * host )
1535+ static void carm_free_disk (struct carm_host * host , unsigned int port_no )
15471536{
1548- unsigned int i ;
1537+ struct carm_port * port = & host -> port [port_no ];
1538+ struct gendisk * disk = port -> disk ;
15491539
1550- for (i = 0 ; i < CARM_MAX_PORTS ; i ++ ) {
1551- struct carm_port * port = & host -> port [i ];
1552- struct gendisk * disk = port -> disk ;
1553-
1554- if (disk ) {
1555- struct request_queue * q = disk -> queue ;
1540+ if (!disk )
1541+ return ;
15561542
1557- if (disk -> flags & GENHD_FL_UP )
1558- del_gendisk (disk );
1559- if (q ) {
1560- blk_mq_free_tag_set (& port -> tag_set );
1561- blk_cleanup_queue (q );
1562- }
1563- put_disk (disk );
1564- }
1543+ if (disk -> flags & GENHD_FL_UP )
1544+ del_gendisk (disk );
1545+ if (disk -> queue ) {
1546+ blk_mq_free_tag_set (& port -> tag_set );
1547+ blk_cleanup_queue (disk -> queue );
15651548 }
1549+ put_disk (disk );
15661550}
15671551
15681552static int carm_init_shm (struct carm_host * host )
@@ -1667,9 +1651,11 @@ static int carm_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
16671651 if (host -> flags & FL_DYN_MAJOR )
16681652 host -> major = rc ;
16691653
1670- rc = carm_init_disks (host );
1671- if (rc )
1672- goto err_out_blkdev_disks ;
1654+ for (i = 0 ; i < CARM_MAX_PORTS ; i ++ ) {
1655+ rc = carm_init_disk (host , i );
1656+ if (rc )
1657+ goto err_out_blkdev_disks ;
1658+ }
16731659
16741660 pci_set_master (pdev );
16751661
@@ -1699,7 +1685,8 @@ static int carm_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
16991685err_out_free_irq :
17001686 free_irq (pdev -> irq , host );
17011687err_out_blkdev_disks :
1702- carm_free_disks (host );
1688+ for (i = 0 ; i < CARM_MAX_PORTS ; i ++ )
1689+ carm_free_disk (host , i );
17031690 unregister_blkdev (host -> major , host -> name );
17041691err_out_free_majors :
17051692 if (host -> major == 160 )
@@ -1724,6 +1711,7 @@ static int carm_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
17241711static void carm_remove_one (struct pci_dev * pdev )
17251712{
17261713 struct carm_host * host = pci_get_drvdata (pdev );
1714+ unsigned int i ;
17271715
17281716 if (!host ) {
17291717 printk (KERN_ERR PFX "BUG: no host data for PCI(%s)\n" ,
@@ -1732,7 +1720,8 @@ static void carm_remove_one (struct pci_dev *pdev)
17321720 }
17331721
17341722 free_irq (pdev -> irq , host );
1735- carm_free_disks (host );
1723+ for (i = 0 ; i < CARM_MAX_PORTS ; i ++ )
1724+ carm_free_disk (host , i );
17361725 unregister_blkdev (host -> major , host -> name );
17371726 if (host -> major == 160 )
17381727 clear_bit (0 , & carm_major_alloc );
0 commit comments