Skip to content

Commit 4094981

Browse files
sumitsaxena11martinkpetersen
authored andcommitted
scsi: mpi3mr: Rework mrioc->bsg_device model to fix warnings
During driver unload, mrioc->bsg_device reference count becomes negative. Also, as reported in [1], the driver's bsg_device model had few more bugs. Fix all these up. [1] https://marc.info/?l=linux-scsi&m=165183971411991&w=2 Link: https://lore.kernel.org/r/[email protected] Fixes: 4268fa7 ("scsi: mpi3mr: Add bsg device support") Reported-by: Dan Carpenter <[email protected]> Tested-by: Tomas Henzl <[email protected]> Signed-off-by: Sumit Saxena <[email protected]> Signed-off-by: Martin K. Petersen <[email protected]>
1 parent f9f0a46 commit 4094981

File tree

2 files changed

+23
-27
lines changed

2 files changed

+23
-27
lines changed

drivers/scsi/mpi3mr/mpi3mr.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -954,7 +954,7 @@ struct mpi3mr_ioc {
954954
u16 active_poll_qcount;
955955
u16 requested_poll_qcount;
956956

957-
struct device *bsg_dev;
957+
struct device bsg_dev;
958958
struct request_queue *bsg_queue;
959959
u8 stop_bsgs;
960960
u8 *logdata_buf;

drivers/scsi/mpi3mr/mpi3mr_app.c

Lines changed: 22 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1487,28 +1487,28 @@ static int mpi3mr_bsg_request(struct bsg_job *job)
14871487
*/
14881488
void mpi3mr_bsg_exit(struct mpi3mr_ioc *mrioc)
14891489
{
1490+
struct device *bsg_dev = &mrioc->bsg_dev;
14901491
if (!mrioc->bsg_queue)
14911492
return;
14921493

14931494
bsg_remove_queue(mrioc->bsg_queue);
14941495
mrioc->bsg_queue = NULL;
14951496

1496-
device_del(mrioc->bsg_dev);
1497-
put_device(mrioc->bsg_dev);
1498-
kfree(mrioc->bsg_dev);
1497+
device_del(bsg_dev);
1498+
put_device(bsg_dev);
14991499
}
15001500

15011501
/**
15021502
* mpi3mr_bsg_node_release -release bsg device node
15031503
* @dev: bsg device node
15041504
*
1505-
* decrements bsg dev reference count
1505+
* decrements bsg dev parent reference count
15061506
*
15071507
* Return:Nothing
15081508
*/
15091509
static void mpi3mr_bsg_node_release(struct device *dev)
15101510
{
1511-
put_device(dev);
1511+
put_device(dev->parent);
15121512
}
15131513

15141514
/**
@@ -1521,41 +1521,37 @@ static void mpi3mr_bsg_node_release(struct device *dev)
15211521
*/
15221522
void mpi3mr_bsg_init(struct mpi3mr_ioc *mrioc)
15231523
{
1524-
mrioc->bsg_dev = kzalloc(sizeof(struct device), GFP_KERNEL);
1525-
if (!mrioc->bsg_dev) {
1526-
ioc_err(mrioc, "bsg device mem allocation failed\n");
1527-
return;
1528-
}
1524+
struct device *bsg_dev = &mrioc->bsg_dev;
1525+
struct device *parent = &mrioc->shost->shost_gendev;
1526+
1527+
device_initialize(bsg_dev);
1528+
1529+
bsg_dev->parent = get_device(parent);
1530+
bsg_dev->release = mpi3mr_bsg_node_release;
15291531

1530-
device_initialize(mrioc->bsg_dev);
1531-
dev_set_name(mrioc->bsg_dev, "mpi3mrctl%u", mrioc->id);
1532+
dev_set_name(bsg_dev, "mpi3mrctl%u", mrioc->id);
15321533

1533-
if (device_add(mrioc->bsg_dev)) {
1534+
if (device_add(bsg_dev)) {
15341535
ioc_err(mrioc, "%s: bsg device add failed\n",
1535-
dev_name(mrioc->bsg_dev));
1536-
goto err_device_add;
1536+
dev_name(bsg_dev));
1537+
put_device(bsg_dev);
1538+
return;
15371539
}
15381540

1539-
mrioc->bsg_dev->release = mpi3mr_bsg_node_release;
1540-
1541-
mrioc->bsg_queue = bsg_setup_queue(mrioc->bsg_dev, dev_name(mrioc->bsg_dev),
1541+
mrioc->bsg_queue = bsg_setup_queue(bsg_dev, dev_name(bsg_dev),
15421542
mpi3mr_bsg_request, NULL, 0);
15431543
if (IS_ERR(mrioc->bsg_queue)) {
15441544
ioc_err(mrioc, "%s: bsg registration failed\n",
1545-
dev_name(mrioc->bsg_dev));
1546-
goto err_setup_queue;
1545+
dev_name(bsg_dev));
1546+
device_del(bsg_dev);
1547+
put_device(bsg_dev);
1548+
return;
15471549
}
15481550

15491551
blk_queue_max_segments(mrioc->bsg_queue, MPI3MR_MAX_APP_XFER_SEGMENTS);
15501552
blk_queue_max_hw_sectors(mrioc->bsg_queue, MPI3MR_MAX_APP_XFER_SECTORS);
15511553

15521554
return;
1553-
1554-
err_setup_queue:
1555-
device_del(mrioc->bsg_dev);
1556-
put_device(mrioc->bsg_dev);
1557-
err_device_add:
1558-
kfree(mrioc->bsg_dev);
15591555
}
15601556

15611557
/**

0 commit comments

Comments
 (0)