Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 985903bb authored by Mike Snitzer's avatar Mike Snitzer Committed by Alasdair G Kergon
Browse files

dm snapshot: add allocated metadata to snapshot status



Add number of sectors used by metadata to the end of the snapshot's status
line.

Renamed dm_exception_store_type's 'fraction_full' to 'usage'.  Renamed
arguments to be clearer about what is being returned.  Also added
'metadata_sectors'.

Signed-off-by: default avatarMike Snitzer <snitzer@redhat.com>
Signed-off-by: default avatarAlasdair G Kergon <agk@redhat.com>
parent 3510cb94
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -86,9 +86,9 @@ struct dm_exception_store_type {
	/*
	 * Return how full the snapshot is.
	 */
	void (*fraction_full) (struct dm_exception_store *store,
			       sector_t *numerator,
			       sector_t *denominator);
	void (*usage) (struct dm_exception_store *store,
		       sector_t *total_sectors, sector_t *sectors_allocated,
		       sector_t *metadata_sectors);

	/* For internal device-mapper use only. */
	struct list_head list;
+17 −6
Original line number Diff line number Diff line
@@ -489,11 +489,22 @@ static struct pstore *get_info(struct dm_exception_store *store)
	return (struct pstore *) store->context;
}

static void persistent_fraction_full(struct dm_exception_store *store,
				     sector_t *numerator, sector_t *denominator)
static void persistent_usage(struct dm_exception_store *store,
			     sector_t *total_sectors,
			     sector_t *sectors_allocated,
			     sector_t *metadata_sectors)
{
	*numerator = get_info(store)->next_free * store->chunk_size;
	*denominator = get_dev_size(store->cow->bdev);
	struct pstore *ps = get_info(store);

	*sectors_allocated = ps->next_free * store->chunk_size;
	*total_sectors = get_dev_size(store->cow->bdev);

	/*
	 * First chunk is the fixed header.
	 * Then there are (ps->current_area + 1) metadata chunks, each one
	 * separated from the next by ps->exceptions_per_area data chunks.
	 */
	*metadata_sectors = (ps->current_area + 2) * store->chunk_size;
}

static void persistent_dtr(struct dm_exception_store *store)
@@ -738,7 +749,7 @@ static struct dm_exception_store_type _persistent_type = {
	.prepare_exception = persistent_prepare_exception,
	.commit_exception = persistent_commit_exception,
	.drop_snapshot = persistent_drop_snapshot,
	.fraction_full = persistent_fraction_full,
	.usage = persistent_usage,
	.status = persistent_status,
};

@@ -751,7 +762,7 @@ static struct dm_exception_store_type _persistent_compat_type = {
	.prepare_exception = persistent_prepare_exception,
	.commit_exception = persistent_commit_exception,
	.drop_snapshot = persistent_drop_snapshot,
	.fraction_full = persistent_fraction_full,
	.usage = persistent_usage,
	.status = persistent_status,
};

+9 −6
Original line number Diff line number Diff line
@@ -59,11 +59,14 @@ static void transient_commit_exception(struct dm_exception_store *store,
	callback(callback_context, 1);
}

static void transient_fraction_full(struct dm_exception_store *store,
				    sector_t *numerator, sector_t *denominator)
static void transient_usage(struct dm_exception_store *store,
			    sector_t *total_sectors,
			    sector_t *sectors_allocated,
			    sector_t *metadata_sectors)
{
	*numerator = ((struct transient_c *) store->context)->next_free;
	*denominator = get_dev_size(store->cow->bdev);
	*sectors_allocated = ((struct transient_c *) store->context)->next_free;
	*total_sectors = get_dev_size(store->cow->bdev);
	*metadata_sectors = 0;
}

static int transient_ctr(struct dm_exception_store *store,
@@ -106,7 +109,7 @@ static struct dm_exception_store_type _transient_type = {
	.read_metadata = transient_read_metadata,
	.prepare_exception = transient_prepare_exception,
	.commit_exception = transient_commit_exception,
	.fraction_full = transient_fraction_full,
	.usage = transient_usage,
	.status = transient_status,
};

@@ -118,7 +121,7 @@ static struct dm_exception_store_type _transient_compat_type = {
	.read_metadata = transient_read_metadata,
	.prepare_exception = transient_prepare_exception,
	.commit_exception = transient_commit_exception,
	.fraction_full = transient_fraction_full,
	.usage = transient_usage,
	.status = transient_status,
};

+12 −9
Original line number Diff line number Diff line
@@ -1174,14 +1174,17 @@ static int snapshot_status(struct dm_target *ti, status_type_t type,
		if (!snap->valid)
			DMEMIT("Invalid");
		else {
			if (snap->store->type->fraction_full) {
				sector_t numerator, denominator;
				snap->store->type->fraction_full(snap->store,
								 &numerator,
								 &denominator);
				DMEMIT("%llu/%llu",
				       (unsigned long long)numerator,
				       (unsigned long long)denominator);
			if (snap->store->type->usage) {
				sector_t total_sectors, sectors_allocated,
					 metadata_sectors;
				snap->store->type->usage(snap->store,
							 &total_sectors,
							 &sectors_allocated,
							 &metadata_sectors);
				DMEMIT("%llu/%llu %llu",
				       (unsigned long long)sectors_allocated,
				       (unsigned long long)total_sectors,
				       (unsigned long long)metadata_sectors);
			}
			else
				DMEMIT("Unknown");
@@ -1462,7 +1465,7 @@ static struct target_type origin_target = {

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