Skip to content

Commit cd94c9e

Browse files
Christoph Hellwigaxboe
authored andcommitted
sx8: cleanup queue and disk allocation / freeing
Make the disk/queue alloc and free helpers per-port by moving the trivial loops into the callers. Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Jens Axboe <axboe@kernel.dk>
1 parent ab11fe5 commit cd94c9e

File tree

1 file changed

+48
-59
lines changed

1 file changed

+48
-59
lines changed

drivers/block/sx8.c

Lines changed: 48 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -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

15681552
static 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)
16991685
err_out_free_irq:
17001686
free_irq(pdev->irq, host);
17011687
err_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);
17041691
err_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)
17241711
static 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

Comments
 (0)