Blame view

drivers/target/target_core_iblock.c 17.3 KB
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
  /*******************************************************************************
   * Filename:  target_core_iblock.c
   *
   * This file contains the Storage Engine  <-> Linux BlockIO transport
   * specific functions.
   *
   * Copyright (c) 2003, 2004, 2005 PyX Technologies, Inc.
   * Copyright (c) 2005, 2006, 2007 SBE, Inc.
   * Copyright (c) 2007-2010 Rising Tide Systems
   * Copyright (c) 2008-2010 Linux-iSCSI.org
   *
   * Nicholas A. Bellinger <nab@kernel.org>
   *
   * This program is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License as published by
   * the Free Software Foundation; either version 2 of the License, or
   * (at your option) any later version.
   *
   * This program is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   * GNU General Public License for more details.
   *
   * You should have received a copy of the GNU General Public License
   * along with this program; if not, write to the Free Software
   * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
   *
   ******************************************************************************/
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
29
30
31
32
33
34
35
  #include <linux/string.h>
  #include <linux/parser.h>
  #include <linux/timer.h>
  #include <linux/fs.h>
  #include <linux/blkdev.h>
  #include <linux/slab.h>
  #include <linux/spinlock.h>
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
36
37
38
  #include <linux/bio.h>
  #include <linux/genhd.h>
  #include <linux/file.h>
