Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 30333
b: refs/heads/master
c: c51c275
h: refs/heads/master
i:
  30331: f1520bc
v: v3
  • Loading branch information
Alasdair G Kergon authored and Linus Torvalds committed Jun 26, 2006
1 parent 52f1d34 commit a6be5cc
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 27 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: b877a96409a3a99f2ce27b3c6473c9b28298ac7c
refs/heads/master: c51c2752491e5e771de6c8861a85ba46752d7888
65 changes: 42 additions & 23 deletions trunk/drivers/md/dm-exception-store.c
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,6 @@ struct pstore {
struct dm_snapshot *snap; /* up pointer to my snapshot */
int version;
int valid;
uint32_t chunk_size;
uint32_t exceptions_per_area;

/*
Expand Down Expand Up @@ -133,7 +132,7 @@ static int alloc_area(struct pstore *ps)
int r = -ENOMEM;
size_t len;

len = ps->chunk_size << SECTOR_SHIFT;
len = ps->snap->chunk_size << SECTOR_SHIFT;

/*
* Allocate the chunk_size block of memory that will hold
Expand All @@ -160,8 +159,8 @@ static int chunk_io(struct pstore *ps, uint32_t chunk, int rw)
unsigned long bits;

where.bdev = ps->snap->cow->bdev;
where.sector = ps->chunk_size * chunk;
where.count = ps->chunk_size;
where.sector = ps->snap->chunk_size * chunk;
where.count = ps->snap->chunk_size;

return dm_io_sync_vm(1, &where, rw, ps->area, &bits);
}
Expand All @@ -188,14 +187,15 @@ static int area_io(struct pstore *ps, uint32_t area, int rw)

static int zero_area(struct pstore *ps, uint32_t area)
{
memset(ps->area, 0, ps->chunk_size << SECTOR_SHIFT);
memset(ps->area, 0, ps->snap->chunk_size << SECTOR_SHIFT);
return area_io(ps, area, WRITE);
}

static int read_header(struct pstore *ps, int *new_snapshot)
{
int r;
struct disk_header *dh;
chunk_t chunk_size;

r = chunk_io(ps, 0, READ);
if (r)
Expand All @@ -210,8 +210,29 @@ static int read_header(struct pstore *ps, int *new_snapshot)
*new_snapshot = 0;
ps->valid = le32_to_cpu(dh->valid);
ps->version = le32_to_cpu(dh->version);
ps->chunk_size = le32_to_cpu(dh->chunk_size);

chunk_size = le32_to_cpu(dh->chunk_size);
if (ps->snap->chunk_size != chunk_size) {
DMWARN("chunk size %llu in device metadata overrides "
"table chunk size of %llu.",
(unsigned long long)chunk_size,
(unsigned long long)ps->snap->chunk_size);

/* We had a bogus chunk_size. Fix stuff up. */
dm_io_put(sectors_to_pages(ps->snap->chunk_size));
free_area(ps);

ps->snap->chunk_size = chunk_size;
ps->snap->chunk_mask = chunk_size - 1;
ps->snap->chunk_shift = ffs(chunk_size) - 1;

r = alloc_area(ps);
if (r)
return r;

r = dm_io_get(sectors_to_pages(chunk_size));
if (r)
return r;
}
} else {
DMWARN("Invalid/corrupt snapshot");
r = -ENXIO;
Expand All @@ -224,13 +245,13 @@ static int write_header(struct pstore *ps)
{
struct disk_header *dh;

memset(ps->area, 0, ps->chunk_size << SECTOR_SHIFT);
memset(ps->area, 0, ps->snap->chunk_size << SECTOR_SHIFT);

dh = (struct disk_header *) ps->area;
dh->magic = cpu_to_le32(SNAP_MAGIC);
dh->valid = cpu_to_le32(ps->valid);
dh->version = cpu_to_le32(ps->version);
dh->chunk_size = cpu_to_le32(ps->chunk_size);
dh->chunk_size = cpu_to_le32(ps->snap->chunk_size);

return chunk_io(ps, 0, WRITE);
}
Expand Down Expand Up @@ -365,7 +386,7 @@ static void persistent_destroy(struct exception_store *store)
{
struct pstore *ps = get_info(store);

dm_io_put(sectors_to_pages(ps->chunk_size));
dm_io_put(sectors_to_pages(ps->snap->chunk_size));
vfree(ps->callbacks);
free_area(ps);
kfree(ps);
Expand All @@ -383,6 +404,16 @@ static int persistent_read_metadata(struct exception_store *store)
if (r)
return r;

/*
* Now we know correct chunk_size, complete the initialisation.
*/
ps->exceptions_per_area = (ps->snap->chunk_size << SECTOR_SHIFT) /
sizeof(struct disk_exception);
ps->callbacks = dm_vcalloc(ps->exceptions_per_area,
sizeof(*ps->callbacks));
if (!ps->callbacks)
return -ENOMEM;

/*
* Do we need to setup a new snapshot ?
*/
Expand Down Expand Up @@ -533,28 +564,16 @@ int dm_create_persistent(struct exception_store *store, uint32_t chunk_size)
ps->snap = store->snap;
ps->valid = 1;
ps->version = SNAPSHOT_DISK_VERSION;
ps->chunk_size = chunk_size;
ps->exceptions_per_area = (chunk_size << SECTOR_SHIFT) /
sizeof(struct disk_exception);
ps->next_free = 2; /* skipping the header and first area */
ps->current_committed = 0;

r = alloc_area(ps);
if (r)
goto bad;

/*
* Allocate space for all the callbacks.
*/
ps->callback_count = 0;
atomic_set(&ps->pending_count, 0);
ps->callbacks = dm_vcalloc(ps->exceptions_per_area,
sizeof(*ps->callbacks));

if (!ps->callbacks) {
r = -ENOMEM;
goto bad;
}
ps->callbacks = NULL;

store->destroy = persistent_destroy;
store->read_metadata = persistent_read_metadata;
Expand Down
6 changes: 3 additions & 3 deletions trunk/drivers/md/dm-snap.c
Original file line number Diff line number Diff line change
Expand Up @@ -530,7 +530,7 @@ static int snapshot_ctr(struct dm_target *ti, unsigned int argc, char **argv)
}

ti->private = s;
ti->split_io = chunk_size;
ti->split_io = s->chunk_size;

return 0;

Expand Down Expand Up @@ -1204,7 +1204,7 @@ static int origin_status(struct dm_target *ti, status_type_t type, char *result,

static struct target_type origin_target = {
.name = "snapshot-origin",
.version = {1, 1, 0},
.version = {1, 4, 0},
.module = THIS_MODULE,
.ctr = origin_ctr,
.dtr = origin_dtr,
Expand All @@ -1215,7 +1215,7 @@ static struct target_type origin_target = {

static struct target_type snapshot_target = {
.name = "snapshot",
.version = {1, 1, 0},
.version = {1, 4, 0},
.module = THIS_MODULE,
.ctr = snapshot_ctr,
.dtr = snapshot_dtr,
Expand Down

0 comments on commit a6be5cc

Please sign in to comment.