aboutsummaryrefslogtreecommitdiffstats
path: root/ipc/compat.c
Commit message (Expand)AuthorAge
* fix logic error in ipc compat semctl()Alexander Graf2007-07-06
* Cap shmmax at INT_MAX in compat shminfoGuy Streeter2007-05-08
* [PATCH] Fix the size limit of compat space msgsizesuzuki2006-12-07
* Remove obsolete #include <linux/config.h>Jörn Engel2006-06-30
* [PATCH] sem2mutex: ipc, id.semIngo Molnar2006-03-26
* [PATCH] compat: be more consistent about [ug]id_tStephen Rothwell2005-09-07
* [PATCH] put_compat_shminfo() warning fixJesse Millan2005-07-07
* Linux-2.6.12-rc2v2.6.12-rc2Linus Torvalds2005-04-16
ton <akpm@osdl.org> 2006-03-27 04:17:48 -0500 committer Linus Torvalds <torvalds@g5.osdl.org> 2006-03-27 11:44:58 -0500 [PATCH] dm: remove SECTOR_FORMAT' href='/cgit/cgit.cgi/litmus-rt.git/commit/drivers/md/dm-linear.c?h=v2015.1&id=4ee218cd67b385759993a6c840ea45f0ee0a8b30'>4ee218cd67b3
1da177e4c3f4

72d9486169a2
1da177e4c3f4








4ee218cd67b3
1da177e4c3f4


4ee218cd67b3
1da177e4c3f4






433bcac56455
1da177e4c3f4















7bc3447b6921
1da177e4c3f4
7bc3447b6921







1da177e4c3f4

433bcac56455

7bc3447b6921





1da177e4c3f4
d2a7ad29a810
1da177e4c3f4












4ee218cd67b3

1da177e4c3f4




647b3d008415
ab17ffa440cb


633a08b81206
ab17ffa440cb

7bc3447b6921














af4874e03ed8




5dea271b6d87
af4874e03ed8

1da177e4c3f4

af4874e03ed8
1da177e4c3f4




ab17ffa440cb
7bc3447b6921
af4874e03ed8
1da177e4c3f4






72d9486169a2
1da177e4c3f4





10d3bd09a3c2
1da177e4c3f4
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171






                                                         




                         
                                
 

                              













                                                                           
                               

                        
                                                     








                                                                        
                                                 


                                                               
                        






                                                                    
                                   















                                                              
                                                                           
 







                                                                 

                                     

                                                                       





                                                            
 
                                 












                                                                  

                                                                  




                      
                                                               


                                                              
                                                                             

 














                                                                          




                                                                            
                                                         

 

                                           
                             




                                
                               
                               
                                                  






                                                   
                                               





                         
                                             
 
/*
 * Copyright (C) 2001-2003 Sistina Software (UK) Limited.
 *
 * This file is released under the GPL.
 */

#include "dm.h"
#include <linux/module.h>
#include <linux/init.h>
#include <linux/blkdev.h>
#include <linux/bio.h>
#include <linux/slab.h>
#include <linux/device-mapper.h>

#define DM_MSG_PREFIX "linear"

/*
 * Linear: maps a linear range of a device.
 */
struct linear_c {
	struct dm_dev *dev;
	sector_t start;
};

/*
 * Construct a linear mapping: <dev_path> <offset>
 */
static int linear_ctr(struct dm_target *ti, unsigned int argc, char **argv)
{
	struct linear_c *lc;
	unsigned long long tmp;

	if (argc != 2) {
		ti->error = "Invalid argument count";
		return -EINVAL;
	}

	lc = kmalloc(sizeof(*lc), GFP_KERNEL);
	if (lc == NULL) {
		ti->error = "dm-linear: Cannot allocate linear context";
		return -ENOMEM;
	}

	if (sscanf(argv[1], "%llu", &tmp) != 1) {
		ti->error = "dm-linear: Invalid device sector";
		goto bad;
	}
	lc->start = tmp;

	if (dm_get_device(ti, argv[0], lc->start, ti->len,
			  dm_table_get_mode(ti->table), &lc->dev)) {
		ti->error = "dm-linear: Device lookup failed";
		goto bad;
	}

	ti->num_flush_requests = 1;
	ti->private = lc;
	return 0;

      bad:
	kfree(lc);
	return -EINVAL;
}

static void linear_dtr(struct dm_target *ti)
{
	struct linear_c *lc = (struct linear_c *) ti->private;

	dm_put_device(ti, lc->dev);
	kfree(lc);
}

static sector_t linear_map_sector(struct dm_target *ti, sector_t bi_sector)
{
	struct linear_c *lc = ti->private;

	return lc->start + (bi_sector - ti->begin);
}

static void linear_map_bio(struct dm_target *ti, struct bio *bio)
{
	struct linear_c *lc = ti->private;

	bio->bi_bdev = lc->dev->bdev;
	if (bio_sectors(bio))
		bio->bi_sector = linear_map_sector(ti, bio->bi_sector);
}

static int linear_map(struct dm_target *ti, struct bio *bio,
		      union map_info *map_context)
{
	linear_map_bio(ti, bio);

	return DM_MAPIO_REMAPPED;
}

static int linear_status(struct dm_target *ti, status_type_t type,
			 char *result, unsigned int maxlen)
{
	struct linear_c *lc = (struct linear_c *) ti->private;

	switch (type) {
	case STATUSTYPE_INFO:
		result[0] = '\0';
		break;

	case STATUSTYPE_TABLE:
		snprintf(result, maxlen, "%s %llu", lc->dev->name,
				(unsigned long long)lc->start);
		break;
	}
	return 0;
}

static int linear_ioctl(struct dm_target *ti, unsigned int cmd,
			unsigned long arg)
{
	struct linear_c *lc = (struct linear_c *) ti->private;
	return __blkdev_driver_ioctl(lc->dev->bdev, lc->dev->mode, cmd, arg);
}

static int linear_merge(struct dm_target *ti, struct bvec_merge_data *bvm,
			struct bio_vec *biovec, int max_size)
{
	struct linear_c *lc = ti->private;
	struct request_queue *q = bdev_get_queue(lc->dev->bdev);

	if (!q->merge_bvec_fn)
		return max_size;

	bvm->bi_bdev = lc->dev->bdev;
	bvm->bi_sector = linear_map_sector(ti, bvm->bi_sector);

	return min(max_size, q->merge_bvec_fn(q, bvm, biovec));
}

static int linear_iterate_devices(struct dm_target *ti,
				  iterate_devices_callout_fn fn, void *data)
{
	struct linear_c *lc = ti->private;

	return fn(ti, lc->dev, lc->start, ti->len, data);
}

static struct target_type linear_target = {
	.name   = "linear",
	.version = {1, 1, 0},
	.module = THIS_MODULE,
	.ctr    = linear_ctr,
	.dtr    = linear_dtr,
	.map    = linear_map,
	.status = linear_status,
	.ioctl  = linear_ioctl,
	.merge  = linear_merge,
	.iterate_devices = linear_iterate_devices,
};

int __init dm_linear_init(void)
{
	int r = dm_register_target(&linear_target);

	if (r < 0)
		DMERR("register failed %d", r);

	return r;
}

void dm_linear_exit(void)
{
	dm_unregister_target(&linear_target);
}