827509e38   Paul Gortmaker   drivers/target: A...
39
  #include <linux/module.h>
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
40
41
42
43
44
45
46
47
  #include <scsi/scsi.h>
  #include <scsi/scsi_host.h>
  
  #include <target/target_core_base.h>
  #include <target/target_core_device.h>
  #include <target/target_core_transport.h>
  
  #include "target_core_iblock.h"
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
48
49
50
51
52
53
54
55
56
57
58
59
60
  static struct se_subsystem_api iblock_template;
  
  static void iblock_bio_done(struct bio *, int);
  
  /*	iblock_attach_hba(): (Part of se_subsystem_api_t template)
   *
   *
   */
  static int iblock_attach_hba(struct se_hba *hba, u32 host_id)
  {
  	struct iblock_hba *ib_host;
  
  	ib_host = kzalloc(sizeof(struct iblock_hba), GFP_KERNEL);
6708bb27b   Andy Grover   target: Follow up...
61
62
  	if (!ib_host) {
  		pr_err("Unable to allocate memory for"
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
63
64
65
66
67
68
  				" struct iblock_hba
  ");
  		return -ENOMEM;
  	}
  
  	ib_host->iblock_host_id = host_id;
5951146de   Andy Grover   target: More core...
69
  	hba->hba_ptr = ib_host;
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
70

6708bb27b   Andy Grover   target: Follow up...
71
  	pr_debug("CORE_HBA[%d] - TCM iBlock HBA Driver %s on"
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
72
73
74
  		" Generic Target Core Stack %s
  ", hba->hba_id,
  		IBLOCK_VERSION, TARGET_CORE_MOD_VERSION);
6708bb27b   Andy Grover   target: Follow up...
75
76
  	pr_debug("CORE_HBA[%d] - Attached iBlock HBA: %u to Generic
  ",
e3d6f909e   Andy Grover   target: Core clea...
77
  		hba->hba_id, ib_host->iblock_host_id);
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
78
79
80
81
82
83
84
  
  	return 0;
  }
  
  static void iblock_detach_hba(struct se_hba *hba)
  {
  	struct iblock_hba *ib_host = hba->hba_ptr;
6708bb27b   Andy Grover   target: Follow up...
85
  	pr_debug("CORE_HBA[%d] - Detached iBlock HBA: %u from Generic"
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
86
87
88
89
90
91
92
93
94
95
96
97
98
  		" Target Core
  ", hba->hba_id, ib_host->iblock_host_id);
  
  	kfree(ib_host);
  	hba->hba_ptr = NULL;
  }
  
  static void *iblock_allocate_virtdevice(struct se_hba *hba, const char *name)
  {
  	struct iblock_dev *ib_dev = NULL;
  	struct iblock_hba *ib_host = hba->hba_ptr;
  
  	ib_dev = kzalloc(sizeof(struct iblock_dev), GFP_KERNEL);
6708bb27b   Andy Grover   target: Follow up...
99
100
101
  	if (!ib_dev) {
  		pr_err("Unable to allocate struct iblock_dev
  ");
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
102
103
104
  		return NULL;
  	}
  	ib_dev->ibd_host = ib_host;
6708bb27b   Andy Grover   target: Follow up...
105
106
  	pr_debug( "IBLOCK: Allocated ib_dev for %s
  ", name);
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
  
  	return ib_dev;
  }
  
  static struct se_device *iblock_create_virtdevice(
  	struct se_hba *hba,
  	struct se_subsystem_dev *se_dev,
  	void *p)
  {
  	struct iblock_dev *ib_dev = p;
  	struct se_device *dev;
  	struct se_dev_limits dev_limits;
  	struct block_device *bd = NULL;
  	struct request_queue *q;
  	struct queue_limits *limits;
  	u32 dev_flags = 0;
613640e4e   Nicholas Bellinger   [SCSI] target: Co...
123
  	int ret = -EINVAL;
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
124

6708bb27b   Andy Grover   target: Follow up...
125
126
127
  	if (!ib_dev) {
  		pr_err("Unable to locate struct iblock_dev parameter
  ");
613640e4e   Nicholas Bellinger   [SCSI] target: Co...
128
  		return ERR_PTR(ret);
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
129
130
131
132
133
134
  	}
  	memset(&dev_limits, 0, sizeof(struct se_dev_limits));
  	/*
  	 * These settings need to be made tunable..
  	 */
  	ib_dev->ibd_bio_set = bioset_create(32, 64);
6708bb27b   Andy Grover   target: Follow up...
135
136
137
  	if (!ib_dev->ibd_bio_set) {
  		pr_err("IBLOCK: Unable to create bioset()
  ");
613640e4e   Nicholas Bellinger   [SCSI] target: Co...
138
  		return ERR_PTR(-ENOMEM);
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
139
  	}
6708bb27b   Andy Grover   target: Follow up...
140
141
  	pr_debug("IBLOCK: Created bio_set()
  ");
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
142
143
144
145
  	/*
  	 * iblock_check_configfs_dev_params() ensures that ib_dev->ibd_udev_path
  	 * must already have been set in order for echo 1 > $HBA/$DEV/enable to run.
  	 */
6708bb27b   Andy Grover   target: Follow up...
146
147
  	pr_debug( "IBLOCK: Claiming struct block_device: %s
  ",
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
148
149
150
151
  			ib_dev->ibd_udev_path);
  
  	bd = blkdev_get_by_path(ib_dev->ibd_udev_path,
  				FMODE_WRITE|FMODE_READ|FMODE_EXCL, ib_dev);
613640e4e   Nicholas Bellinger   [SCSI] target: Co...
152
153
  	if (IS_ERR(bd)) {
  		ret = PTR_ERR(bd);
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
154
  		goto failed;
613640e4e   Nicholas Bellinger   [SCSI] target: Co...
155
  	}
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
156
157
158
159
160
161
162
163
164
  	/*
  	 * 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.
  	 */
  	q = bdev_get_queue(bd);
  	limits = &dev_limits.limits;
  	limits->logical_block_size = bdev_logical_block_size(bd);
  	limits->max_hw_sectors = queue_max_hw_sectors(q);
  	limits->max_sectors = queue_max_sectors(q);
8f3d14e2b   Nicholas Bellinger   target/iblock: Us...
165
166
  	dev_limits.hw_queue_depth = q->nr_requests;
  	dev_limits.queue_depth = q->nr_requests;
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
167

c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
168
169
170
  	ib_dev->ibd_bd = bd;
  
  	dev = transport_add_device_to_core_hba(hba,
5951146de   Andy Grover   target: More core...
171
  			&iblock_template, se_dev, dev_flags, ib_dev,
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
172
  			&dev_limits, "IBLOCK", IBLOCK_VERSION);
6708bb27b   Andy Grover   target: Follow up...
173
  	if (!dev)
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
174
  		goto failed;
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
175
176
177
178
179
  	/*
  	 * Check if the underlying struct block_device request_queue supports
  	 * the QUEUE_FLAG_DISCARD bit for UNMAP/WRITE_SAME in SCSI + TRIM
  	 * in ATA and we need to set TPE=1
  	 */
613640e4e   Nicholas Bellinger   [SCSI] target: Co...
180
  	if (blk_queue_discard(q)) {
e3d6f909e   Andy Grover   target: Core clea...
181
  		dev->se_sub_dev->se_dev_attrib.max_unmap_lba_count =
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
182
183
184
185
  				q->limits.max_discard_sectors;
  		/*
  		 * Currently hardcoded to 1 in Linux/SCSI code..
  		 */
e3d6f909e   Andy Grover   target: Core clea...
186
187
  		dev->se_sub_dev->se_dev_attrib.max_unmap_block_desc_count = 1;
  		dev->se_sub_dev->se_dev_attrib.unmap_granularity =
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
188
  				q->limits.discard_granularity;
e3d6f909e   Andy Grover   target: Core clea...
189
  		dev->se_sub_dev->se_dev_attrib.unmap_granularity_alignment =
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
190
  				q->limits.discard_alignment;
6708bb27b   Andy Grover   target: Follow up...
191
  		pr_debug("IBLOCK: BLOCK Discard support available,"
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
192
193
194
  				" disabled by default
  ");
  	}
e22a7f075   Roland Dreier   target: Implement...
195
196
  	if (blk_queue_nonrot(q))
  		dev->se_sub_dev->se_dev_attrib.is_nonrot = 1;
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
197
198
199
200
201
202
203
204
  	return dev;
  
  failed:
  	if (ib_dev->ibd_bio_set) {
  		bioset_free(ib_dev->ibd_bio_set);
  		ib_dev->ibd_bio_set = NULL;
  	}
  	ib_dev->ibd_bd = NULL;
613640e4e   Nicholas Bellinger   [SCSI] target: Co...
205
  	return ERR_PTR(ret);
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
206
207
208
209
210
  }
  
  static void iblock_free_device(void *p)
  {
  	struct iblock_dev *ib_dev = p;
bc6655247   Nicholas Bellinger   [SCSI] target/ibl...
211
212
213
214
  	if (ib_dev->ibd_bd != NULL)
  		blkdev_put(ib_dev->ibd_bd, FMODE_WRITE|FMODE_READ|FMODE_EXCL);
  	if (ib_dev->ibd_bio_set != NULL)
  		bioset_free(ib_dev->ibd_bio_set);
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
215
216
217
218
219
220
221
222
223
  	kfree(ib_dev);
  }
  
  static inline struct iblock_req *IBLOCK_REQ(struct se_task *task)
  {
  	return container_of(task, struct iblock_req, ib_task);
  }
  
  static struct se_task *
6708bb27b   Andy Grover   target: Follow up...
224
  iblock_alloc_task(unsigned char *cdb)
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
225
226
227
228
  {
  	struct iblock_req *ib_req;
  
  	ib_req = kzalloc(sizeof(struct iblock_req), GFP_KERNEL);
6708bb27b   Andy Grover   target: Follow up...
229
230
231
  	if (!ib_req) {
  		pr_err("Unable to allocate memory for struct iblock_req
  ");
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
232
233
  		return NULL;
  	}
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
234
235
236
237
238
239
240
241
242
243
244
245
  	atomic_set(&ib_req->ib_bio_cnt, 0);
  	return &ib_req->ib_task;
  }
  
  static unsigned long long iblock_emulate_read_cap_with_block_size(
  	struct se_device *dev,
  	struct block_device *bd,
  	struct request_queue *q)
  {
  	unsigned long long blocks_long = (div_u64(i_size_read(bd->bd_inode),
  					bdev_logical_block_size(bd)) - 1);
  	u32 block_size = bdev_logical_block_size(bd);
e3d6f909e   Andy Grover   target: Core clea...
246
  	if (block_size == dev->se_sub_dev->se_dev_attrib.block_size)
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
247
248
249
250
  		return blocks_long;
  
  	switch (block_size) {
  	case 4096:
e3d6f909e   Andy Grover   target: Core clea...
251
  		switch (dev->se_sub_dev->se_dev_attrib.block_size) {
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
252
253
254
255
256
257
258
259
260
261
262
263
264
  		case 2048:
  			blocks_long <<= 1;
  			break;
  		case 1024:
  			blocks_long <<= 2;
  			break;
  		case 512:
  			blocks_long <<= 3;
  		default:
  			break;
  		}
  		break;
  	case 2048:
e3d6f909e   Andy Grover   target: Core clea...
265
  		switch (dev->se_sub_dev->se_dev_attrib.block_size) {
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
266
267
268
269
270
271
272
273
274
275
276
277
278
279
  		case 4096:
  			blocks_long >>= 1;
  			break;
  		case 1024:
  			blocks_long <<= 1;
  			break;
  		case 512:
  			blocks_long <<= 2;
  			break;
  		default:
  			break;
  		}
  		break;
  	case 1024:
e3d6f909e   Andy Grover   target: Core clea...
280
  		switch (dev->se_sub_dev->se_dev_attrib.block_size) {
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
281
282
283
284
285
286
287
288
289
290
291
292
293
294
  		case 4096:
  			blocks_long >>= 2;
  			break;
  		case 2048:
  			blocks_long >>= 1;
  			break;
  		case 512:
  			blocks_long <<= 1;
  			break;
  		default:
  			break;
  		}
  		break;
  	case 512:
e3d6f909e   Andy Grover   target: Core clea...
295
  		switch (dev->se_sub_dev->se_dev_attrib.block_size) {
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
  		case 4096:
  			blocks_long >>= 3;
  			break;
  		case 2048:
  			blocks_long >>= 2;
  			break;
  		case 1024:
  			blocks_long >>= 1;
  			break;
  		default:
  			break;
  		}
  		break;
  	default:
  		break;
  	}
  
  	return blocks_long;
  }
df5fa691c   Christoph Hellwig   target: make iblo...
315
316
317
318
319
320
321
322
323
324
325
326
  static void iblock_end_io_flush(struct bio *bio, int err)
  {
  	struct se_cmd *cmd = bio->bi_private;
  
  	if (err)
  		pr_err("IBLOCK: cache flush failed: %d
  ", err);
  
  	if (cmd)
  		transport_complete_sync_cache(cmd, err == 0);
  	bio_put(bio);
  }
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
327
  /*
df5fa691c   Christoph Hellwig   target: make iblo...
328
329
   * Implement SYCHRONIZE CACHE.  Note that we can't handle lba ranges and must
   * always flush the whole cache.
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
330
331
332
   */
  static void iblock_emulate_sync_cache(struct se_task *task)
  {
e3d6f909e   Andy Grover   target: Core clea...
333
  	struct se_cmd *cmd = task->task_se_cmd;
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
334
  	struct iblock_dev *ib_dev = cmd->se_dev->dev_ptr;
a1d8b49ab   Andy Grover   target: Updates f...
335
  	int immed = (cmd->t_task_cdb[1] & 0x2);
df5fa691c   Christoph Hellwig   target: make iblo...
336
  	struct bio *bio;
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
337
338
339
  
  	/*
  	 * If the Immediate bit is set, queue up the GOOD response
df5fa691c   Christoph Hellwig   target: make iblo...
340
  	 * for this SYNCHRONIZE_CACHE op.
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
341
342
343
  	 */
  	if (immed)
  		transport_complete_sync_cache(cmd, 1);
df5fa691c   Christoph Hellwig   target: make iblo...
344
345
346
  	bio = bio_alloc(GFP_KERNEL, 0);
  	bio->bi_end_io = iblock_end_io_flush;
  	bio->bi_bdev = ib_dev->ibd_bd;
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
347
  	if (!immed)
df5fa691c   Christoph Hellwig   target: make iblo...
348
349
  		bio->bi_private = cmd;
  	submit_bio(WRITE_FLUSH, bio);
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
350
  }
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
351
352
353
354
355
356
357
358
359
360
361
  static int iblock_do_discard(struct se_device *dev, sector_t lba, u32 range)
  {
  	struct iblock_dev *ibd = dev->dev_ptr;
  	struct block_device *bd = ibd->ibd_bd;
  	int barrier = 0;
  
  	return blkdev_issue_discard(bd, lba, range, GFP_KERNEL, barrier);
  }
  
  static void iblock_free_task(struct se_task *task)
  {
dbbf3e94c   Christoph Hellwig   target: cleanup i...
362
  	kfree(IBLOCK_REQ(task));
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
  }
  
  enum {
  	Opt_udev_path, Opt_force, Opt_err
  };
  
  static match_table_t tokens = {
  	{Opt_udev_path, "udev_path=%s"},
  	{Opt_force, "force=%d"},
  	{Opt_err, NULL}
  };
  
  static ssize_t iblock_set_configfs_dev_params(struct se_hba *hba,
  					       struct se_subsystem_dev *se_dev,
  					       const char *page, ssize_t count)
  {
  	struct iblock_dev *ib_dev = se_dev->se_dev_su_ptr;
6d1802539   Jesper Juhl   [SCSI] target: Fi...
380
  	char *orig, *ptr, *arg_p, *opts;
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
381
  	substring_t args[MAX_OPT_ARGS];
21bca31c9   Roland Dreier   target/iblock: Re...
382
  	int ret = 0, token;
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
  
  	opts = kstrdup(page, GFP_KERNEL);
  	if (!opts)
  		return -ENOMEM;
  
  	orig = opts;
  
  	while ((ptr = strsep(&opts, ",")) != NULL) {
  		if (!*ptr)
  			continue;
  
  		token = match_token(ptr, tokens, args);
  		switch (token) {
  		case Opt_udev_path:
  			if (ib_dev->ibd_bd) {
6708bb27b   Andy Grover   target: Follow up...
398
  				pr_err("Unable to set udev_path= while"
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
399
400
401
402
403
  					" ib_dev->ibd_bd exists
  ");
  				ret = -EEXIST;
  				goto out;
  			}
6d1802539   Jesper Juhl   [SCSI] target: Fi...
404
405
406
407
408
409
410
411
  			arg_p = match_strdup(&args[0]);
  			if (!arg_p) {
  				ret = -ENOMEM;
  				break;
  			}
  			snprintf(ib_dev->ibd_udev_path, SE_UDEV_PATH_LEN,
  					"%s", arg_p);
  			kfree(arg_p);
6708bb27b   Andy Grover   target: Follow up...
412
413
  			pr_debug("IBLOCK: Referencing UDEV path: %s
  ",
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
414
415
416
417
  					ib_dev->ibd_udev_path);
  			ib_dev->ibd_flags |= IBDF_HAS_UDEV_PATH;
  			break;
  		case Opt_force:
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
  			break;
  		default:
  			break;
  		}
  	}
  
  out:
  	kfree(orig);
  	return (!ret) ? count : ret;
  }
  
  static ssize_t iblock_check_configfs_dev_params(
  	struct se_hba *hba,
  	struct se_subsystem_dev *se_dev)
  {
  	struct iblock_dev *ibd = se_dev->se_dev_su_ptr;
  
  	if (!(ibd->ibd_flags & IBDF_HAS_UDEV_PATH)) {
6708bb27b   Andy Grover   target: Follow up...
436
437
  		pr_err("Missing udev_path= parameters for IBLOCK
  ");
e3d6f909e   Andy Grover   target: Core clea...
438
  		return -EINVAL;
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
  	}
  
  	return 0;
  }
  
  static ssize_t iblock_show_configfs_dev_params(
  	struct se_hba *hba,
  	struct se_subsystem_dev *se_dev,
  	char *b)
  {
  	struct iblock_dev *ibd = se_dev->se_dev_su_ptr;
  	struct block_device *bd = ibd->ibd_bd;
  	char buf[BDEVNAME_SIZE];
  	ssize_t bl = 0;
  
  	if (bd)
  		bl += sprintf(b + bl, "iBlock device: %s",
  				bdevname(bd, buf));
  	if (ibd->ibd_flags & IBDF_HAS_UDEV_PATH) {
  		bl += sprintf(b + bl, "  UDEV PATH: %s
  ",
  				ibd->ibd_udev_path);
  	} else
  		bl += sprintf(b + bl, "
  ");
  
  	bl += sprintf(b + bl, "        ");
  	if (bd) {
  		bl += sprintf(b + bl, "Major: %d Minor: %d  %s
  ",
21bca31c9   Roland Dreier   target/iblock: Re...
469
  			MAJOR(bd->bd_dev), MINOR(bd->bd_dev), (!bd->bd_contains) ?
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
470
471
472
  			"" : (bd->bd_holder == (struct iblock_dev *)ibd) ?
  			"CLAIMED: IBLOCK" : "CLAIMED: OS");
  	} else {
21bca31c9   Roland Dreier   target/iblock: Re...
473
474
  		bl += sprintf(b + bl, "Major: 0 Minor: 0
  ");
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
475
476
477
478
479
480
481
482
  	}
  
  	return bl;
  }
  
  static void iblock_bio_destructor(struct bio *bio)
  {
  	struct se_task *task = bio->bi_private;
42bf829ee   Christoph Hellwig   target: Cleanup u...
483
  	struct iblock_dev *ib_dev = task->task_se_cmd->se_dev->dev_ptr;
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
484
485
486
  
  	bio_free(bio, ib_dev->ibd_bio_set);
  }
dbbf3e94c   Christoph Hellwig   target: cleanup i...
487
488
  static struct bio *
  iblock_get_bio(struct se_task *task, sector_t lba, u32 sg_num)
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
489
  {
42bf829ee   Christoph Hellwig   target: Cleanup u...
490
  	struct iblock_dev *ib_dev = task->task_se_cmd->se_dev->dev_ptr;
dbbf3e94c   Christoph Hellwig   target: cleanup i...
491
  	struct iblock_req *ib_req = IBLOCK_REQ(task);
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
492
493
494
  	struct bio *bio;
  
  	bio = bio_alloc_bioset(GFP_NOIO, sg_num, ib_dev->ibd_bio_set);
6708bb27b   Andy Grover   target: Follow up...
495
496
497
  	if (!bio) {
  		pr_err("Unable to allocate memory for bio
  ");
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
498
499
  		return NULL;
  	}
6708bb27b   Andy Grover   target: Follow up...
500
501
502
503
504
  	pr_debug("Allocated bio: %p task_sg_nents: %u using ibd_bio_set:"
  		" %p
  ", bio, task->task_sg_nents, ib_dev->ibd_bio_set);
  	pr_debug("Allocated bio: %p task_size: %u
  ", bio, task->task_size);
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
505
506
  
  	bio->bi_bdev = ib_dev->ibd_bd;
5951146de   Andy Grover   target: More core...
507
  	bio->bi_private = task;
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
508
509
510
511
  	bio->bi_destructor = iblock_bio_destructor;
  	bio->bi_end_io = &iblock_bio_done;
  	bio->bi_sector = lba;
  	atomic_inc(&ib_req->ib_bio_cnt);
6708bb27b   Andy Grover   target: Follow up...
512
513
514
515
  	pr_debug("Set bio->bi_sector: %llu
  ", (unsigned long long)bio->bi_sector);
  	pr_debug("Set ib_req->ib_bio_cnt: %d
  ",
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
516
517
518
  			atomic_read(&ib_req->ib_bio_cnt));
  	return bio;
  }
dbbf3e94c   Christoph Hellwig   target: cleanup i...
519
  static int iblock_do_task(struct se_task *task)
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
520
521
  {
  	struct se_cmd *cmd = task->task_se_cmd;
5951146de   Andy Grover   target: More core...
522
  	struct se_device *dev = cmd->se_dev;
dbbf3e94c   Christoph Hellwig   target: cleanup i...
523
524
  	struct bio *bio;
  	struct bio_list list;
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
525
  	struct scatterlist *sg;
6708bb27b   Andy Grover   target: Follow up...
526
  	u32 i, sg_num = task->task_sg_nents;
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
527
  	sector_t block_lba;
dbbf3e94c   Christoph Hellwig   target: cleanup i...
528
529
530
531
532
533
534
535
536
537
  	struct blk_plug plug;
  	int rw;
  
  	if (task->task_data_direction == DMA_TO_DEVICE) {
  		/*
  		 * Force data to disk if we pretend to not have a volatile
  		 * write cache, or the initiator set the Force Unit Access bit.
  		 */
  		if (dev->se_sub_dev->se_dev_attrib.emulate_write_cache == 0 ||
  		    (dev->se_sub_dev->se_dev_attrib.emulate_fua_write > 0 &&
2d3a4b51d   Christoph Hellwig   target: remove th...
538
  		     (cmd->se_cmd_flags & SCF_FUA)))
dbbf3e94c   Christoph Hellwig   target: cleanup i...
539
540
541
542
543
544
  			rw = WRITE_FUA;
  		else
  			rw = WRITE;
  	} else {
  		rw = READ;
  	}
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
545
546
547
548
  	/*
  	 * Do starting conversion up from non 512-byte blocksize with
  	 * struct se_task SCSI blocksize into Linux/Block 512 units for BIO.
  	 */
e3d6f909e   Andy Grover   target: Core clea...
549
  	if (dev->se_sub_dev->se_dev_attrib.block_size == 4096)
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
550
  		block_lba = (task->task_lba << 3);
e3d6f909e   Andy Grover   target: Core clea...
551
  	else if (dev->se_sub_dev->se_dev_attrib.block_size == 2048)
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
552
  		block_lba = (task->task_lba << 2);
e3d6f909e   Andy Grover   target: Core clea...
553
  	else if (dev->se_sub_dev->se_dev_attrib.block_size == 1024)
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
554
  		block_lba = (task->task_lba << 1);
e3d6f909e   Andy Grover   target: Core clea...
555
  	else if (dev->se_sub_dev->se_dev_attrib.block_size == 512)
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
556
557
  		block_lba = task->task_lba;
  	else {
6708bb27b   Andy Grover   target: Follow up...
558
  		pr_err("Unsupported SCSI -> BLOCK LBA conversion:"
e3d6f909e   Andy Grover   target: Core clea...
559
560
  				" %u
  ", dev->se_sub_dev->se_dev_attrib.block_size);
03e98c9eb   Nicholas Bellinger   target: Address l...
561
562
  		cmd->scsi_sense_reason = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
  		return -ENOSYS;
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
563
  	}
dbbf3e94c   Christoph Hellwig   target: cleanup i...
564
  	bio = iblock_get_bio(task, block_lba, sg_num);
03e98c9eb   Nicholas Bellinger   target: Address l...
565
566
567
568
  	if (!bio) {
  		cmd->scsi_sense_reason = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
  		return -ENOMEM;
  	}
dbbf3e94c   Christoph Hellwig   target: cleanup i...
569
570
571
  
  	bio_list_init(&list);
  	bio_list_add(&list, bio);
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
572

6708bb27b   Andy Grover   target: Follow up...
573
  	for_each_sg(task->task_sg, sg, task->task_sg_nents, i) {
dbbf3e94c   Christoph Hellwig   target: cleanup i...
574
575
576
577
578
579
580
581
  		/*
  		 * XXX: if the length the device accepts is shorter than the
  		 *	length of the S/G list entry this will cause and
  		 *	endless loop.  Better hope no driver uses huge pages.
  		 */
  		while (bio_add_page(bio, sg_page(sg), sg->length, sg->offset)
  				!= sg->length) {
  			bio = iblock_get_bio(task, block_lba, sg_num);
6708bb27b   Andy Grover   target: Follow up...
582
  			if (!bio)
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
583
  				goto fail;
dbbf3e94c   Christoph Hellwig   target: cleanup i...
584
  			bio_list_add(&list, bio);
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
585
  		}
dbbf3e94c   Christoph Hellwig   target: cleanup i...
586

c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
587
588
589
  		/* Always in 512 byte units for Linux/Block */
  		block_lba += sg->length >> IBLOCK_LBA_SHIFT;
  		sg_num--;
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
590
  	}
dbbf3e94c   Christoph Hellwig   target: cleanup i...
591
592
593
594
  	blk_start_plug(&plug);
  	while ((bio = bio_list_pop(&list)))
  		submit_bio(rw, bio);
  	blk_finish_plug(&plug);
03e98c9eb   Nicholas Bellinger   target: Address l...
595
  	return 0;
dbbf3e94c   Christoph Hellwig   target: cleanup i...
596

c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
597
  fail:
dbbf3e94c   Christoph Hellwig   target: cleanup i...
598
  	while ((bio = bio_list_pop(&list)))
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
599
  		bio_put(bio);
03e98c9eb   Nicholas Bellinger   target: Address l...
600
601
  	cmd->scsi_sense_reason = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
  	return -ENOMEM;
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
602
  }
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
  static u32 iblock_get_device_rev(struct se_device *dev)
  {
  	return SCSI_SPC_2; /* Returns SPC-3 in Initiator Data */
  }
  
  static u32 iblock_get_device_type(struct se_device *dev)
  {
  	return TYPE_DISK;
  }
  
  static sector_t iblock_get_blocks(struct se_device *dev)
  {
  	struct iblock_dev *ibd = dev->dev_ptr;
  	struct block_device *bd = ibd->ibd_bd;
  	struct request_queue *q = bdev_get_queue(bd);
  
  	return iblock_emulate_read_cap_with_block_size(dev, bd, q);
  }
  
  static void iblock_bio_done(struct bio *bio, int err)
  {
  	struct se_task *task = bio->bi_private;
  	struct iblock_req *ibr = IBLOCK_REQ(task);
dbbf3e94c   Christoph Hellwig   target: cleanup i...
626

c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
627
628
629
  	/*
  	 * Set -EIO if !BIO_UPTODATE and the passed is still err=0
  	 */
6708bb27b   Andy Grover   target: Follow up...
630
  	if (!test_bit(BIO_UPTODATE, &bio->bi_flags) && !err)
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
631
632
633
  		err = -EIO;
  
  	if (err != 0) {
6708bb27b   Andy Grover   target: Follow up...
634
  		pr_err("test_bit(BIO_UPTODATE) failed for bio: %p,"
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
635
636
637
638
639
640
641
  			" err: %d
  ", bio, err);
  		/*
  		 * Bump the ib_bio_err_cnt and release bio.
  		 */
  		atomic_inc(&ibr->ib_bio_err_cnt);
  		smp_mb__after_atomic_inc();
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
642
  	}
dbbf3e94c   Christoph Hellwig   target: cleanup i...
643

c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
644
  	bio_put(bio);
dbbf3e94c   Christoph Hellwig   target: cleanup i...
645

6708bb27b   Andy Grover   target: Follow up...
646
  	if (!atomic_dec_and_test(&ibr->ib_bio_cnt))
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
647
  		return;
dbbf3e94c   Christoph Hellwig   target: cleanup i...
648
649
650
651
652
653
654
  
  	pr_debug("done[%p] bio: %p task_lba: %llu bio_lba: %llu err=%d
  ",
  		 task, bio, task->task_lba,
  		 (unsigned long long)bio->bi_sector, err);
  
  	transport_complete_task(task, !atomic_read(&ibr->ib_bio_err_cnt));
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
655
656
657
658
659
660
  }
  
  static struct se_subsystem_api iblock_template = {
  	.name			= "iblock",
  	.owner			= THIS_MODULE,
  	.transport_type		= TRANSPORT_PLUGIN_VHBA_PDEV,
f55918fa3   Christoph Hellwig   target: clean up ...
661
662
  	.write_cache_emulated	= 1,
  	.fua_write_emulated	= 1,
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
663
664
665
666
667
  	.attach_hba		= iblock_attach_hba,
  	.detach_hba		= iblock_detach_hba,
  	.allocate_virtdevice	= iblock_allocate_virtdevice,
  	.create_virtdevice	= iblock_create_virtdevice,
  	.free_device		= iblock_free_device,
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
668
669
670
671
672
673
674
675
  	.alloc_task		= iblock_alloc_task,
  	.do_task		= iblock_do_task,
  	.do_discard		= iblock_do_discard,
  	.do_sync_cache		= iblock_emulate_sync_cache,
  	.free_task		= iblock_free_task,
  	.check_configfs_dev_params = iblock_check_configfs_dev_params,
  	.set_configfs_dev_params = iblock_set_configfs_dev_params,
  	.show_configfs_dev_params = iblock_show_configfs_dev_params,
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
  	.get_device_rev		= iblock_get_device_rev,
  	.get_device_type	= iblock_get_device_type,
  	.get_blocks		= iblock_get_blocks,
  };
  
  static int __init iblock_module_init(void)
  {
  	return transport_subsystem_register(&iblock_template);
  }
  
  static void iblock_module_exit(void)
  {
  	transport_subsystem_release(&iblock_template);
  }
  
  MODULE_DESCRIPTION("TCM IBLOCK subsystem plugin");
  MODULE_AUTHOR("nab@Linux-iSCSI.org");
  MODULE_LICENSE("GPL");
  
  module_init(iblock_module_init);
  module_exit(iblock_module_exit);