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

Commit eb04cf63 authored by Joe Thornber's avatar Joe Thornber Committed by Alasdair G Kergon
Browse files

dm thin metadata: stop tracking need for commit



Remove an optimisation that tracks whether or not a thin metadata commit
is needed.

If dm_pool_commit_metadata() is called and no changes have been made
to the metadata then this optimisation avoided writing to disk.

Removing because we're going to do something better later.

Signed-off-by: default avatarJoe Thornber <ejt@redhat.com>
Signed-off-by: default avatarMike Snitzer <snitzer@redhat.com>
Signed-off-by: default avatarAlasdair G Kergon <agk@redhat.com>
parent 51a0f659
Loading
Loading
Loading
Loading
+2 −38
Original line number Original line Diff line number Diff line
@@ -178,7 +178,6 @@ struct dm_pool_metadata {


	struct rw_semaphore root_lock;
	struct rw_semaphore root_lock;
	uint32_t time;
	uint32_t time;
	int need_commit;
	dm_block_t root;
	dm_block_t root;
	dm_block_t details_root;
	dm_block_t details_root;
	struct list_head thin_devices;
	struct list_head thin_devices;
@@ -479,7 +478,6 @@ static int init_pmd(struct dm_pool_metadata *pmd,


	init_rwsem(&pmd->root_lock);
	init_rwsem(&pmd->root_lock);
	pmd->time = 0;
	pmd->time = 0;
	pmd->need_commit = 0;
	pmd->details_root = 0;
	pmd->details_root = 0;
	pmd->trans_id = 0;
	pmd->trans_id = 0;
	pmd->flags = 0;
	pmd->flags = 0;
@@ -503,11 +501,6 @@ static int __begin_transaction(struct dm_pool_metadata *pmd)
	struct thin_disk_superblock *disk_super;
	struct thin_disk_superblock *disk_super;
	struct dm_block *sblock;
	struct dm_block *sblock;


	/*
	 * __maybe_commit_transaction() resets these
	 */
	WARN_ON(pmd->need_commit);

	/*
	/*
	 * We re-read the superblock every time.  Shouldn't need to do this
	 * We re-read the superblock every time.  Shouldn't need to do this
	 * really.
	 * really.
@@ -583,8 +576,6 @@ static int __write_changed_details(struct dm_pool_metadata *pmd)
			list_del(&td->list);
			list_del(&td->list);
			kfree(td);
			kfree(td);
		}
		}

		pmd->need_commit = 1;
	}
	}


	return 0;
	return 0;
@@ -609,9 +600,6 @@ static int __commit_transaction(struct dm_pool_metadata *pmd)
	if (r < 0)
	if (r < 0)
		return r;
		return r;


	if (!pmd->need_commit)
		return r;

	r = dm_sm_commit(pmd->data_sm);
	r = dm_sm_commit(pmd->data_sm);
	if (r < 0)
	if (r < 0)
		return r;
		return r;
@@ -650,11 +638,7 @@ static int __commit_transaction(struct dm_pool_metadata *pmd)
	if (r < 0)
	if (r < 0)
		goto out_locked;
		goto out_locked;


	r = dm_tm_commit(pmd->tm, sblock);
	return dm_tm_commit(pmd->tm, sblock);
	if (!r)
		pmd->need_commit = 0;

	return r;


out_locked:
out_locked:
	dm_bm_unlock(sblock);
	dm_bm_unlock(sblock);
@@ -744,7 +728,6 @@ struct dm_pool_metadata *dm_pool_metadata_open(struct block_device *bdev,
	}
	}


	pmd->flags = 0;
	pmd->flags = 0;
	pmd->need_commit = 1;
	r = dm_pool_commit_metadata(pmd);
	r = dm_pool_commit_metadata(pmd);
	if (r < 0) {
	if (r < 0) {
		DMERR("%s: dm_pool_commit_metadata() failed, error = %d",
		DMERR("%s: dm_pool_commit_metadata() failed, error = %d",
@@ -1042,8 +1025,6 @@ static int __delete_device(struct dm_pool_metadata *pmd, dm_thin_id dev)
	if (r)
	if (r)
		return r;
		return r;


	pmd->need_commit = 1;

	return 0;
	return 0;
}
}


@@ -1071,7 +1052,6 @@ int dm_pool_set_metadata_transaction_id(struct dm_pool_metadata *pmd,
	}
	}


	pmd->trans_id = new_id;
	pmd->trans_id = new_id;
	pmd->need_commit = 1;
	up_write(&pmd->root_lock);
	up_write(&pmd->root_lock);


	return 0;
	return 0;
@@ -1113,8 +1093,6 @@ static int __reserve_metadata_snap(struct dm_pool_metadata *pmd)


		dm_tm_dec(pmd->tm, held_root);
		dm_tm_dec(pmd->tm, held_root);
		dm_tm_unlock(pmd->tm, copy);
		dm_tm_unlock(pmd->tm, copy);
		pmd->need_commit = 1;

		return -EBUSY;
		return -EBUSY;
	}
	}


@@ -1140,16 +1118,12 @@ static int __reserve_metadata_snap(struct dm_pool_metadata *pmd)
			     &sb_validator, &sblock);
			     &sb_validator, &sblock);
	if (r) {
	if (r) {
		dm_tm_dec(pmd->tm, held_root);
		dm_tm_dec(pmd->tm, held_root);
		pmd->need_commit = 1;
		return r;
		return r;
	}
	}


	disk_super = dm_block_data(sblock);
	disk_super = dm_block_data(sblock);
	disk_super->held_root = cpu_to_le64(held_root);
	disk_super->held_root = cpu_to_le64(held_root);
	dm_bm_unlock(sblock);
	dm_bm_unlock(sblock);

	pmd->need_commit = 1;

	return 0;
	return 0;
}
}


@@ -1179,7 +1153,6 @@ static int __release_metadata_snap(struct dm_pool_metadata *pmd)
	disk_super = dm_block_data(sblock);
	disk_super = dm_block_data(sblock);
	held_root = le64_to_cpu(disk_super->held_root);
	held_root = le64_to_cpu(disk_super->held_root);
	disk_super->held_root = cpu_to_le64(0);
	disk_super->held_root = cpu_to_le64(0);
	pmd->need_commit = 1;


	dm_bm_unlock(sblock);
	dm_bm_unlock(sblock);


@@ -1317,7 +1290,6 @@ static int __insert(struct dm_thin_device *td, dm_block_t block,
	struct dm_pool_metadata *pmd = td->pmd;
	struct dm_pool_metadata *pmd = td->pmd;
	dm_block_t keys[2] = { td->id, block };
	dm_block_t keys[2] = { td->id, block };


	pmd->need_commit = 1;
	value = cpu_to_le64(pack_block_time(data_block, pmd->time));
	value = cpu_to_le64(pack_block_time(data_block, pmd->time));
	__dm_bless_for_disk(&value);
	__dm_bless_for_disk(&value);


@@ -1358,7 +1330,6 @@ static int __remove(struct dm_thin_device *td, dm_block_t block)


	td->mapped_blocks--;
	td->mapped_blocks--;
	td->changed = 1;
	td->changed = 1;
	pmd->need_commit = 1;


	return 0;
	return 0;
}
}
@@ -1379,10 +1350,7 @@ int dm_pool_alloc_data_block(struct dm_pool_metadata *pmd, dm_block_t *result)
	int r;
	int r;


	down_write(&pmd->root_lock);
	down_write(&pmd->root_lock);

	r = dm_sm_new_block(pmd->data_sm, result);
	r = dm_sm_new_block(pmd->data_sm, result);
	pmd->need_commit = 1;

	up_write(&pmd->root_lock);
	up_write(&pmd->root_lock);


	return r;
	return r;
@@ -1519,11 +1487,7 @@ static int __resize_data_dev(struct dm_pool_metadata *pmd, dm_block_t new_count)
		return -EINVAL;
		return -EINVAL;
	}
	}


	r = dm_sm_extend(pmd->data_sm, new_count - old_count);
	return dm_sm_extend(pmd->data_sm, new_count - old_count);
	if (!r)
		pmd->need_commit = 1;

	return r;
}
}


int dm_pool_resize_data_dev(struct dm_pool_metadata *pmd, dm_block_t new_count)
int dm_pool_resize_data_dev(struct dm_pool_metadata *pmd, dm_block_t new_count)