2  * Copyright (C) 2001-2003 Sistina Software (UK) Limited.
 
   4  * This file is released under the GPL.
 
   9 #include <linux/module.h>
 
  10 #include <linux/init.h>
 
  11 #include <linux/blkdev.h>
 
  12 #include <linux/bio.h>
 
  13 #include <linux/slab.h>
 
  16  * Linear: maps a linear range of a device.
 
  24  * Construct a linear mapping: <dev_path> <offset>
 
  26 static int linear_ctr(struct dm_target *ti, unsigned int argc, char **argv)
 
  31                 ti->error = "dm-linear: Invalid argument count";
 
  35         lc = kmalloc(sizeof(*lc), GFP_KERNEL);
 
  37                 ti->error = "dm-linear: Cannot allocate linear context";
 
  41         if (sscanf(argv[1], SECTOR_FORMAT, &lc->start) != 1) {
 
  42                 ti->error = "dm-linear: Invalid device sector";
 
  46         if (dm_get_device(ti, argv[0], lc->start, ti->len,
 
  47                           dm_table_get_mode(ti->table), &lc->dev)) {
 
  48                 ti->error = "dm-linear: Device lookup failed";
 
  60 static void linear_dtr(struct dm_target *ti)
 
  62         struct linear_c *lc = (struct linear_c *) ti->private;
 
  64         dm_put_device(ti, lc->dev);
 
  68 static int linear_map(struct dm_target *ti, struct bio *bio,
 
  69                       union map_info *map_context)
 
  71         struct linear_c *lc = (struct linear_c *) ti->private;
 
  73         bio->bi_bdev = lc->dev->bdev;
 
  74         bio->bi_sector = lc->start + (bio->bi_sector - ti->begin);
 
  79 static int linear_status(struct dm_target *ti, status_type_t type,
 
  80                          char *result, unsigned int maxlen)
 
  82         struct linear_c *lc = (struct linear_c *) ti->private;
 
  89         case STATUSTYPE_TABLE:
 
  90                 snprintf(result, maxlen, "%s " SECTOR_FORMAT, lc->dev->name,
 
  97 static struct target_type linear_target = {
 
 100         .module = THIS_MODULE,
 
 104         .status = linear_status,
 
 107 int __init dm_linear_init(void)
 
 109         int r = dm_register_target(&linear_target);
 
 112                 DMERR("linear: register failed %d", r);
 
 117 void dm_linear_exit(void)
 
 119         int r = dm_unregister_target(&linear_target);
 
 122                 DMERR("linear: unregister failed %d", r);