xref: /openbmc/linux/drivers/mtd/ubi/block.c (revision af958a38)
1 /*
2  * Copyright (c) 2014 Ezequiel Garcia
3  * Copyright (c) 2011 Free Electrons
4  *
5  * Driver parameter handling strongly based on drivers/mtd/ubi/build.c
6  *   Copyright (c) International Business Machines Corp., 2006
7  *   Copyright (c) Nokia Corporation, 2007
8  *   Authors: Artem Bityutskiy, Frank Haverkamp
9  *
10  * This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation, version 2.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
17  * the GNU General Public License for more details.
18  */
19 
20 /*
21  * Read-only block devices on top of UBI volumes
22  *
23  * A simple implementation to allow a block device to be layered on top of a
24  * UBI volume. The implementation is provided by creating a static 1-to-1
25  * mapping between the block device and the UBI volume.
26  *
27  * The addressed byte is obtained from the addressed block sector, which is
28  * mapped linearly into the corresponding LEB:
29  *
30  *   LEB number = addressed byte / LEB size
31  *
32  * This feature is compiled in the UBI core, and adds a 'block' parameter
33  * to allow early creation of block devices on top of UBI volumes. Runtime
34  * block creation/removal for UBI volumes is provided through two UBI ioctls:
35  * UBI_IOCVOLCRBLK and UBI_IOCVOLRMBLK.
36  */
37 
38 #include <linux/module.h>
39 #include <linux/init.h>
40 #include <linux/err.h>
41 #include <linux/kernel.h>
42 #include <linux/list.h>
43 #include <linux/mutex.h>
44 #include <linux/slab.h>
45 #include <linux/vmalloc.h>
46 #include <linux/mtd/ubi.h>
47 #include <linux/workqueue.h>
48 #include <linux/blkdev.h>
49 #include <linux/hdreg.h>
50 #include <asm/div64.h>
51 
52 #include "ubi-media.h"
53 #include "ubi.h"
54 
55 /* Maximum number of supported devices */
56 #define UBIBLOCK_MAX_DEVICES 32
57 
58 /* Maximum length of the 'block=' parameter */
59 #define UBIBLOCK_PARAM_LEN 63
60 
61 /* Maximum number of comma-separated items in the 'block=' parameter */
62 #define UBIBLOCK_PARAM_COUNT 2
63 
64 struct ubiblock_param {
65 	int ubi_num;
66 	int vol_id;
67 	char name[UBIBLOCK_PARAM_LEN+1];
68 };
69 
70 /* Numbers of elements set in the @ubiblock_param array */
71 static int ubiblock_devs __initdata;
72 
73 /* MTD devices specification parameters */
74 static struct ubiblock_param ubiblock_param[UBIBLOCK_MAX_DEVICES] __initdata;
75 
76 struct ubiblock {
77 	struct ubi_volume_desc *desc;
78 	int ubi_num;
79 	int vol_id;
80 	int refcnt;
81 	int leb_size;
82 
83 	struct gendisk *gd;
84 	struct request_queue *rq;
85 
86 	struct workqueue_struct *wq;
87 	struct work_struct work;
88 
89 	struct mutex dev_mutex;
90 	spinlock_t queue_lock;
91 	struct list_head list;
92 };
93 
94 /* Linked list of all ubiblock instances */
95 static LIST_HEAD(ubiblock_devices);
96 static DEFINE_MUTEX(devices_mutex);
97 static int ubiblock_major;
98 
99 static int __init ubiblock_set_param(const char *val,
100 				     const struct kernel_param *kp)
101 {
102 	int i, ret;
103 	size_t len;
104 	struct ubiblock_param *param;
105 	char buf[UBIBLOCK_PARAM_LEN];
106 	char *pbuf = &buf[0];
107 	char *tokens[UBIBLOCK_PARAM_COUNT];
108 
109 	if (!val)
110 		return -EINVAL;
111 
112 	len = strnlen(val, UBIBLOCK_PARAM_LEN);
113 	if (len == 0) {
114 		ubi_warn("block: empty 'block=' parameter - ignored\n");
115 		return 0;
116 	}
117 
118 	if (len == UBIBLOCK_PARAM_LEN) {
119 		ubi_err("block: parameter \"%s\" is too long, max. is %d\n",
120 			val, UBIBLOCK_PARAM_LEN);
121 		return -EINVAL;
122 	}
123 
124 	strcpy(buf, val);
125 
126 	/* Get rid of the final newline */
127 	if (buf[len - 1] == '\n')
128 		buf[len - 1] = '\0';
129 
130 	for (i = 0; i < UBIBLOCK_PARAM_COUNT; i++)
131 		tokens[i] = strsep(&pbuf, ",");
132 
133 	param = &ubiblock_param[ubiblock_devs];
134 	if (tokens[1]) {
135 		/* Two parameters: can be 'ubi, vol_id' or 'ubi, vol_name' */
136 		ret = kstrtoint(tokens[0], 10, &param->ubi_num);
137 		if (ret < 0)
138 			return -EINVAL;
139 
140 		/* Second param can be a number or a name */
141 		ret = kstrtoint(tokens[1], 10, &param->vol_id);
142 		if (ret < 0) {
143 			param->vol_id = -1;
144 			strcpy(param->name, tokens[1]);
145 		}
146 
147 	} else {
148 		/* One parameter: must be device path */
149 		strcpy(param->name, tokens[0]);
150 		param->ubi_num = -1;
151 		param->vol_id = -1;
152 	}
153 
154 	ubiblock_devs++;
155 
156 	return 0;
157 }
158 
159 static struct kernel_param_ops ubiblock_param_ops = {
160 	.set    = ubiblock_set_param,
161 };
162 module_param_cb(block, &ubiblock_param_ops, NULL, 0);
163 MODULE_PARM_DESC(block, "Attach block devices to UBI volumes. Parameter format: block=<path|dev,num|dev,name>.\n"
164 			"Multiple \"block\" parameters may be specified.\n"
165 			"UBI volumes may be specified by their number, name, or path to the device node.\n"
166 			"Examples\n"
167 			"Using the UBI volume path:\n"
168 			"ubi.block=/dev/ubi0_0\n"
169 			"Using the UBI device, and the volume name:\n"
170 			"ubi.block=0,rootfs\n"
171 			"Using both UBI device number and UBI volume number:\n"
172 			"ubi.block=0,0\n");
173 
174 static struct ubiblock *find_dev_nolock(int ubi_num, int vol_id)
175 {
176 	struct ubiblock *dev;
177 
178 	list_for_each_entry(dev, &ubiblock_devices, list)
179 		if (dev->ubi_num == ubi_num && dev->vol_id == vol_id)
180 			return dev;
181 	return NULL;
182 }
183 
184 static int ubiblock_read_to_buf(struct ubiblock *dev, char *buffer,
185 				int leb, int offset, int len)
186 {
187 	int ret;
188 
189 	ret = ubi_read(dev->desc, leb, buffer, offset, len);
190 	if (ret) {
191 		ubi_err("%s ubi_read error %d",
192 			dev->gd->disk_name, ret);
193 		return ret;
194 	}
195 	return 0;
196 }
197 
198 static int ubiblock_read(struct ubiblock *dev, char *buffer,
199 			 sector_t sec, int len)
200 {
201 	int ret, leb, offset;
202 	int bytes_left = len;
203 	int to_read = len;
204 	u64 pos = sec << 9;
205 
206 	/* Get LEB:offset address to read from */
207 	offset = do_div(pos, dev->leb_size);
208 	leb = pos;
209 
210 	while (bytes_left) {
211 		/*
212 		 * We can only read one LEB at a time. Therefore if the read
213 		 * length is larger than one LEB size, we split the operation.
214 		 */
215 		if (offset + to_read > dev->leb_size)
216 			to_read = dev->leb_size - offset;
217 
218 		ret = ubiblock_read_to_buf(dev, buffer, leb, offset, to_read);
219 		if (ret)
220 			return ret;
221 
222 		buffer += to_read;
223 		bytes_left -= to_read;
224 		to_read = bytes_left;
225 		leb += 1;
226 		offset = 0;
227 	}
228 	return 0;
229 }
230 
231 static int do_ubiblock_request(struct ubiblock *dev, struct request *req)
232 {
233 	int len, ret;
234 	sector_t sec;
235 
236 	if (req->cmd_type != REQ_TYPE_FS)
237 		return -EIO;
238 
239 	if (blk_rq_pos(req) + blk_rq_cur_sectors(req) >
240 	    get_capacity(req->rq_disk))
241 		return -EIO;
242 
243 	if (rq_data_dir(req) != READ)
244 		return -ENOSYS; /* Write not implemented */
245 
246 	sec = blk_rq_pos(req);
247 	len = blk_rq_cur_bytes(req);
248 
249 	/*
250 	 * Let's prevent the device from being removed while we're doing I/O
251 	 * work. Notice that this means we serialize all the I/O operations,
252 	 * but it's probably of no impact given the NAND core serializes
253 	 * flash access anyway.
254 	 */
255 	mutex_lock(&dev->dev_mutex);
256 	ret = ubiblock_read(dev, bio_data(req->bio), sec, len);
257 	mutex_unlock(&dev->dev_mutex);
258 
259 	return ret;
260 }
261 
262 static void ubiblock_do_work(struct work_struct *work)
263 {
264 	struct ubiblock *dev =
265 		container_of(work, struct ubiblock, work);
266 	struct request_queue *rq = dev->rq;
267 	struct request *req;
268 	int res;
269 
270 	spin_lock_irq(rq->queue_lock);
271 
272 	req = blk_fetch_request(rq);
273 	while (req) {
274 
275 		spin_unlock_irq(rq->queue_lock);
276 		res = do_ubiblock_request(dev, req);
277 		spin_lock_irq(rq->queue_lock);
278 
279 		/*
280 		 * If we're done with this request,
281 		 * we need to fetch a new one
282 		 */
283 		if (!__blk_end_request_cur(req, res))
284 			req = blk_fetch_request(rq);
285 	}
286 
287 	spin_unlock_irq(rq->queue_lock);
288 }
289 
290 static void ubiblock_request(struct request_queue *rq)
291 {
292 	struct ubiblock *dev;
293 	struct request *req;
294 
295 	dev = rq->queuedata;
296 
297 	if (!dev)
298 		while ((req = blk_fetch_request(rq)) != NULL)
299 			__blk_end_request_all(req, -ENODEV);
300 	else
301 		queue_work(dev->wq, &dev->work);
302 }
303 
304 static int ubiblock_open(struct block_device *bdev, fmode_t mode)
305 {
306 	struct ubiblock *dev = bdev->bd_disk->private_data;
307 	int ret;
308 
309 	mutex_lock(&dev->dev_mutex);
310 	if (dev->refcnt > 0) {
311 		/*
312 		 * The volume is already open, just increase the reference
313 		 * counter.
314 		 */
315 		goto out_done;
316 	}
317 
318 	/*
319 	 * We want users to be aware they should only mount us as read-only.
320 	 * It's just a paranoid check, as write requests will get rejected
321 	 * in any case.
322 	 */
323 	if (mode & FMODE_WRITE) {
324 		ret = -EPERM;
325 		goto out_unlock;
326 	}
327 
328 	dev->desc = ubi_open_volume(dev->ubi_num, dev->vol_id, UBI_READONLY);
329 	if (IS_ERR(dev->desc)) {
330 		ubi_err("%s failed to open ubi volume %d_%d",
331 			dev->gd->disk_name, dev->ubi_num, dev->vol_id);
332 		ret = PTR_ERR(dev->desc);
333 		dev->desc = NULL;
334 		goto out_unlock;
335 	}
336 
337 out_done:
338 	dev->refcnt++;
339 	mutex_unlock(&dev->dev_mutex);
340 	return 0;
341 
342 out_unlock:
343 	mutex_unlock(&dev->dev_mutex);
344 	return ret;
345 }
346 
347 static void ubiblock_release(struct gendisk *gd, fmode_t mode)
348 {
349 	struct ubiblock *dev = gd->private_data;
350 
351 	mutex_lock(&dev->dev_mutex);
352 	dev->refcnt--;
353 	if (dev->refcnt == 0) {
354 		ubi_close_volume(dev->desc);
355 		dev->desc = NULL;
356 	}
357 	mutex_unlock(&dev->dev_mutex);
358 }
359 
360 static int ubiblock_getgeo(struct block_device *bdev, struct hd_geometry *geo)
361 {
362 	/* Some tools might require this information */
363 	geo->heads = 1;
364 	geo->cylinders = 1;
365 	geo->sectors = get_capacity(bdev->bd_disk);
366 	geo->start = 0;
367 	return 0;
368 }
369 
370 static const struct block_device_operations ubiblock_ops = {
371 	.owner = THIS_MODULE,
372 	.open = ubiblock_open,
373 	.release = ubiblock_release,
374 	.getgeo	= ubiblock_getgeo,
375 };
376 
377 int ubiblock_create(struct ubi_volume_info *vi)
378 {
379 	struct ubiblock *dev;
380 	struct gendisk *gd;
381 	u64 disk_capacity = ((u64)vi->size * vi->usable_leb_size) >> 9;
382 	int ret;
383 
384 	if ((sector_t)disk_capacity != disk_capacity)
385 		return -EFBIG;
386 	/* Check that the volume isn't already handled */
387 	mutex_lock(&devices_mutex);
388 	if (find_dev_nolock(vi->ubi_num, vi->vol_id)) {
389 		mutex_unlock(&devices_mutex);
390 		return -EEXIST;
391 	}
392 	mutex_unlock(&devices_mutex);
393 
394 	dev = kzalloc(sizeof(struct ubiblock), GFP_KERNEL);
395 	if (!dev)
396 		return -ENOMEM;
397 
398 	mutex_init(&dev->dev_mutex);
399 
400 	dev->ubi_num = vi->ubi_num;
401 	dev->vol_id = vi->vol_id;
402 	dev->leb_size = vi->usable_leb_size;
403 
404 	/* Initialize the gendisk of this ubiblock device */
405 	gd = alloc_disk(1);
406 	if (!gd) {
407 		ubi_err("block: alloc_disk failed");
408 		ret = -ENODEV;
409 		goto out_free_dev;
410 	}
411 
412 	gd->fops = &ubiblock_ops;
413 	gd->major = ubiblock_major;
414 	gd->first_minor = dev->ubi_num * UBI_MAX_VOLUMES + dev->vol_id;
415 	gd->private_data = dev;
416 	sprintf(gd->disk_name, "ubiblock%d_%d", dev->ubi_num, dev->vol_id);
417 	set_capacity(gd, disk_capacity);
418 	dev->gd = gd;
419 
420 	spin_lock_init(&dev->queue_lock);
421 	dev->rq = blk_init_queue(ubiblock_request, &dev->queue_lock);
422 	if (!dev->rq) {
423 		ubi_err("block: blk_init_queue failed");
424 		ret = -ENODEV;
425 		goto out_put_disk;
426 	}
427 
428 	dev->rq->queuedata = dev;
429 	dev->gd->queue = dev->rq;
430 
431 	/*
432 	 * Create one workqueue per volume (per registered block device).
433 	 * Rembember workqueues are cheap, they're not threads.
434 	 */
435 	dev->wq = alloc_workqueue("%s", 0, 0, gd->disk_name);
436 	if (!dev->wq) {
437 		ret = -ENOMEM;
438 		goto out_free_queue;
439 	}
440 	INIT_WORK(&dev->work, ubiblock_do_work);
441 
442 	mutex_lock(&devices_mutex);
443 	list_add_tail(&dev->list, &ubiblock_devices);
444 	mutex_unlock(&devices_mutex);
445 
446 	/* Must be the last step: anyone can call file ops from now on */
447 	add_disk(dev->gd);
448 	ubi_msg("%s created from ubi%d:%d(%s)",
449 		dev->gd->disk_name, dev->ubi_num, dev->vol_id, vi->name);
450 	return 0;
451 
452 out_free_queue:
453 	blk_cleanup_queue(dev->rq);
454 out_put_disk:
455 	put_disk(dev->gd);
456 out_free_dev:
457 	kfree(dev);
458 
459 	return ret;
460 }
461 
462 static void ubiblock_cleanup(struct ubiblock *dev)
463 {
464 	del_gendisk(dev->gd);
465 	blk_cleanup_queue(dev->rq);
466 	ubi_msg("%s released", dev->gd->disk_name);
467 	put_disk(dev->gd);
468 }
469 
470 int ubiblock_remove(struct ubi_volume_info *vi)
471 {
472 	struct ubiblock *dev;
473 
474 	mutex_lock(&devices_mutex);
475 	dev = find_dev_nolock(vi->ubi_num, vi->vol_id);
476 	if (!dev) {
477 		mutex_unlock(&devices_mutex);
478 		return -ENODEV;
479 	}
480 
481 	/* Found a device, let's lock it so we can check if it's busy */
482 	mutex_lock(&dev->dev_mutex);
483 	if (dev->refcnt > 0) {
484 		mutex_unlock(&dev->dev_mutex);
485 		mutex_unlock(&devices_mutex);
486 		return -EBUSY;
487 	}
488 
489 	/* Remove from device list */
490 	list_del(&dev->list);
491 	mutex_unlock(&devices_mutex);
492 
493 	/* Flush pending work and stop this workqueue */
494 	destroy_workqueue(dev->wq);
495 
496 	ubiblock_cleanup(dev);
497 	mutex_unlock(&dev->dev_mutex);
498 	kfree(dev);
499 	return 0;
500 }
501 
502 static int ubiblock_resize(struct ubi_volume_info *vi)
503 {
504 	struct ubiblock *dev;
505 	u64 disk_capacity = ((u64)vi->size * vi->usable_leb_size) >> 9;
506 
507 	if ((sector_t)disk_capacity != disk_capacity) {
508 		ubi_warn("%s: the volume is too big, cannot resize (%d LEBs)",
509 			 dev->gd->disk_name, vi->size);
510 		return -EFBIG;
511 	}
512 	/*
513 	 * Need to lock the device list until we stop using the device,
514 	 * otherwise the device struct might get released in
515 	 * 'ubiblock_remove()'.
516 	 */
517 	mutex_lock(&devices_mutex);
518 	dev = find_dev_nolock(vi->ubi_num, vi->vol_id);
519 	if (!dev) {
520 		mutex_unlock(&devices_mutex);
521 		return -ENODEV;
522 	}
523 
524 	mutex_lock(&dev->dev_mutex);
525 	set_capacity(dev->gd, disk_capacity);
526 	ubi_msg("%s resized to %d LEBs", dev->gd->disk_name, vi->size);
527 	mutex_unlock(&dev->dev_mutex);
528 	mutex_unlock(&devices_mutex);
529 	return 0;
530 }
531 
532 static int ubiblock_notify(struct notifier_block *nb,
533 			 unsigned long notification_type, void *ns_ptr)
534 {
535 	struct ubi_notification *nt = ns_ptr;
536 
537 	switch (notification_type) {
538 	case UBI_VOLUME_ADDED:
539 		/*
540 		 * We want to enforce explicit block device creation for
541 		 * volumes, so when a volume is added we do nothing.
542 		 */
543 		break;
544 	case UBI_VOLUME_REMOVED:
545 		ubiblock_remove(&nt->vi);
546 		break;
547 	case UBI_VOLUME_RESIZED:
548 		ubiblock_resize(&nt->vi);
549 		break;
550 	default:
551 		break;
552 	}
553 	return NOTIFY_OK;
554 }
555 
556 static struct notifier_block ubiblock_notifier = {
557 	.notifier_call = ubiblock_notify,
558 };
559 
560 static struct ubi_volume_desc * __init
561 open_volume_desc(const char *name, int ubi_num, int vol_id)
562 {
563 	if (ubi_num == -1)
564 		/* No ubi num, name must be a vol device path */
565 		return ubi_open_volume_path(name, UBI_READONLY);
566 	else if (vol_id == -1)
567 		/* No vol_id, must be vol_name */
568 		return ubi_open_volume_nm(ubi_num, name, UBI_READONLY);
569 	else
570 		return ubi_open_volume(ubi_num, vol_id, UBI_READONLY);
571 }
572 
573 static int __init ubiblock_create_from_param(void)
574 {
575 	int i, ret;
576 	struct ubiblock_param *p;
577 	struct ubi_volume_desc *desc;
578 	struct ubi_volume_info vi;
579 
580 	for (i = 0; i < ubiblock_devs; i++) {
581 		p = &ubiblock_param[i];
582 
583 		desc = open_volume_desc(p->name, p->ubi_num, p->vol_id);
584 		if (IS_ERR(desc)) {
585 			ubi_err("block: can't open volume, err=%ld\n",
586 				PTR_ERR(desc));
587 			ret = PTR_ERR(desc);
588 			break;
589 		}
590 
591 		ubi_get_volume_info(desc, &vi);
592 		ubi_close_volume(desc);
593 
594 		ret = ubiblock_create(&vi);
595 		if (ret) {
596 			ubi_err("block: can't add '%s' volume, err=%d\n",
597 				vi.name, ret);
598 			break;
599 		}
600 	}
601 	return ret;
602 }
603 
604 static void ubiblock_remove_all(void)
605 {
606 	struct ubiblock *next;
607 	struct ubiblock *dev;
608 
609 	list_for_each_entry_safe(dev, next, &ubiblock_devices, list) {
610 		/* Flush pending work and stop workqueue */
611 		destroy_workqueue(dev->wq);
612 		/* The module is being forcefully removed */
613 		WARN_ON(dev->desc);
614 		/* Remove from device list */
615 		list_del(&dev->list);
616 		ubiblock_cleanup(dev);
617 		kfree(dev);
618 	}
619 }
620 
621 int __init ubiblock_init(void)
622 {
623 	int ret;
624 
625 	ubiblock_major = register_blkdev(0, "ubiblock");
626 	if (ubiblock_major < 0)
627 		return ubiblock_major;
628 
629 	/* Attach block devices from 'block=' module param */
630 	ret = ubiblock_create_from_param();
631 	if (ret)
632 		goto err_remove;
633 
634 	/*
635 	 * Block devices are only created upon user requests, so we ignore
636 	 * existing volumes.
637 	 */
638 	ret = ubi_register_volume_notifier(&ubiblock_notifier, 1);
639 	if (ret)
640 		goto err_unreg;
641 	return 0;
642 
643 err_unreg:
644 	unregister_blkdev(ubiblock_major, "ubiblock");
645 err_remove:
646 	ubiblock_remove_all();
647 	return ret;
648 }
649 
650 void __exit ubiblock_exit(void)
651 {
652 	ubi_unregister_volume_notifier(&ubiblock_notifier);
653 	ubiblock_remove_all();
654 	unregister_blkdev(ubiblock_major, "ubiblock");
655 }
656