~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

Linux Cross Reference
Linux-2.6.17/drivers/md/dm-linear.c

Version: ~ [ 2.6.16 ] ~ [ 2.6.17 ] ~
Architecture: ~ [ ia64 ] ~ [ i386 ] ~ [ arm ] ~ [ ppc ] ~ [ sparc64 ] ~

  1 /*
  2  * Copyright (C) 2001-2003 Sistina Software (UK) Limited.
  3  *
  4  * This file is released under the GPL.
  5  */
  6 
  7 #include "dm.h"
  8 
  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>
 14 
 15 /*
 16  * Linear: maps a linear range of a device.
 17  */
 18 struct linear_c {
 19         struct dm_dev *dev;
 20         sector_t start;
 21 };
 22 
 23 /*
 24  * Construct a linear mapping: <dev_path> <offset>
 25  */
 26 static int linear_ctr(struct dm_target *ti, unsigned int argc, char **argv)
 27 {
 28         struct linear_c *lc;
 29         unsigned long long tmp;
 30 
 31         if (argc != 2) {
 32                 ti->error = "dm-linear: Invalid argument count";
 33                 return -EINVAL;
 34         }
 35 
 36         lc = kmalloc(sizeof(*lc), GFP_KERNEL);
 37         if (lc == NULL) {
 38                 ti->error = "dm-linear: Cannot allocate linear context";
 39                 return -ENOMEM;
 40         }
 41 
 42         if (sscanf(argv[1], "%llu", &tmp) != 1) {
 43                 ti->error = "dm-linear: Invalid device sector";
 44                 goto bad;
 45         }
 46         lc->start = tmp;
 47 
 48         if (dm_get_device(ti, argv[0], lc->start, ti->len,
 49                           dm_table_get_mode(ti->table), &lc->dev)) {
 50                 ti->error = "dm-linear: Device lookup failed";
 51                 goto bad;
 52         }
 53 
 54         ti->private = lc;
 55         return 0;
 56 
 57       bad:
 58         kfree(lc);
 59         return -EINVAL;
 60 }
 61 
 62 static void linear_dtr(struct dm_target *ti)
 63 {
 64         struct linear_c *lc = (struct linear_c *) ti->private;
 65 
 66         dm_put_device(ti, lc->dev);
 67         kfree(lc);
 68 }
 69 
 70 static int linear_map(struct dm_target *ti, struct bio *bio,
 71                       union map_info *map_context)
 72 {
 73         struct linear_c *lc = (struct linear_c *) ti->private;
 74 
 75         bio->bi_bdev = lc->dev->bdev;
 76         bio->bi_sector = lc->start + (bio->bi_sector - ti->begin);
 77 
 78         return 1;
 79 }
 80 
 81 static int linear_status(struct dm_target *ti, status_type_t type,
 82                          char *result, unsigned int maxlen)
 83 {
 84         struct linear_c *lc = (struct linear_c *) ti->private;
 85 
 86         switch (type) {
 87         case STATUSTYPE_INFO:
 88                 result[0] = '\0';
 89                 break;
 90 
 91         case STATUSTYPE_TABLE:
 92                 snprintf(result, maxlen, "%s %llu", lc->dev->name,
 93                                 (unsigned long long)lc->start);
 94                 break;
 95         }
 96         return 0;
 97 }
 98 
 99 static struct target_type linear_target = {
100         .name   = "linear",
101         .version= {1, 0, 1},
102         .module = THIS_MODULE,
103         .ctr    = linear_ctr,
104         .dtr    = linear_dtr,
105         .map    = linear_map,
106         .status = linear_status,
107 };
108 
109 int __init dm_linear_init(void)
110 {
111         int r = dm_register_target(&linear_target);
112 
113         if (r < 0)
114                 DMERR("linear: register failed %d", r);
115 
116         return r;
117 }
118 
119 void dm_linear_exit(void)
120 {
121         int r = dm_unregister_target(&linear_target);
122 
123         if (r < 0)
124                 DMERR("linear: unregister failed %d", r);
125 }
126 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

This page was automatically generated by the LXR engine.
Visit the LXR main site for more information.