git://git.onelab.eu
/
linux-2.6.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
vserver 1.9.5.x5
[linux-2.6.git]
/
drivers
/
md
/
dm-raid1.c
diff --git
a/drivers/md/dm-raid1.c
b/drivers/md/dm-raid1.c
index
843e9b8
..
1fb4dfb
100644
(file)
--- a/
drivers/md/dm-raid1.c
+++ b/
drivers/md/dm-raid1.c
@@
-67,7
+67,7
@@
static inline void wake(void)
struct mirror_set;
struct region_hash {
struct mirror_set *ms;
struct mirror_set;
struct region_hash {
struct mirror_set *ms;
-
sector
_t region_size;
+
uint32
_t region_size;
unsigned region_shift;
/* holds persistent region state */
unsigned region_shift;
/* holds persistent region state */
@@
-135,7
+135,7
@@
static void region_free(void *element, void *pool_data)
#define MIN_REGIONS 64
#define MAX_RECOVERY 1
static int rh_init(struct region_hash *rh, struct mirror_set *ms,
#define MIN_REGIONS 64
#define MAX_RECOVERY 1
static int rh_init(struct region_hash *rh, struct mirror_set *ms,
- struct dirty_log *log,
sector
_t region_size,
+ struct dirty_log *log,
uint32
_t region_size,
region_t nr_regions)
{
unsigned int nr_buckets, max_buckets;
region_t nr_regions)
{
unsigned int nr_buckets, max_buckets;
@@
-253,9
+253,9
@@
static struct region *__rh_alloc(struct region_hash *rh, region_t region)
else {
__rh_insert(rh, nreg);
if (nreg->state == RH_CLEAN) {
else {
__rh_insert(rh, nreg);
if (nreg->state == RH_CLEAN) {
- spin_lock
_irq
(&rh->region_lock);
+ spin_lock(&rh->region_lock);
list_add(&nreg->list, &rh->clean_regions);
list_add(&nreg->list, &rh->clean_regions);
- spin_unlock
_irq
(&rh->region_lock);
+ spin_unlock(&rh->region_lock);
}
reg = nreg;
}
}
reg = nreg;
}
@@
-602,7
+602,7
@@
static int recover(struct mirror_set *ms, struct region *reg)
{
int r;
unsigned int i;
{
int r;
unsigned int i;
- struct io_region from, to[
ms->nr_mirrors - 1
], *dest;
+ struct io_region from, to[
KCOPYD_MAX_REGIONS
], *dest;
struct mirror *m;
unsigned long flags = 0;
struct mirror *m;
unsigned long flags = 0;
@@
-757,7
+757,7
@@
static void write_callback(unsigned long error, void *context)
static void do_write(struct mirror_set *ms, struct bio *bio)
{
unsigned int i;
static void do_write(struct mirror_set *ms, struct bio *bio)
{
unsigned int i;
- struct io_region io[
ms->nr_mirrors
];
+ struct io_region io[
KCOPYD_MAX_REGIONS+1
];
struct mirror *m;
for (i = 0; i < ms->nr_mirrors; i++) {
struct mirror *m;
for (i = 0; i < ms->nr_mirrors; i++) {
@@
-871,7
+871,7
@@
static void do_work(void *ignored)
* Target functions
*---------------------------------------------------------------*/
static struct mirror_set *alloc_context(unsigned int nr_mirrors,
* Target functions
*---------------------------------------------------------------*/
static struct mirror_set *alloc_context(unsigned int nr_mirrors,
-
sector
_t region_size,
+
uint32
_t region_size,
struct dm_target *ti,
struct dirty_log *dl)
{
struct dm_target *ti,
struct dirty_log *dl)
{
@@
-894,7
+894,7
@@
static struct mirror_set *alloc_context(unsigned int nr_mirrors,
ms->ti = ti;
ms->nr_mirrors = nr_mirrors;
ms->ti = ti;
ms->nr_mirrors = nr_mirrors;
- ms->nr_regions = dm_div_up(ti->len, region_size);
+ ms->nr_regions = dm_
sector_
div_up(ti->len, region_size);
ms->in_sync = 0;
if (rh_init(&ms->rh, ms, dl, region_size, ms->nr_regions)) {
ms->in_sync = 0;
if (rh_init(&ms->rh, ms, dl, region_size, ms->nr_regions)) {
@@
-916,7
+916,7
@@
static void free_context(struct mirror_set *ms, struct dm_target *ti,
kfree(ms);
}
kfree(ms);
}
-static inline int _check_region_size(struct dm_target *ti,
sector
_t size)
+static inline int _check_region_size(struct dm_target *ti,
uint32
_t size)
{
return !(size % (PAGE_SIZE >> 9) || (size & (size - 1)) ||
size > ti->len);
{
return !(size % (PAGE_SIZE >> 9) || (size & (size - 1)) ||
size > ti->len);
@@
-1009,8
+1009,8
@@
static struct dirty_log *create_dirty_log(struct dm_target *ti,
* log_type #log_params <log_params>
* #mirrors [mirror_path offset]{2,}
*
* log_type #log_params <log_params>
* #mirrors [mirror_path offset]{2,}
*
- *
For now, #log_params = 1, log_type = "core
"
- *
+ *
log_type is "core" or "disk
"
+ *
#log_params is between 1 and 3
*/
#define DM_IO_PAGES 64
static int mirror_ctr(struct dm_target *ti, unsigned int argc, char **argv)
*/
#define DM_IO_PAGES 64
static int mirror_ctr(struct dm_target *ti, unsigned int argc, char **argv)
@@
-1028,7
+1028,7
@@
static int mirror_ctr(struct dm_target *ti, unsigned int argc, char **argv)
argc -= args_used;
if (!argc || sscanf(argv[0], "%u", &nr_mirrors) != 1 ||
argc -= args_used;
if (!argc || sscanf(argv[0], "%u", &nr_mirrors) != 1 ||
- nr_mirrors < 2) {
+ nr_mirrors < 2
|| nr_mirrors > KCOPYD_MAX_REGIONS + 1
) {
ti->error = "dm-mirror: Invalid number of mirrors";
dm_destroy_dirty_log(dl);
return -EINVAL;
ti->error = "dm-mirror: Invalid number of mirrors";
dm_destroy_dirty_log(dl);
return -EINVAL;
@@
-1158,10
+1158,11
@@
static int mirror_end_io(struct dm_target *ti, struct bio *bio,
return 0;
}
return 0;
}
-static void mirror_suspend(struct dm_target *ti)
+static void mirror_
post
suspend(struct dm_target *ti)
{
struct mirror_set *ms = (struct mirror_set *) ti->private;
struct dirty_log *log = ms->rh.log;
{
struct mirror_set *ms = (struct mirror_set *) ti->private;
struct dirty_log *log = ms->rh.log;
+
rh_stop_recovery(&ms->rh);
if (log->type->suspend && log->type->suspend(log))
/* FIXME: need better error handling */
rh_stop_recovery(&ms->rh);
if (log->type->suspend && log->type->suspend(log))
/* FIXME: need better error handling */
@@
-1182,35
+1183,30
@@
static int mirror_status(struct dm_target *ti, status_type_t type,
char *result, unsigned int maxlen)
{
char buffer[32];
char *result, unsigned int maxlen)
{
char buffer[32];
- unsigned int m, sz
= 0
;
+ unsigned int m, sz;
struct mirror_set *ms = (struct mirror_set *) ti->private;
struct mirror_set *ms = (struct mirror_set *) ti->private;
-#define EMIT(x...) sz += ((sz >= maxlen) ? \
- 0 : scnprintf(result + sz, maxlen - sz, x))
+ sz = ms->rh.log->type->status(ms->rh.log, type, result, maxlen);
switch (type) {
case STATUSTYPE_INFO:
switch (type) {
case STATUSTYPE_INFO:
- EMIT("%d ", ms->nr_mirrors);
-
+ DMEMIT("%d ", ms->nr_mirrors);
for (m = 0; m < ms->nr_mirrors; m++) {
format_dev_t(buffer, ms->mirror[m].dev->bdev->bd_dev);
for (m = 0; m < ms->nr_mirrors; m++) {
format_dev_t(buffer, ms->mirror[m].dev->bdev->bd_dev);
- EMIT("%s ", buffer);
+
DM
EMIT("%s ", buffer);
}
}
- EMIT(SECTOR_FORMAT "/" SECTOR_FORMAT,
- ms->rh.log->type->get_sync_count(ms->rh.log),
- ms->nr_regions);
+
DM
EMIT(SECTOR_FORMAT "/" SECTOR_FORMAT,
+
ms->rh.log->type->get_sync_count(ms->rh.log),
+
ms->nr_regions);
break;
case STATUSTYPE_TABLE:
break;
case STATUSTYPE_TABLE:
- EMIT("%s 1 " SECTOR_FORMAT " %d ",
- ms->rh.log->type->name, ms->rh.region_size,
- ms->nr_mirrors);
-
+ DMEMIT("%d ", ms->nr_mirrors);
for (m = 0; m < ms->nr_mirrors; m++) {
format_dev_t(buffer, ms->mirror[m].dev->bdev->bd_dev);
for (m = 0; m < ms->nr_mirrors; m++) {
format_dev_t(buffer, ms->mirror[m].dev->bdev->bd_dev);
- EMIT("%s " SECTOR_FORMAT " ",
- buffer, ms->mirror[m].offset);
+
DM
EMIT("%s " SECTOR_FORMAT " ",
+
buffer, ms->mirror[m].offset);
}
}
}
}
@@
-1225,7
+1221,7
@@
static struct target_type mirror_target = {
.dtr = mirror_dtr,
.map = mirror_map,
.end_io = mirror_end_io,
.dtr = mirror_dtr,
.map = mirror_map,
.end_io = mirror_end_io,
- .
suspend = mirror_
suspend,
+ .
postsuspend = mirror_post
suspend,
.resume = mirror_resume,
.status = mirror_status,
};
.resume = mirror_resume,
.status = mirror_status,
};