aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/target/target_core_iblock.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2011-03-26 00:06:13 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2011-03-26 00:06:13 -0400
commit9f34217c846a96dea03f4418e2f27423658d3542 (patch)
tree5b137af50db5758261700015911afb197ac8fc9f /drivers/target/target_core_iblock.c
parent95e14ed7fc4b2db62eb597a70850a0fede48b78a (diff)
parent3703b2c5d041a68095cdd22380c23ce27d449ad7 (diff)
Merge git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6: (55 commits) [SCSI] tcm_loop: Add multi-fabric Linux/SCSI LLD fabric module [SCSI] qla4xxx: Use polling mode for disable interrupt mailbox completion [SCSI] Revert "[SCSI] Retrieve the Caching mode page" [SCSI] bnx2fc: IO completion not processed due to missed wakeup [SCSI] qla4xxx: Update driver version to 5.02.00-k6 [SCSI] qla4xxx: masking required bits of add_fw_options during initialization [SCSI] qla4xxx: added new function qla4xxx_relogin_all_devices [SCSI] qla4xxx: add support for ql4xsess_recovery_tmo cmd line param [SCSI] qla4xxx: Add support for ql4xmaxqdepth command line parameter [SCSI] qla4xxx: cleanup function qla4xxx_process_ddb_changed [SCSI] qla4xxx: Prevent other port reinitialization during remove_adapter [SCSI] qla4xxx: remove unused ddb flag DF_NO_RELOGIN [SCSI] qla4xxx: cleanup DDB relogin logic during initialization [SCSI] qla4xxx: Do not retry ISP82XX initialization if H/W state is failed [SCSI] qla4xxx: Do not send mbox command if FW is in failed state [SCSI] qla4xxx: cleanup qla4xxx_initialize_ddb_list() [SCSI] ses: add subenclosure support [SCSI] bnx2fc: Bump version to 1.0.1 [SCSI] bnx2fc: Remove unnecessary module state checks [SCSI] bnx2fc: Fix MTU issue by using static MTU ...
Diffstat (limited to 'drivers/target/target_core_iblock.c')
-rw-r--r--drivers/target/target_core_iblock.c28
1 files changed, 17 insertions, 11 deletions
diff --git a/drivers/target/target_core_iblock.c b/drivers/target/target_core_iblock.c
index eb0afec046e1..86639004af9e 100644
--- a/drivers/target/target_core_iblock.c
+++ b/drivers/target/target_core_iblock.c
@@ -129,10 +129,11 @@ static struct se_device *iblock_create_virtdevice(
129 struct request_queue *q; 129 struct request_queue *q;
130 struct queue_limits *limits; 130 struct queue_limits *limits;
131 u32 dev_flags = 0; 131 u32 dev_flags = 0;
132 int ret = -EINVAL;
132 133
133 if (!(ib_dev)) { 134 if (!(ib_dev)) {
134 printk(KERN_ERR "Unable to locate struct iblock_dev parameter\n"); 135 printk(KERN_ERR "Unable to locate struct iblock_dev parameter\n");
135 return 0; 136 return ERR_PTR(ret);
136 } 137 }
137 memset(&dev_limits, 0, sizeof(struct se_dev_limits)); 138 memset(&dev_limits, 0, sizeof(struct se_dev_limits));
138 /* 139 /*
@@ -141,7 +142,7 @@ static struct se_device *iblock_create_virtdevice(
141 ib_dev->ibd_bio_set = bioset_create(32, 64); 142 ib_dev->ibd_bio_set = bioset_create(32, 64);
142 if (!(ib_dev->ibd_bio_set)) { 143 if (!(ib_dev->ibd_bio_set)) {
143 printk(KERN_ERR "IBLOCK: Unable to create bioset()\n"); 144 printk(KERN_ERR "IBLOCK: Unable to create bioset()\n");
144 return 0; 145 return ERR_PTR(-ENOMEM);
145 } 146 }
146 printk(KERN_INFO "IBLOCK: Created bio_set()\n"); 147 printk(KERN_INFO "IBLOCK: Created bio_set()\n");
147 /* 148 /*
@@ -153,8 +154,10 @@ static struct se_device *iblock_create_virtdevice(
153 154
154 bd = blkdev_get_by_path(ib_dev->ibd_udev_path, 155 bd = blkdev_get_by_path(ib_dev->ibd_udev_path,
155 FMODE_WRITE|FMODE_READ|FMODE_EXCL, ib_dev); 156 FMODE_WRITE|FMODE_READ|FMODE_EXCL, ib_dev);
156 if (IS_ERR(bd)) 157 if (IS_ERR(bd)) {
158 ret = PTR_ERR(bd);
157 goto failed; 159 goto failed;
160 }
158 /* 161 /*
159 * Setup the local scope queue_limits from struct request_queue->limits 162 * Setup the local scope queue_limits from struct request_queue->limits
160 * to pass into transport_add_device_to_core_hba() as struct se_dev_limits. 163 * 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(
184 * the QUEUE_FLAG_DISCARD bit for UNMAP/WRITE_SAME in SCSI + TRIM 187 * the QUEUE_FLAG_DISCARD bit for UNMAP/WRITE_SAME in SCSI + TRIM
185 * in ATA and we need to set TPE=1 188 * in ATA and we need to set TPE=1
186 */ 189 */
187 if (blk_queue_discard(bdev_get_queue(bd))) { 190 if (blk_queue_discard(q)) {
188 struct request_queue *q = bdev_get_queue(bd);
189
190 DEV_ATTRIB(dev)->max_unmap_lba_count = 191 DEV_ATTRIB(dev)->max_unmap_lba_count =
191 q->limits.max_discard_sectors; 192 q->limits.max_discard_sectors;
192 /* 193 /*
@@ -212,7 +213,7 @@ failed:
212 ib_dev->ibd_bd = NULL; 213 ib_dev->ibd_bd = NULL;
213 ib_dev->ibd_major = 0; 214 ib_dev->ibd_major = 0;
214 ib_dev->ibd_minor = 0; 215 ib_dev->ibd_minor = 0;
215 return NULL; 216 return ERR_PTR(ret);
216} 217}
217 218
218static void iblock_free_device(void *p) 219static void iblock_free_device(void *p)
@@ -467,7 +468,7 @@ static ssize_t iblock_set_configfs_dev_params(struct se_hba *hba,
467 const char *page, ssize_t count) 468 const char *page, ssize_t count)
468{ 469{
469 struct iblock_dev *ib_dev = se_dev->se_dev_su_ptr; 470 struct iblock_dev *ib_dev = se_dev->se_dev_su_ptr;
470 char *orig, *ptr, *opts; 471 char *orig, *ptr, *arg_p, *opts;
471 substring_t args[MAX_OPT_ARGS]; 472 substring_t args[MAX_OPT_ARGS];
472 int ret = 0, arg, token; 473 int ret = 0, arg, token;
473 474
@@ -490,9 +491,14 @@ static ssize_t iblock_set_configfs_dev_params(struct se_hba *hba,
490 ret = -EEXIST; 491 ret = -EEXIST;
491 goto out; 492 goto out;
492 } 493 }
493 494 arg_p = match_strdup(&args[0]);
494 ret = snprintf(ib_dev->ibd_udev_path, SE_UDEV_PATH_LEN, 495 if (!arg_p) {
495 "%s", match_strdup(&args[0])); 496 ret = -ENOMEM;
497 break;
498 }
499 snprintf(ib_dev->ibd_udev_path, SE_UDEV_PATH_LEN,
500 "%s", arg_p);
501 kfree(arg_p);
496 printk(KERN_INFO "IBLOCK: Referencing UDEV path: %s\n", 502 printk(KERN_INFO "IBLOCK: Referencing UDEV path: %s\n",
497 ib_dev->ibd_udev_path); 503 ib_dev->ibd_udev_path);
498 ib_dev->ibd_flags |= IBDF_HAS_UDEV_PATH; 504 ib_dev->ibd_flags |= IBDF_HAS_UDEV_PATH;