You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
[SCSI] target: Convert backend ->create_virtdevice() call to return ERR_PTR
This patch converts the target_core_store_dev_enable() -> struct se_subsystem_api->create_virtdevice() call to return proper ERR_PTR values back up to configfs logic during backend dependent struct se_device ENABLE exception conditions. Along with the change to target_core_configfs.c, this includes converting IBLOCK, FILEIO, pSCSI, and RAMDISK_* backend subsystem plugins to obtain upper level PTR_ERR return codes (where available), and return via ERR_PTR during a *_create_virtdev() failure. Reported-by: Fubo Chen <fubo.chen@gmail.com> Signed-off-by: Nicholas A. Bellinger <nab@linux-iscsi.org> Signed-off-by: James Bottomley <James.Bottomley@suse.de>
This commit is contained in:
committed by
James Bottomley
parent
5e8de4f319
commit
613640e4e1
@@ -129,10 +129,11 @@ static struct se_device *iblock_create_virtdevice(
|
||||
struct request_queue *q;
|
||||
struct queue_limits *limits;
|
||||
u32 dev_flags = 0;
|
||||
int ret = -EINVAL;
|
||||
|
||||
if (!(ib_dev)) {
|
||||
printk(KERN_ERR "Unable to locate struct iblock_dev parameter\n");
|
||||
return 0;
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
memset(&dev_limits, 0, sizeof(struct se_dev_limits));
|
||||
/*
|
||||
@@ -141,7 +142,7 @@ static struct se_device *iblock_create_virtdevice(
|
||||
ib_dev->ibd_bio_set = bioset_create(32, 64);
|
||||
if (!(ib_dev->ibd_bio_set)) {
|
||||
printk(KERN_ERR "IBLOCK: Unable to create bioset()\n");
|
||||
return 0;
|
||||
return ERR_PTR(-ENOMEM);
|
||||
}
|
||||
printk(KERN_INFO "IBLOCK: Created bio_set()\n");
|
||||
/*
|
||||
@@ -153,8 +154,10 @@ static struct se_device *iblock_create_virtdevice(
|
||||
|
||||
bd = blkdev_get_by_path(ib_dev->ibd_udev_path,
|
||||
FMODE_WRITE|FMODE_READ|FMODE_EXCL, ib_dev);
|
||||
if (IS_ERR(bd))
|
||||
if (IS_ERR(bd)) {
|
||||
ret = PTR_ERR(bd);
|
||||
goto failed;
|
||||
}
|
||||
/*
|
||||
* Setup the local scope queue_limits from struct request_queue->limits
|
||||
* to pass into transport_add_device_to_core_hba() as struct se_dev_limits.
|
||||
@@ -184,9 +187,7 @@ static struct se_device *iblock_create_virtdevice(
|
||||
* the QUEUE_FLAG_DISCARD bit for UNMAP/WRITE_SAME in SCSI + TRIM
|
||||
* in ATA and we need to set TPE=1
|
||||
*/
|
||||
if (blk_queue_discard(bdev_get_queue(bd))) {
|
||||
struct request_queue *q = bdev_get_queue(bd);
|
||||
|
||||
if (blk_queue_discard(q)) {
|
||||
DEV_ATTRIB(dev)->max_unmap_lba_count =
|
||||
q->limits.max_discard_sectors;
|
||||
/*
|
||||
@@ -212,7 +213,7 @@ failed:
|
||||
ib_dev->ibd_bd = NULL;
|
||||
ib_dev->ibd_major = 0;
|
||||
ib_dev->ibd_minor = 0;
|
||||
return NULL;
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
|
||||
static void iblock_free_device(void *p)
|
||||
|
||||
Reference in New Issue
Block a user