Lines Matching +full:mtd +full:- +full:name

2  * block2mtd.c - create an mtd from a block device
5 * Copyright (C) 2004-2006 Joern Engel <joern@wh.fh-wedel.de>
23 #include <linux/backing-dev.h>
28 #include <linux/mtd/mtd.h>
34 /* Maximum number of comma-separated items in the 'block2mtd=' parameter */
41 struct mtd_info mtd; member
46 /* Static info about the MTD, used in cleanup_module */
59 dev->bdev_handle->bdev->bd_inode->i_mapping; in _block2mtd_erase()
73 if (*p != -1UL) { in _block2mtd_erase()
83 pages--; in _block2mtd_erase()
88 static int block2mtd_erase(struct mtd_info *mtd, struct erase_info *instr) in block2mtd_erase() argument
90 struct block2mtd_dev *dev = mtd->priv; in block2mtd_erase()
91 size_t from = instr->addr; in block2mtd_erase()
92 size_t len = instr->len; in block2mtd_erase()
95 mutex_lock(&dev->write_mutex); in block2mtd_erase()
97 mutex_unlock(&dev->write_mutex); in block2mtd_erase()
105 static int block2mtd_read(struct mtd_info *mtd, loff_t from, size_t len, in block2mtd_read() argument
108 struct block2mtd_dev *dev = mtd->priv; in block2mtd_read()
110 dev->bdev_handle->bdev->bd_inode->i_mapping; in block2mtd_read()
113 int offset = from & (PAGE_SIZE-1); in block2mtd_read()
118 cpylen = PAGE_SIZE - offset; // multiple pages in block2mtd_read()
121 len = len - cpylen; in block2mtd_read()
146 dev->bdev_handle->bdev->bd_inode->i_mapping; in _block2mtd_write()
153 cpylen = PAGE_SIZE - offset; // multiple pages in _block2mtd_write()
156 len = len - cpylen; in _block2mtd_write()
182 static int block2mtd_write(struct mtd_info *mtd, loff_t to, size_t len, in block2mtd_write() argument
185 struct block2mtd_dev *dev = mtd->priv; in block2mtd_write()
188 mutex_lock(&dev->write_mutex); in block2mtd_write()
190 mutex_unlock(&dev->write_mutex); in block2mtd_write()
197 /* sync the device - wait until the write queue is empty */
198 static void block2mtd_sync(struct mtd_info *mtd) in block2mtd_sync() argument
200 struct block2mtd_dev *dev = mtd->priv; in block2mtd_sync()
201 sync_blockdev(dev->bdev_handle->bdev); in block2mtd_sync()
211 kfree(dev->mtd.name); in block2mtd_free_device()
213 if (dev->bdev_handle) { in block2mtd_free_device()
215 dev->bdev_handle->bdev->bd_inode->i_mapping, 0, -1); in block2mtd_free_device()
216 bdev_release(dev->bdev_handle); in block2mtd_free_device()
229 struct bdev_handle *bdev_handle = ERR_PTR(-ENODEV); in mdtblock_early_get_bdev()
241 * Try to resolve the device name by other means. in mdtblock_early_get_bdev()
250 * go-arounds. in mdtblock_early_get_bdev()
272 char *name; in add_device() local
290 dev->bdev_handle = bdev_handle; in add_device()
291 bdev = bdev_handle->bdev; in add_device()
293 if (MAJOR(bdev->bd_dev) == MTD_BLOCK_MAJOR) { in add_device()
294 pr_err("attempting to use an MTD device as a block device\n"); in add_device()
298 if ((long)bdev->bd_inode->i_size % erase_size) { in add_device()
303 mutex_init(&dev->write_mutex); in add_device()
305 /* Setup the MTD structure */ in add_device()
306 /* make the name contain the block device in */ in add_device()
308 name = kasprintf(GFP_KERNEL, "block2mtd: %s", devname); in add_device()
310 name = kstrdup(label, GFP_KERNEL); in add_device()
311 if (!name) in add_device()
314 dev->mtd.name = name; in add_device()
316 dev->mtd.size = bdev->bd_inode->i_size & PAGE_MASK; in add_device()
317 dev->mtd.erasesize = erase_size; in add_device()
318 dev->mtd.writesize = 1; in add_device()
319 dev->mtd.writebufsize = PAGE_SIZE; in add_device()
320 dev->mtd.type = MTD_RAM; in add_device()
321 dev->mtd.flags = MTD_CAP_RAM; in add_device()
322 dev->mtd._erase = block2mtd_erase; in add_device()
323 dev->mtd._write = block2mtd_write; in add_device()
324 dev->mtd._sync = block2mtd_sync; in add_device()
325 dev->mtd._read = block2mtd_read; in add_device()
326 dev->mtd.priv = dev; in add_device()
327 dev->mtd.owner = THIS_MODULE; in add_device()
329 if (mtd_device_register(&dev->mtd, NULL, 0)) { in add_device()
334 list_add(&dev->list, &blkmtd_device_list); in add_device()
335 pr_info("mtd%d: [%s] erase_size = %dKiB [%d]\n", in add_device()
336 dev->mtd.index, in add_device()
337 label ? label : dev->mtd.name + strlen("block2mtd: "), in add_device()
338 dev->mtd.erasesize >> 10, dev->mtd.erasesize); in add_device()
342 mutex_destroy(&dev->write_mutex); in add_device()
350 * allows some suffixes for a more human-readable number format:
351 * ki, Ki, kiB, KiB - multiply result with 1024
352 * Mi, MiB - multiply result with 1024^2
353 * Gi, GiB - multiply result with 1024^3
387 return -EINVAL; in parse_num()
410 /* 80 for device, 12 for erase size, 80 for name, 8 for timeout */ in block2mtd_setup2()
414 char *name; in block2mtd_setup2() local
441 name = token[0]; in block2mtd_setup2()
442 if (strlen(name) + 1 > 80) { in block2mtd_setup2()
443 pr_err("device name too long\n"); in block2mtd_setup2()
458 pr_info("Using custom MTD label '%s' for dev %s\n", label, name); in block2mtd_setup2()
461 add_device(name, erase_size, label, timeout); in block2mtd_setup2()
515 /* Remove the MTD devices */ in block2mtd_exit()
518 block2mtd_sync(&dev->mtd); in block2mtd_exit()
519 mtd_device_unregister(&dev->mtd); in block2mtd_exit()
520 mutex_destroy(&dev->write_mutex); in block2mtd_exit()
521 pr_info("mtd%d: [%s] removed\n", in block2mtd_exit()
522 dev->mtd.index, in block2mtd_exit()
523 dev->mtd.name + strlen("block2mtd: ")); in block2mtd_exit()
524 list_del(&dev->list); in block2mtd_exit()
534 MODULE_DESCRIPTION("Emulate an MTD using a block device");